diff options
| author | Ginger Bill <bill@gingerbill.org> | 2016-12-16 11:31:08 +0000 |
|---|---|---|
| committer | Ginger Bill <bill@gingerbill.org> | 2016-12-16 11:31:08 +0000 |
| commit | f5679832608c93e8ebc2004ffd92fbe174450a01 (patch) | |
| tree | f7f314d6305f9f92fb72a67db4afa1cff22aa3de | |
| parent | ad843141439fc101709dc234c289d5d6d4676aaf (diff) | |
Semicolons mandatory again (and probably forever now...)
| -rw-r--r-- | README.md | 34 | ||||
| -rw-r--r-- | build.bat | 20 | ||||
| -rw-r--r-- | code/demo.odin | 59 | ||||
| -rw-r--r-- | core/_preload.odin | 272 | ||||
| -rw-r--r-- | core/_soft_numbers.odin | 2 | ||||
| -rw-r--r-- | core/fmt.odin | 528 | ||||
| -rw-r--r-- | core/hash.odin | 192 | ||||
| -rw-r--r-- | core/math.odin | 404 | ||||
| -rw-r--r-- | core/mem.odin | 280 | ||||
| -rw-r--r-- | core/opengl.odin | 226 | ||||
| -rw-r--r-- | core/opengl_constants.odin | 2731 | ||||
| -rw-r--r-- | core/os_windows.odin | 161 | ||||
| -rw-r--r-- | core/utf8.odin | 190 | ||||
| -rw-r--r-- | core/win32.odin | 524 | ||||
| -rw-r--r-- | roadmap.md | 29 | ||||
| -rw-r--r-- | src/checker/checker.c | 17 | ||||
| -rw-r--r-- | src/checker/stmt.c | 9 | ||||
| -rw-r--r-- | src/parser.c | 47 | ||||
| -rw-r--r-- | src/tokenizer.c | 103 |
19 files changed, 2628 insertions, 3200 deletions
@@ -30,27 +30,27 @@ Odin is fast, concise, readable, pragmatic and open sourced. It is designed with ## Warnings * This is still highly in development and the language's design is quite volatile. -* Syntax is not fixed. +* Syntax is definitely not fixed ## Roadmap Not in any particular order -* Compile Time Execution (CTE) - - More metaprogramming madness - - Compiler as a library - - AST inspection and modification -* CTE-based build system -* Replace LLVM backend with my own custom backend -* Improve SSA design to accommodate for lowering to a "bytecode" -* SSA optimizations -* Parametric Polymorphism ("Generics") -* Documentation Generator for "Entities" -* Multiple Architecture support -* Language level atomics and concurrency support -* Debug Information +* Custom backend to replace LLVM + - Improve SSA design to accommodate for lowering to a "bytecode" + - SSA optimizations + - COFF generation + - linker +* Type safe "macros" +* Documentation generator for "Entities" +* Multiple architecture support +* Inline assembly +* Linking options + - Executable + - Static/Dynamic Library +* Debug information - pdb format too -* Command Line Tooling -* Compiler Internals: +* Command line tooling +* Compiler internals: - Big numbers library - - Multithreading for performance increase + @@ -4,9 +4,9 @@ set exe_name=odin.exe :: Debug = 0, Release = 1 -set release_mode=1 +set release_mode=0 -set compiler_flags= -nologo -Oi -TC -W4 -fp:fast -fp:except- -Gm- -MP -FC -GS- -EHsc- -GR- +set compiler_flags= -nologo -Oi -TC -fp:fast -fp:except- -Gm- -MP -FC -GS- -EHsc- -GR- if %release_mode% EQU 0 ( rem Debug set compiler_flags=%compiler_flags% -Od -MDd -Z7 @@ -16,7 +16,7 @@ if %release_mode% EQU 0 ( rem Debug ) set compiler_warnings= ^ - -we4002 -we4013 -we4020 -we4024 -we4029 -we4031 -we4047 -we4133 -we4706 -we4715 ^ + -W4 -WX ^ -wd4100 -wd4101 -wd4127 -wd4189 ^ -wd4201 -wd4204 -wd4244 ^ -wd4306 ^ @@ -40,20 +40,14 @@ set compiler_settings=%compiler_includes% %compiler_flags% %compiler_warnings% set linker_settings=%libs% %linker_flags% -rem set build_dir= "\" -rem if not exist %build_dir% mkdir %build_dir% -rem pushd %build_dir% - del *.pdb > NUL 2> NUL - del *.ilk > NUL 2> NUL +del *.pdb > NUL 2> NUL +del *.ilk > NUL 2> NUL - cl %compiler_settings% "src\main.c" ^ - /link %linker_settings% -OUT:%exe_name% ^ +cl %compiler_settings% "src\main.c" ^ + /link %linker_settings% -OUT:%exe_name% ^ && odin run code/demo.odin rem && odin build_dll code/example.odin ^ rem && odin run code/demo.odin - - :do_not_compile_exe -rem popd :end_of_build diff --git a/code/demo.odin b/code/demo.odin index 41bf9b40b..7b9cb6f12 100644 --- a/code/demo.odin +++ b/code/demo.odin @@ -1,55 +1,60 @@ -#import "win32.odin" -#import "fmt.odin" -#import "sync.odin" +#import win32 "sys/windows.odin"; +#import "fmt.odin"; +#import "sync.odin"; +#import "hash.odin"; +#import "math.odin"; +#import "mem.odin"; +#import "opengl.odin"; +#import "os.odin"; +#import "utf8.odin"; Dll :: struct { - Handle :: type rawptr - name: string - handle: Handle + Handle :: type rawptr; + name: string; + handle: Handle; } load_library :: proc(name: string) -> (Dll, bool) { - buf: [4096]byte - copy(buf[:], name as []byte) + buf: [4096]byte; + copy(buf[:], name as []byte); - lib := win32.LoadLibraryA(^buf[0]) + lib := win32.LoadLibraryA(^buf[0]); if lib == nil { - return nil, false + return nil, false; } - return Dll{name, lib as Dll.Handle}, true + return Dll{name, lib as Dll.Handle}, true; } free_library :: proc(dll: Dll) { - win32.FreeLibrary(dll.handle as win32.HMODULE) + win32.FreeLibrary(dll.handle as win32.HMODULE); } get_proc_address :: proc(dll: Dll, name: string) -> (rawptr, bool) { - buf: [4096]byte - copy(buf[:], name as []byte) + buf: [4096]byte; + copy(buf[:], name as []byte); - addr := win32.GetProcAddress(dll.handle as win32.HMODULE, ^buf[0]) as rawptr + addr := win32.GetProcAddress(dll.handle as win32.HMODULE, ^buf[0]) as rawptr; if addr == nil { - return nil, false + return nil, false; } - return addr, true + return addr, true; } main :: proc() { - lib, lib_ok := load_library("example.dll") + lib, lib_ok := load_library("example.dll"); if !lib_ok { - fmt.println("Could not load library") - return + fmt.println("Could not load library"); + return; } - defer free_library(lib) + defer free_library(lib); - - proc_addr, addr_ok := get_proc_address(lib, "some_thing") + proc_addr, addr_ok := get_proc_address(lib, "some_thing"); if !addr_ok { - fmt.println("Could not load 'some_thing'") - return + fmt.println("Could not load 'some_thing'"); + return; } - some_thing := (proc_addr as proc()) - some_thing() + some_thing := (proc_addr as proc()); + some_thing(); } diff --git a/core/_preload.odin b/core/_preload.odin index c9d0c90e5..f561c7070 100644 --- a/core/_preload.odin +++ b/core/_preload.odin @@ -1,8 +1,8 @@ -#shared_global_scope +#shared_global_scope; -#import "os.odin" -#import "fmt.odin" -#import "mem.odin" +#import "os.odin"; +#import "fmt.odin"; +#import "mem.odin"; // IMPORTANT NOTE(bill): `type_info` & `type_info_val` cannot be used within a // #shared_global_scope due to the internals of the compiler. @@ -12,81 +12,81 @@ // IMPORTANT NOTE(bill): Do not change the order of any of this data // The compiler relies upon this _exact_ order -Type_Info :: union { - Member :: struct #ordered { - name: string; // can be empty if tuple - type_info: ^Type_Info - offset: int; // offsets are not used in tuples - } - Record :: struct #ordered { - fields: []Member - size: int; // in bytes - align: int; // in bytes - packed: bool - ordered: bool - } +Type_Info_Member :: struct #ordered { + name: string; // can be empty if tuple + type_info: ^Type_Info; + offset: int; // offsets are not used in tuples +}; +Type_Info_Record :: struct #ordered { + fields: []Type_Info_Member; + size: int; // in bytes + align: int; // in bytes + packed: bool; + ordered: bool; +}; +Type_Info :: union { Named: struct #ordered { - name: string + name: string; base: ^Type_Info; // This will _not_ be a Type_Info.Named - } + }; Integer: struct #ordered { size: int; // in bytes - signed: bool - } + signed: bool; + }; Float: struct #ordered { size: int; // in bytes - } - Any: struct #ordered {} - String: struct #ordered {} - Boolean: struct #ordered {} + }; + Any: struct #ordered {}; + String: struct #ordered {}; + Boolean: struct #ordered {}; Pointer: struct #ordered { elem: ^Type_Info; // nil -> rawptr - } + }; Maybe: struct #ordered { - elem: ^Type_Info - } + elem: ^Type_Info; + }; Procedure: struct #ordered { params: ^Type_Info; // Type_Info.Tuple results: ^Type_Info; // Type_Info.Tuple - variadic: bool - } + variadic: bool; + }; Array: struct #ordered { - elem: ^Type_Info - elem_size: int - count: int - } + elem: ^Type_Info; + elem_size: int; + count: int; + }; Slice: struct #ordered { - elem: ^Type_Info - elem_size: int - } + elem: ^Type_Info; + elem_size: int; + }; Vector: struct #ordered { - elem: ^Type_Info - elem_size: int - count: int - align: int - } - Tuple: Record - Struct: Record - Union: Record - Raw_Union: Record + elem: ^Type_Info; + elem_size: int; + count: int; + align: int; + }; + Tuple: Type_Info_Record; + Struct: Type_Info_Record; + Union: Type_Info_Record; + Raw_Union: Type_Info_Record; Enum: struct #ordered { - base: ^Type_Info - values: []i64 - names: []string - } -} + base: ^Type_Info; + values: []i64; + names: []string; + }; +}; type_info_base :: proc(info: ^Type_Info) -> ^Type_Info { if info == nil { - return nil + return nil; } - base := info + base := info; match type i : base { case Type_Info.Named: - base = i.base + base = i.base; } - return base + return base; } @@ -113,160 +113,160 @@ fmuladd64 :: proc(a, b, c: f64) -> f64 #foreign "llvm.fmuladd.f64" +Allocator_Mode :: enum { + ALLOC, + FREE, + FREE_ALL, + RESIZE, +} +Allocator_Proc :: type proc(allocator_data: rawptr, mode: Allocator_Mode, + size, alignment: int, + old_memory: rawptr, old_size: int, flags: u64) -> rawptr; -Allocator :: struct #ordered { - Mode :: enum { - ALLOC, - FREE, - FREE_ALL, - RESIZE, - } - Proc :: type proc(allocator_data: rawptr, mode: Mode, - size, alignment: int, - old_memory: rawptr, old_size: int, flags: u64) -> rawptr - procedure: Proc - data: rawptr +Allocator :: struct #ordered { + procedure: Allocator_Proc; + data: rawptr; } Context :: struct #ordered { - thread_id: int + thread_id: int; - allocator: Allocator + allocator: Allocator; - user_data: rawptr - user_index: int + user_data: rawptr; + user_index: int; } -#thread_local __context: Context +#thread_local __context: Context; -DEFAULT_ALIGNMENT :: align_of([vector 4]f32) +DEFAULT_ALIGNMENT :: align_of([vector 4]f32); __check_context :: proc() { - c := ^__context + c := ^__context; if c.allocator.procedure == nil { - c.allocator = default_allocator() + c.allocator = default_allocator(); } if c.thread_id == 0 { - c.thread_id = os.current_thread_id() + c.thread_id = os.current_thread_id(); } } alloc :: proc(size: int) -> rawptr #inline { return alloc_align(size, DEFAULT_ALIGNMENT); } alloc_align :: proc(size, alignment: int) -> rawptr #inline { - __check_context() - a := context.allocator - return a.procedure(a.data, Allocator.Mode.ALLOC, size, alignment, nil, 0, 0) + __check_context(); + a := context.allocator; + return a.procedure(a.data, Allocator_Mode.ALLOC, size, alignment, nil, 0, 0); } free :: proc(ptr: rawptr) #inline { - __check_context() - a := context.allocator + __check_context(); + a := context.allocator; if ptr != nil { - a.procedure(a.data, Allocator.Mode.FREE, 0, 0, ptr, 0, 0) + a.procedure(a.data, Allocator_Mode.FREE, 0, 0, ptr, 0, 0); } } free_all :: proc() #inline { - __check_context() - a := context.allocator - a.procedure(a.data, Allocator.Mode.FREE_ALL, 0, 0, nil, 0, 0) + __check_context(); + a := context.allocator; + a.procedure(a.data, Allocator_Mode.FREE_ALL, 0, 0, nil, 0, 0); } resize :: proc(ptr: rawptr, old_size, new_size: int) -> rawptr #inline { return resize_align(ptr, old_size, new_size, DEFAULT_ALIGNMENT); } resize_align :: proc(ptr: rawptr, old_size, new_size, alignment: int) -> rawptr #inline { - __check_context() - a := context.allocator - return a.procedure(a.data, Allocator.Mode.RESIZE, new_size, alignment, ptr, old_size, 0) + __check_context(); + a := context.allocator; + return a.procedure(a.data, Allocator_Mode.RESIZE, new_size, alignment, ptr, old_size, 0); } default_resize_align :: proc(old_memory: rawptr, old_size, new_size, alignment: int) -> rawptr { if old_memory == nil { - return alloc_align(new_size, alignment) + return alloc_align(new_size, alignment); } if new_size == 0 { - free(old_memory) - return nil + free(old_memory); + return nil; } if new_size == old_size { - return old_memory + return old_memory; } - new_memory := alloc_align(new_size, alignment) + new_memory := alloc_align(new_size, alignment); if new_memory == nil { - return nil + return nil; } - mem.copy(new_memory, old_memory, min(old_size, new_size)); - free(old_memory) - return new_memory + mem.copy(new_memory, old_memory, min(old_size, new_size));; + free(old_memory); + return new_memory; } -default_allocator_proc :: proc(allocator_data: rawptr, mode: Allocator.Mode, +default_allocator_proc :: proc(allocator_data: rawptr, mode: Allocator_Mode, size, alignment: int, old_memory: rawptr, old_size: int, flags: u64) -> rawptr { - using Allocator.Mode + using Allocator_Mode; when false { match mode { case ALLOC: - 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) + 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); case FREE: - os.heap_free(mem.allocation_header(old_memory)) - return nil + os.heap_free(mem.allocation_header(old_memory)); + return nil; case FREE_ALL: // NOTE(bill): Does nothing case RESIZE: - 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) + 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); } } else { match mode { case ALLOC: - return os.heap_alloc(size) + return os.heap_alloc(size); case FREE: - os.heap_free(old_memory) - return nil + os.heap_free(old_memory); + return nil; case FREE_ALL: // NOTE(bill): Does nothing case RESIZE: - return os.heap_resize(old_memory, size) + return os.heap_resize(old_memory, size); } } - return nil + return nil; } default_allocator :: proc() -> Allocator { return Allocator{ procedure = default_allocator_proc, data = nil, - } + }; } @@ -281,16 +281,16 @@ default_allocator :: proc() -> Allocator { __string_eq :: proc(a, b: string) -> bool { if a.count != b.count { - return false + return false; } if a.data == b.data { - return true + return true; } - return mem.compare(a.data, b.data, a.count) == 0 + return mem.compare(a.data, b.data, a.count) == 0; } __string_cmp :: proc(a, b : string) -> int { - return mem.compare(a.data, b.data, min(a.count, b.count)) + return mem.compare(a.data, b.data, min(a.count, b.count)); } __string_ne :: proc(a, b: string) -> bool #inline { return !__string_eq(a, b); } @@ -302,37 +302,37 @@ __string_ge :: proc(a, b: string) -> bool #inline { return __string_cmp(a, b) >= __assert :: proc(file: string, line, column: int, msg: string) #inline { fmt.fprintf(os.stderr, "%(%:%) Runtime assertion: %\n", - file, line, column, msg) - __debug_trap() + file, line, column, msg); + __debug_trap(); } __bounds_check_error :: proc(file: string, line, column: int, index, count: int) { if 0 <= index && index < count { - return + return; } fmt.fprintf(os.stderr, "%(%:%) Index % is out of bounds range [0, %)\n", - file, line, column, index, count) - __debug_trap() + file, line, column, index, count); + __debug_trap(); } __slice_expr_error :: proc(file: string, line, column: int, low, high, max: int) { if 0 <= low && low <= high && high <= max { - return + return; } fmt.fprintf(os.stderr, "%(%:%) Invalid slice indices: [%:%:%]\n", - file, line, column, low, high, max) - __debug_trap() + file, line, column, low, high, max); + __debug_trap(); } __substring_expr_error :: proc(file: string, line, column: int, low, high: int) { if 0 <= low && low <= high { - return + return; } fmt.fprintf(os.stderr, "%(%:%) Invalid substring indices: [%:%:%]\n", - file, line, column, low, high) - __debug_trap() + file, line, column, low, high); + __debug_trap(); } __enum_to_string :: proc(info: ^Type_Info, value: i64) -> string { @@ -341,11 +341,11 @@ __enum_to_string :: proc(info: ^Type_Info, value: i64) -> string { // TODO(bill): Search faster than linearly for i := 0; i < ti.values.count; i++ { if ti.values[i] == value { - return ti.names[i] + return ti.names[i]; } } } - return "" + return ""; } diff --git a/core/_soft_numbers.odin b/core/_soft_numbers.odin index 6fc49ac09..e71934321 100644 --- a/core/_soft_numbers.odin +++ b/core/_soft_numbers.odin @@ -1,4 +1,4 @@ -#shared_global_scope +#shared_global_scope; /* #import "fmt.odin" diff --git a/core/fmt.odin b/core/fmt.odin index 732014700..475ca61b7 100644 --- a/core/fmt.odin +++ b/core/fmt.odin @@ -1,596 +1,594 @@ -#import "os.odin" -#import "mem.odin" -#import "utf8.odin" +#import "os.odin"; +#import "mem.odin"; +#import "utf8.odin"; -PRINT_BUF_SIZE :: 1<<12 +PRINT_BUF_SIZE :: 1<<12; fprint :: proc(f: ^os.File, args: ..any) -> int { - data: [PRINT_BUF_SIZE]byte - buf := data[:0] - bprint(^buf, ..args) - os.write(f, buf) - return buf.count + data: [PRINT_BUF_SIZE]byte; + buf := data[:0]; + bprint(^buf, ..args); + os.write(f, buf); + return buf.count; } fprintln :: proc(f: ^os.File, args: ..any) -> int { - data: [PRINT_BUF_SIZE]byte - buf := data[:0] - bprintln(^buf, ..args) - os.write(f, buf) - return buf.count + data: [PRINT_BUF_SIZE]byte; + buf := data[:0]; + bprintln(^buf, ..args); + os.write(f, buf); + return buf.count; } fprintf :: proc(f: ^os.File, fmt: string, args: ..any) -> int { - data: [PRINT_BUF_SIZE]byte - buf := data[:0] - bprintf(^buf, fmt, ..args) - os.write(f, buf) - return buf.count + data: [PRINT_BUF_SIZE]byte; + buf := data[:0]; + bprintf(^buf, fmt, ..args); + os.write(f, buf); + return buf.count; } print :: proc(args: ..any) -> int { - return fprint(os.stdout, ..args) + return fprint(os.stdout, ..args); } println :: proc(args: ..any) -> int { - return fprintln(os.stdout, ..args) + return fprintln(os.stdout, ..args); } printf :: proc(fmt: string, args: ..any) -> int { - return fprintf(os.stdout, fmt, ..args) + return fprintf(os.stdout, fmt, ..args); } fprint_type :: proc(f: ^os.File, info: ^Type_Info) { - data: [PRINT_BUF_SIZE]byte - buf := data[:0] - bprint_type(^buf, info) - os.write(f, buf) + data: [PRINT_BUF_SIZE]byte; + buf := data[:0]; + bprint_type(^buf, info); + os.write(f, buf); } print_byte_buffer :: proc(buf: ^[]byte, b: []byte) { if buf.count < buf.capacity { - 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 + mem.copy(buf.data + buf.count, b.data, n); + buf.count += n; } } } bprint_string :: proc(buf: ^[]byte, s: string) { - print_byte_buffer(buf, s as []byte) + print_byte_buffer(buf, s as []byte); } byte_reverse :: proc(b: []byte) { - n := b.count + n := b.count; for i := 0; i < n/2; i++ { - b[i], b[n-1-i] = b[n-1-i], b[i] + b[i], b[n-1-i] = b[n-1-i], b[i]; } } bprint_rune :: proc(buf: ^[]byte, r: rune) { - b, n := utf8.encode_rune(r) - bprint_string(buf, b[:n] as string) + b, n := utf8.encode_rune(r); + bprint_string(buf, b[:n] as string); } bprint_space :: proc(buf: ^[]byte) { bprint_rune(buf, ' '); } bprint_nl :: proc(buf: ^[]byte) { bprint_rune(buf, '\n'); } -__NUM_TO_CHAR_TABLE := "0123456789ABCDEFGHIJKLMNOPQRSTUVWXYZabcdefghijklmnopqrstuvwxyz@$" +__NUM_TO_CHAR_TABLE := "0123456789ABCDEFGHIJKLMNOPQRSTUVWXYZabcdefghijklmnopqrstuvwxyz@$"; bprint_bool :: proc(buffer: ^[]byte, b : bool) { if b { - bprint_string(buffer, "true") + bprint_string(buffer, "true"); } else { - bprint_string(buffer, "false") + bprint_string(buffer, "false"); } } bprint_pointer :: proc(buffer: ^[]byte, p: rawptr) #inline { - bprint_string(buffer, "0x") - bprint_u64(buffer, p as uint as u64) + bprint_string(buffer, "0x"); + bprint_u64(buffer, p as uint as u64); } bprint_f16 :: proc(buffer: ^[]byte, f: f32) #inline { print__f64(buffer, f as f64, 4); } bprint_f32 :: proc(buffer: ^[]byte, f: f32) #inline { print__f64(buffer, f as f64, 7); } bprint_f64 :: proc(buffer: ^[]byte, f: f64) #inline { print__f64(buffer, f as f64, 16); } bprint_u64 :: proc(buffer: ^[]byte, value: u64) { - i := value - buf: [20]byte - len := 0 + i := value; + buf: [20]byte; + len := 0; if i == 0 { - buf[len] = '0' - len++ + buf[len] = '0'; + len++; } for i > 0 { - buf[len] = __NUM_TO_CHAR_TABLE[i % 10] - len++ - i /= 10 + buf[len] = __NUM_TO_CHAR_TABLE[i % 10]; + len++; + i /= 10; } - byte_reverse(buf[:len]) - bprint_string(buffer, buf[:len] as string) + byte_reverse(buf[:len]); + bprint_string(buffer, buf[:len] as string); } bprint_i64 :: proc(buffer: ^[]byte, value: i64) { // TODO(bill): Cleanup printing - i := value + i := value; if i < 0 { - i = -i - bprint_rune(buffer, '-') + i = -i; + bprint_rune(buffer, '-'); } - bprint_u64(buffer, i as u64) + bprint_u64(buffer, i as u64); } /* bprint_u128 :: proc(buffer: ^[]byte, value: u128) { - a := value transmute [2]u64 + a := value transmute [2]u64; if a[1] != 0 { - bprint_u64(buffer, a[1]) + bprint_u64(buffer, a[1]); } - bprint_u64(buffer, a[0]) + bprint_u64(buffer, a[0]); } bprint_i128 :: proc(buffer: ^[]byte, value: i128) { - i := value + i := value; if i < 0 { - i = -i - bprint_rune(buffer, '-') + i = -i; + bprint_rune(buffer, '-'); } - bprint_u128(buffer, i as u128) + bprint_u128(buffer, i as u128); } */ print__f64 :: proc(buffer: ^[]byte, value: f64, decimal_places: int) { - f := value + f := value; if f == 0 { - bprint_rune(buffer, '0') - return + bprint_rune(buffer, '0'); + return; } if f < 0 { - bprint_rune(buffer, '-') - f = -f + bprint_rune(buffer, '-'); + f = -f; } - i := f as u64 - bprint_u64(buffer, i) - f -= i as f64 + i := f as u64; + bprint_u64(buffer, i); + f -= i as f64; - bprint_rune(buffer, '.') + bprint_rune(buffer, '.'); - 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) - f -= i as f64 / mult - mult *= 10 + i = (f * mult) as u64; + bprint_u64(buffer, i as u64); + f -= i as f64 / mult; + mult *= 10; } } bprint_type :: proc(buf: ^[]byte, ti: ^Type_Info) { if ti == nil { - return + return; } - using Type_Info + using Type_Info; match type info : ti { case Named: - bprint_string(buf, info.name) + bprint_string(buf, info.name); case Integer: match { - case ti == type_info(int): - bprint_string(buf, "int") - case ti == type_info(uint): - bprint_string(buf, "uint") + case ti == type_info(int): bprint_string(buf, "int"); + case ti == type_info(uint): bprint_string(buf, "uint"); default: if info.signed { - bprint_string(buf, "i") + bprint_string(buf, "i"); } else { - bprint_string(buf, "u") + bprint_string(buf, "u"); } - bprint_u64(buf, 8*info.size as u64) + bprint_u64(buf, 8*info.size as u64); } case Float: match info.size { - case 4: bprint_string(buf, "f32") - case 8: bprint_string(buf, "f64") + case 4: bprint_string(buf, "f32"); + case 8: bprint_string(buf, "f64"); } - case String: bprint_string(buf, "string") - case Boolean: bprint_string(buf, "bool") + case String: bprint_string(buf, "string"); + case Boolean: bprint_string(buf, "bool"); case Pointer: if info.elem == nil { - bprint_string(buf, "rawptr") + bprint_string(buf, "rawptr"); } else { - bprint_string(buf, "^") - bprint_type(buf, info.elem) + bprint_string(buf, "^"); + bprint_type(buf, info.elem); } case Maybe: - bprint_string(buf, "?") - bprint_type(buf, info.elem) + bprint_string(buf, "?"); + bprint_type(buf, info.elem); case Procedure: - bprint_string(buf, "proc") + bprint_string(buf, "proc"); if info.params == nil { - bprint_string(buf, "()") + bprint_string(buf, "()"); } else { - 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) + bprint_type(buf, info.params); if count == 1 { bprint_string(buf, ")"); } } if info.results != nil { - bprint_string(buf, " -> ") - bprint_type(buf, info.results) + bprint_string(buf, " -> "); + bprint_type(buf, info.results); } case Tuple: - count := info.fields.count + count := info.fields.count; if count != 1 { bprint_string(buf, "("); } for i := 0; i < count; i++ { if i > 0 { bprint_string(buf, ", "); } - f := info.fields[i] + f := info.fields[i]; if f.name.count > 0 { - bprint_string(buf, f.name) - bprint_string(buf, ": ") + bprint_string(buf, f.name); + bprint_string(buf, ": "); } - bprint_type(buf, f.type_info) + bprint_type(buf, f.type_info); } if count != 1 { bprint_string(buf, ")"); } case Array: - bprint_string(buf, "[") - bprint_i64(buf, info.count as i64) - bprint_string(buf, "]") - bprint_type(buf, info.elem) + bprint_string(buf, "["); + bprint_i64(buf, info.count as i64); + bprint_string(buf, "]"); + bprint_type(buf, info.elem); case Slice: - bprint_string(buf, "[") - bprint_string(buf, "]") - bprint_type(buf, info.elem) + bprint_string(buf, "["); + bprint_string(buf, "]"); + bprint_type(buf, info.elem); case Vector: - bprint_string(buf, "[vector ") - bprint_i64(buf, info.count as i64) - bprint_string(buf, "]") - bprint_type(buf, info.elem) + bprint_string(buf, "[vector "); + bprint_i64(buf, info.count as i64); + bprint_string(buf, "]"); + bprint_type(buf, info.elem); case Struct: - bprint_string(buf, "struct ") + bprint_string(buf, "struct "); if info.packed { bprint_string(buf, "#packed "); } if info.ordered { bprint_string(buf, "#ordered "); } - bprint_string(buf, "{") + bprint_string(buf, "{"); for i := 0; i < info.fields.count; i++ { if i > 0 { - bprint_string(buf, ", ") + bprint_string(buf, ", "); } - bprint_any(buf, info.fields[i].name) - bprint_string(buf, ": ") - bprint_type(buf, info.fields[i].type_info) + bprint_any(buf, info.fields[i].name); + bprint_string(buf, ": "); + bprint_type(buf, info.fields[i].type_info); } - bprint_string(buf, "}") + bprint_string(buf, "}"); case Union: - bprint_string(buf, "union {") + bprint_string(buf, "union {"); for i := 0; i < info.fields.count; i++ { if i > 0 { - bprint_string(buf, ", ") + bprint_string(buf, ", "); } - bprint_any(buf, info.fields[i].name) - bprint_string(buf, ": ") - bprint_type(buf, info.fields[i].type_info) + bprint_any(buf, info.fields[i].name); + bprint_string(buf, ": "); + bprint_type(buf, info.fields[i].type_info); } - bprint_string(buf, "}") + bprint_string(buf, "}"); case Raw_Union: - bprint_string(buf, "raw_union {") + bprint_string(buf, "raw_union {"); for i := 0; i < info.fields.count; i++ { if i > 0 { - bprint_string(buf, ", ") + bprint_string(buf, ", "); } - bprint_any(buf, info.fields[i].name) - bprint_string(buf, ": ") - bprint_type(buf, info.fields[i].type_info) + bprint_any(buf, info.fields[i].name); + bprint_string(buf, ": "); + bprint_type(buf, info.fields[i].type_info); } - bprint_string(buf, "}") + bprint_string(buf, "}"); case Enum: - bprint_string(buf, "enum ") - bprint_type(buf, info.base) - bprint_string(buf, "{}") + bprint_string(buf, "enum "); + bprint_type(buf, info.base); + bprint_string(buf, "{}"); } } make_any :: proc(type_info: ^Type_Info, data: rawptr) -> any { - a: any - a.type_info = type_info - a.data = data - return a + a: any; + a.type_info = type_info; + a.data = data; + return a; } bprint_any :: proc(buf: ^[]byte, arg: any) { if arg.type_info == nil { - bprint_string(buf, "<nil>") - return + bprint_string(buf, "<nil>"); + return; } if arg.data == nil { - bprint_string(buf, "<nil>") - return + bprint_string(buf, "<nil>"); + return; } - using Type_Info + using Type_Info; match type info : arg.type_info { case Named: - 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, "{") + bprint_string(buf, info.name); + bprint_string(buf, "{"); for i := 0; i < b.fields.count; i++ { - f := b.fields[i] + f := b.fields[i]; if i > 0 { - bprint_string(buf, ", ") + bprint_string(buf, ", "); } - bprint_string(buf, f.name) - // bprint_any(buf, f.offset) - bprint_string(buf, " = ") - data := arg.data as ^byte + f.offset - bprint_any(buf, make_any(f.type_info, data)) + bprint_string(buf, f.name); + // bprint_any(buf, f.offset); + bprint_string(buf, " = "); + data := arg.data as ^byte + f.offset; + bprint_any(buf, make_any(f.type_info, data)); } - bprint_string(buf, "}") + bprint_string(buf, "}"); default: - bprint_any(buf, a) + bprint_any(buf, a); } case Integer: match type i : arg { - case i8: bprint_i64(buf, i as i64) - case u8: bprint_u64(buf, i as u64) - case i16: bprint_i64(buf, i as i64) - case u16: bprint_u64(buf, i as u64) - case i32: bprint_i64(buf, i as i64) - case u32: bprint_u64(buf, i as u64) - case i64: bprint_i64(buf, i) - case u64: bprint_u64(buf, i) - // case i128: bprint_i128(buf, i) - // case u128: bprint_u128(buf, i) + case i8: bprint_i64(buf, i as i64); + case u8: bprint_u64(buf, i as u64); + case i16: bprint_i64(buf, i as i64); + case u16: bprint_u64(buf, i as u64); + case i32: bprint_i64(buf, i as i64); + case u32: bprint_u64(buf, i as u64); + case i64: bprint_i64(buf, i); + case u64: bprint_u64(buf, i); + // case i128: bprint_i128(buf, i); + // case u128: bprint_u128(buf, i); - case int: bprint_i64(buf, i as i64) - case uint: bprint_u64(buf, i as u64) + case int: bprint_i64(buf, i as i64); + case uint: bprint_u64(buf, i as u64); } case Float: match type f : arg { - // case f16: bprint_f64(buf, f as f64) - case f32: bprint_f32(buf, f) - case f64: bprint_f64(buf, f) - // case f128: bprint_f64(buf, f as f64) + // case f16: bprint_f64(buf, f as f64); + case f32: bprint_f32(buf, f); + case f64: bprint_f64(buf, f); + // case f128: bprint_f64(buf, f as f64); } case String: match type s : arg { - case string: bprint_string(buf, s) + case string: bprint_string(buf, s); } case Boolean: match type b : arg { - case bool: bprint_bool(buf, b) + case bool: bprint_bool(buf, b); } case Pointer: match type p : arg { - case ^Type_Info: bprint_type(buf, p) - default: bprint_pointer(buf, (arg.data as ^rawptr)^) + case ^Type_Info: bprint_type(buf, p); + default: bprint_pointer(buf, (arg.data as ^rawptr)^); } case Maybe: - size := mem.size_of_type_info(info.elem) - 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)) + bprint_any(buf, make_any(info.elem, arg.data)); } else { - bprint_string(buf, "nil") + bprint_string(buf, "nil"); } case Enum: - value: i64 = 0 + value: i64 = 0; match type i : make_any(info.base, arg.data) { - case i8: value = i as i64 - case i16: value = i as i64 - case i32: value = i as i64 - case i64: value = i as i64 - case u8: value = i as i64 - case u16: value = i as i64 - case u32: value = i as i64 - case u64: value = i as i64 + case i8: value = i as i64; + case i16: value = i as i64; + case i32: value = i as i64; + case i64: value = i as i64; + case u8: value = i as i64; + case u16: value = i as i64; + case u32: value = i as i64; + case u64: value = i as i64; } - bprint_string(buf, __enum_to_string(arg.type_info, value)) + bprint_string(buf, __enum_to_string(arg.type_info, value)); case Array: - bprintf(buf, "[%]%{", info.count, info.elem) - defer bprint_string(buf, "}") + bprintf(buf, "[%]%{", info.count, info.elem); + defer bprint_string(buf, "}"); for i := 0; i < info.count; i++ { if i > 0 { - bprint_string(buf, ", ") + bprint_string(buf, ", "); } - data := arg.data as ^byte + i*info.elem_size - bprint_any(buf, make_any(info.elem, data)) + data := arg.data as ^byte + i*info.elem_size; + bprint_any(buf, make_any(info.elem, data)); } case Slice: - slice := arg.data as ^[]byte - bprintf(buf, "[]%{", info.elem) - defer bprint_string(buf, "}") + slice := arg.data as ^[]byte; + bprintf(buf, "[]%{", info.elem); + defer bprint_string(buf, "}"); for i := 0; i < slice.count; i++ { if i > 0 { - bprint_string(buf, ", ") + bprint_string(buf, ", "); } - data := slice.data + i*info.elem_size - bprint_any(buf, make_any(info.elem, data)) + data := slice.data + i*info.elem_size; + bprint_any(buf, make_any(info.elem, data)); } case Vector: is_bool :: proc(type_info: ^Type_Info) -> bool { match type info : type_info { case Named: - return is_bool(info.base) + return is_bool(info.base); case Boolean: - return true + return true; } - return false + return false; } - bprintf(buf, "[vector %]%{", info.count, info.elem) - defer bprint_string(buf, "}") + bprintf(buf, "[vector %]%{", info.count, info.elem); + defer bprint_string(buf, "}"); if is_bool(info.elem) { - return + return; } for i := 0; i < info.count; i++ { if i > 0 { - bprint_string(buf, ", ") + bprint_string(buf, ", "); } - data := arg.data as ^byte + i*info.elem_size - bprint_any(buf, make_any(info.elem, data)) + data := arg.data as ^byte + i*info.elem_size; + bprint_any(buf, make_any(info.elem, data)); } case Struct: - bprintf(buf, "%{", arg.type_info) - defer bprint_string(buf, "}") + bprintf(buf, "%{", arg.type_info); + defer bprint_string(buf, "}"); for i := 0; i < info.fields.count; i++ { if i > 0 { - bprint_string(buf, ", ") + bprint_string(buf, ", "); } - bprint_string(buf, info.fields[i].name) - bprint_string(buf, " = ") - data := arg.data as ^byte + info.fields[i].offset - ti := info.fields[i].type_info - bprint_any(buf, make_any(ti, data)) + bprint_string(buf, info.fields[i].name); + bprint_string(buf, " = "); + data := arg.data as ^byte + info.fields[i].offset; + ti := info.fields[i].type_info; + bprint_any(buf, make_any(ti, data)); } case Union: - bprint_string(buf, "(union)") + bprint_string(buf, "(union)"); case Raw_Union: - bprint_string(buf, "(raw_union)") + bprint_string(buf, "(raw_union)"); case Procedure: - bprint_type(buf, arg.type_info) - bprint_string(buf, " @ ") - bprint_pointer(buf, (arg.data as ^rawptr)^) + bprint_type(buf, arg.type_info); + bprint_string(buf, " @ "); + bprint_pointer(buf, (arg.data as ^rawptr)^); } } bprintf :: proc(buf: ^[]byte, fmt: string, args: ..any) -> int { is_digit :: proc(r: rune) -> bool #inline { - return '0' <= r && r <= '9' + return '0' <= r && r <= '9'; } parse_int :: proc(s: string, offset: int) -> (int, int) { - result := 0 + result := 0; for ; offset < s.count; offset++ { - c := s[offset] as rune + c := s[offset] as rune; if !is_digit(c) { - break + break; } - result *= 10 - result += (c - '0') as int + result *= 10; + result += (c - '0') as int; } - return result, offset + return result, offset; } - prev := 0 - implicit_index := 0 + prev := 0; + implicit_index := 0; for i := 0; i < fmt.count; i++ { - r := fmt[i] as rune - index := implicit_index + r := fmt[i] as rune; + index := implicit_index; if r != '%' { - continue + continue; } - bprint_string(buf, fmt[prev:i]) + bprint_string(buf, fmt[prev:i]); i++; // Skip % if i < fmt.count { - next := fmt[i] as rune + next := fmt[i] as rune; if next == '%' { - bprint_string(buf, "%") - i++ - prev = i - continue + bprint_string(buf, "%"); + i++; + prev = i; + continue; } if is_digit(next) { - index, i = parse_int(fmt, i) + index, i = parse_int(fmt, i); } } if 0 <= index && index < args.count { - bprint_any(buf, args[index]) - implicit_index = index+1 + bprint_any(buf, args[index]); + implicit_index = index+1; } else { // TODO(bill): Error check index out bounds - bprint_string(buf, "<invalid>") + bprint_string(buf, "<invalid>"); } - prev = i + prev = i; } - bprint_string(buf, fmt[prev:]) - return buf.count + bprint_string(buf, fmt[prev:]); + return buf.count; } bprint :: proc(buf: ^[]byte, args: ..any) -> int { is_type_string :: proc(info: ^Type_Info) -> bool { - using Type_Info + using Type_Info; if info == nil { - return false + return false; } match type i : type_info_base(info) { case String: - return true + return true; } - return false + return false; } - prev_string := false + prev_string := false; for i := 0; i < args.count; i++ { - arg := args[i] - is_string := arg.data != nil && is_type_string(arg.type_info) + arg := args[i]; + is_string := arg.data != nil && is_type_string(arg.type_info); if i > 0 && !is_string && !prev_string { - bprint_space(buf) + bprint_space(buf); } - bprint_any(buf, arg) - prev_string = is_string + bprint_any(buf, arg); + prev_string = is_string; } - return buf.count + return buf.count; } bprintln :: proc(buf: ^[]byte, args: ..any) -> int { for i := 0; i < args.count; i++ { if i > 0 { - append(buf, ' ') + append(buf, ' '); } - bprint_any(buf, args[i]) + bprint_any(buf, args[i]); } - bprint_nl(buf) - return buf.count + bprint_nl(buf); + return buf.count; } diff --git a/core/hash.odin b/core/hash.odin index d61b01a71..a3e16d54a 100644 --- a/core/hash.odin +++ b/core/hash.odin @@ -1,164 +1,164 @@ crc32 :: proc(data: rawptr, len: int) -> u32 { - result := ~(0 as u32) - s := slice_ptr(data as ^u8, len) + 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] + b := s[i] as u32; + result = result>>8 ~ __CRC32_TABLE[(result ~ b) & 0xff]; } - return ~result + return ~result; } crc64 :: proc(data: rawptr, len: int) -> u64 { - result := ~(0 as u64) - s := slice_ptr(data as ^u8, len) + 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] + b := s[i] as u64; + result = result>>8 ~ __CRC64_TABLE[(result ~ b) & 0xff]; } - return ~result + return ~result; } fnv32 :: proc(data: rawptr, len: int) -> u32 { - s := slice_ptr(data as ^u8, len) + s := slice_ptr(data as ^u8, len); - h: u32 = 0x811c9dc5 + h: u32 = 0x811c9dc5; for i := 0; i < len; i++ { - h = (h * 0x01000193) ~ s[i] as u32 + h = (h * 0x01000193) ~ s[i] as u32; } - return h + return h; } fnv64 :: proc(data: rawptr, len: int) -> u64 { - s := slice_ptr(data as ^u8, len) + s := slice_ptr(data as ^u8, len); - h: u64 = 0xcbf29ce484222325 + h: u64 = 0xcbf29ce484222325; for i := 0; i < len; i++ { - h = (h * 0x100000001b3) ~ s[i] as u64 + h = (h * 0x100000001b3) ~ s[i] as u64; } - return h + return h; } fnv32a :: proc(data: rawptr, len: int) -> u32 { - s := slice_ptr(data as ^u8, len) + s := slice_ptr(data as ^u8, len); - h: u32 = 0x811c9dc5 + h: u32 = 0x811c9dc5; for i := 0; i < len; i++ { - h = (h ~ s[i] as u32) * 0x01000193 + h = (h ~ s[i] as u32) * 0x01000193; } - return h + return h; } fnv64a :: proc(data: rawptr, len: int) -> u64 { - s := slice_ptr(data as ^u8, len) + s := slice_ptr(data as ^u8, len); - h: u64 = 0xcbf29ce484222325 + h: u64 = 0xcbf29ce484222325; for i := 0; i < len; i++ { - h = (h ~ s[i] as u64) * 0x100000001b3 + h = (h ~ s[i] as u64) * 0x100000001b3; } - return h + return h; } murmur64 :: proc(data_: rawptr, len: int) -> u64 { - SEED :: 0x9747b28c + SEED :: 0x9747b28c; - if size_of(int) == 8 { - m :: 0xc6a4a7935bd1e995 - r :: 47 + when size_of(int) == 8 { + m :: 0xc6a4a7935bd1e995; + r :: 47; - h: u64 = SEED ~ (len as u64 * m) + h: u64 = SEED ~ (len as u64 * m); - data := slice_ptr(data_ as ^u64, len/size_of(u64)) - 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 i := 0; i < data.count; i++ { - k := data[i] + k := data[i]; - k *= m - k ~= k>>r - k *= m + k *= m; + k ~= k>>r; + k *= m; - h ~= k - h *= m + h ~= k; + h *= m; } match len & 7 { - case 7: h ~= data2[6] as u64 << 48; fallthrough - case 6: h ~= data2[5] as u64 << 40; fallthrough - case 5: h ~= data2[4] as u64 << 32; fallthrough - case 4: h ~= data2[3] as u64 << 24; fallthrough - case 3: h ~= data2[2] as u64 << 16; fallthrough - case 2: h ~= data2[1] as u64 << 8; fallthrough + case 7: h ~= data2[6] as u64 << 48; fallthrough; + case 6: h ~= data2[5] as u64 << 40; fallthrough; + case 5: h ~= data2[4] as u64 << 32; fallthrough; + case 4: h ~= data2[3] as u64 << 24; fallthrough; + case 3: h ~= data2[2] as u64 << 16; fallthrough; + case 2: h ~= data2[1] as u64 << 8; fallthrough; case 1: - h ~= data2[0] as u64 - h *= m + h ~= data2[0] as u64; + h *= m; } - h ~= h>>r - h *= m - h ~= h>>r + h ~= h>>r; + h *= m; + h ~= h>>r; - return h + return h; } else { - m :: 0x5bd1e995 - r :: 24 + m :: 0x5bd1e995; + r :: 24; - h1: u32 = SEED as u32 ~ len as u32 - h2: u32 = SEED >> 32 + h1: u32 = SEED as u32 ~ len as u32; + h2: u32 = SEED >> 32; - data := slice_ptr(data_ as ^u32, len/size_of(u32)) + data := slice_ptr(data_ as ^u32, len/size_of(u32)); - i := 0 + i := 0; for len >= 8 { - k1, k2: u32 - k1 = data[i]; i++ - k1 *= m - k1 ~= k1>>r - k1 *= m - h1 *= m - h1 ~= k1 - len -= 4 + k1, k2: u32; + k1 = data[i]; i++; + k1 *= m; + k1 ~= k1>>r; + k1 *= m; + h1 *= m; + h1 ~= k1; + len -= 4; - k2 = data[i]; i++ - k2 *= m - k2 ~= k2>>r - k2 *= m - h2 *= m - h2 ~= k2 - len -= 4 + k2 = data[i]; i++; + k2 *= m; + k2 ~= k2>>r; + k2 *= m; + h2 *= m; + h2 ~= k2; + len -= 4; } if (len >= 4) { - k1: u32 - k1 = data[i]; i++ - k1 *= m - k1 ~= k1>>r - k1 *= m - h1 *= m - h1 ~= k1 - len -= 4 + k1: u32; + k1 = data[i]; i++; + k1 *= m; + k1 ~= k1>>r; + k1 *= m; + h1 *= m; + h1 ~= k1; + len -= 4; } 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 - case 2: h2 ~= data8[1] as u32 << 8; fallthrough + case 3: h2 ~= data8[2] as u32 << 16; fallthrough; + case 2: h2 ~= data8[1] as u32 << 8; fallthrough; case 1: - h2 ~= data8[0] as u32 - h2 *= m + h2 ~= data8[0] as u32; + h2 *= m; } - h1 ~= h2>>18 - h1 *= m - h2 ~= h1>>22 - h2 *= m - h1 ~= h2>>17 - h1 *= m - h2 ~= h1>>19 - h2 *= m + h1 ~= h2>>18; + h1 *= m; + h2 ~= h1>>22; + h2 *= m; + h1 ~= h2>>17; + h1 *= m; + h2 ~= h1>>19; + h2 *= m; - h := (h1 as u64)<<32 | h2 as u64 - return h + h := (h1 as u64)<<32 | h2 as u64; + return h; } } @@ -229,7 +229,7 @@ __CRC32_TABLE := [256]u32{ 0xbad03605, 0xcdd70693, 0x54de5729, 0x23d967bf, 0xb3667a2e, 0xc4614ab8, 0x5d681b02, 0x2a6f2b94, 0xb40bbe37, 0xc30c8ea1, 0x5a05df1b, 0x2d02ef8d, -} +}; __CRC64_TABLE := [256]u64{ 0x0000000000000000, 0x42f0e1eba9ea3693, 0x85e1c3d753d46d26, 0xc711223cfa3e5bb5, 0x493366450e42ecdf, 0x0bc387aea7a8da4c, 0xccd2a5925d9681f9, 0x8e224479f47cb76a, @@ -295,4 +295,4 @@ __CRC64_TABLE := [256]u64{ 0xcf8b0890283e370c, 0x8d7be97b81d4019f, 0x4a6acb477bea5a2a, 0x089a2aacd2006cb9, 0x14dea25f3af9026d, 0x562e43b4931334fe, 0x913f6188692d6f4b, 0xd3cf8063c0c759d8, 0x5dedc41a34bbeeb2, 0x1f1d25f19d51d821, 0xd80c07cd676f8394, 0x9afce626ce85b507, -} +}; diff --git a/core/math.odin b/core/math.odin index 9476eac21..36e89bb2f 100644 --- a/core/math.odin +++ b/core/math.odin @@ -1,29 +1,29 @@ -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; -Vec2 :: type [vector 2]f32 -Vec3 :: type [vector 3]f32 -Vec4 :: type [vector 4]f32 - -Mat2 :: type [2]Vec2 -Mat3 :: type [3]Vec3 -Mat4 :: type [4]Vec4 +Vec2 :: type [vector 2]f32; +Vec3 :: type [vector 3]f32; +Vec4 :: type [vector 4]f32; +; +Mat2 :: type [2]Vec2; +Mat3 :: type [3]Vec3; +Mat4 :: type [4]Vec4; sqrt32 :: proc(x: f32) -> f32 #foreign "llvm.sqrt.f32" @@ -47,42 +47,42 @@ sign64 :: proc(x: f64) -> f64 { if x >= 0 { return +1; } return -1; } copy_sign32 :: proc(x, y: f32) -> f32 { - ix := x transmute u32 - iy := y transmute u32 - ix &= 0x7fffffff - ix |= iy & 0x80000000 - return ix transmute f32 + ix := x transmute u32; + iy := y transmute u32; + ix &= 0x7fffffff; + ix |= iy & 0x80000000; + return ix transmute f32; } round32 :: proc(x: f32) -> f32 { if x >= 0 { - return floor32(x + 0.5) + return floor32(x + 0.5); } - return ceil32(x - 0.5) + return ceil32(x - 0.5); } floor32 :: proc(x: f32) -> f32 { if x >= 0 { - return x as int as f32 + return x as int as f32; } - return (x-0.5) as int as f32 + return (x-0.5) as int as f32; } ceil32 :: proc(x: f32) -> f32 { if x < 0 { - return x as int as f32 + return x as int as f32; } - return ((x as int)+1) as f32 + return ((x as int)+1) as f32; } remainder32 :: proc(x, y: f32) -> f32 { - return x - round32(x/y) * y + return x - round32(x/y) * y; } fmod32 :: proc(x, y: f32) -> f32 { - y = abs(y) - result := remainder32(abs(x), y) + y = abs(y); + result := remainder32(abs(x), y); if sign32(result) < 0 { - result += y + result += y; } - return copy_sign32(result, x) + return copy_sign32(result, x); } @@ -97,9 +97,9 @@ dot3 :: proc(a, b: Vec3) -> f32 { c := a*b; return c.x + c.y + c.z; } dot4 :: proc(a, b: Vec4) -> f32 { c := a*b; return c.x + c.y + c.z + c.w; } cross3 :: proc(x, y: Vec3) -> Vec3 { - 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 + 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; } @@ -112,27 +112,27 @@ vec3_norm :: proc(v: Vec3) -> Vec3 { return v / Vec3{vec3_mag(v)}; } vec4_norm :: proc(v: Vec4) -> Vec4 { return v / Vec4{vec4_mag(v)}; } vec2_norm0 :: proc(v: Vec2) -> Vec2 { - m := vec2_mag(v) + m := vec2_mag(v); if m == 0 { - return Vec2{0} + return Vec2{0}; } - return v / Vec2{m} + return v / Vec2{m}; } vec3_norm0 :: proc(v: Vec3) -> Vec3 { - m := vec3_mag(v) + m := vec3_mag(v); if m == 0 { - return Vec3{0} + return Vec3{0}; } - return v / Vec3{m} + return v / Vec3{m}; } vec4_norm0 :: proc(v: Vec4) -> Vec4 { - m := vec4_mag(v) + m := vec4_mag(v); if m == 0 { - return Vec4{0} + return Vec4{0}; } - return v / Vec4{m} + return v / Vec4{m}; } @@ -143,29 +143,29 @@ mat4_identity :: proc() -> Mat4 { {0, 1, 0, 0}, {0, 0, 1, 0}, {0, 0, 0, 1}, - } + }; } mat4_transpose :: proc(m: Mat4) -> Mat4 { for j := 0; j < 4; j++ { for i := 0; i < 4; i++ { - m[i][j], m[j][i] = m[j][i], m[i][j] + m[i][j], m[j][i] = m[j][i], m[i][j]; } } - return m + return m; } mat4_mul :: proc(a, b: Mat4) -> Mat4 { - c: Mat4 + 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] - + a[3][i]*b[j][3] + c[j][i] = a[0][i]*b[j][0] + + a[1][i]*b[j][1] + + a[2][i]*b[j][2] + + a[3][i]*b[j][3]; } } - return c + return c; } mat4_mul_vec4 :: proc(m: Mat4, v: Vec4) -> Vec4 { @@ -174,197 +174,195 @@ mat4_mul_vec4 :: proc(m: Mat4, v: Vec4) -> Vec4 { m[0][1]*v.x + m[1][1]*v.y + m[2][1]*v.z + m[3][1]*v.w, m[0][2]*v.x + m[1][2]*v.y + m[2][2]*v.z + m[3][2]*v.w, m[0][3]*v.x + m[1][3]*v.y + m[2][3]*v.z + m[3][3]*v.w, - } + }; } mat4_inverse :: proc(m: Mat4) -> Mat4 { - 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) - o[0][2] = +(m[1][0] * sf01 - m[1][1] * sf03 + m[1][3] * sf05) - o[0][3] = -(m[1][0] * sf02 - m[1][1] * sf04 + m[1][2] * sf05) - - o[1][0] = -(m[0][1] * sf00 - m[0][2] * sf01 + m[0][3] * sf02) - o[1][1] = +(m[0][0] * sf00 - m[0][2] * sf03 + m[0][3] * sf04) - o[1][2] = -(m[0][0] * sf01 - m[0][1] * sf03 + m[0][3] * sf05) - o[1][3] = +(m[0][0] * sf02 - m[0][1] * sf04 + m[0][2] * sf05) - - o[2][0] = +(m[0][1] * sf06 - m[0][2] * sf07 + m[0][3] * sf08) - o[2][1] = -(m[0][0] * sf06 - m[0][2] * sf09 + m[0][3] * sf10) - o[2][2] = +(m[0][0] * sf11 - m[0][1] * sf09 + m[0][3] * sf12) - o[2][3] = -(m[0][0] * sf08 - m[0][1] * sf10 + m[0][2] * sf12) - - o[3][0] = -(m[0][1] * sf13 - m[0][2] * sf14 + m[0][3] * sf15) - o[3][1] = +(m[0][0] * sf13 - m[0][2] * sf16 + m[0][3] * sf17) - 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) + 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); + o[0][2] = +(m[1][0] * sf01 - m[1][1] * sf03 + m[1][3] * sf05); + o[0][3] = -(m[1][0] * sf02 - m[1][1] * sf04 + m[1][2] * sf05); + + o[1][0] = -(m[0][1] * sf00 - m[0][2] * sf01 + m[0][3] * sf02); + o[1][1] = +(m[0][0] * sf00 - m[0][2] * sf03 + m[0][3] * sf04); + o[1][2] = -(m[0][0] * sf01 - m[0][1] * sf03 + m[0][3] * sf05); + o[1][3] = +(m[0][0] * sf02 - m[0][1] * sf04 + m[0][2] * sf05); + + o[2][0] = +(m[0][1] * sf06 - m[0][2] * sf07 + m[0][3] * sf08); + o[2][1] = -(m[0][0] * sf06 - m[0][2] * sf09 + m[0][3] * sf10); + o[2][2] = +(m[0][0] * sf11 - m[0][1] * sf09 + m[0][3] * sf12); + o[2][3] = -(m[0][0] * sf08 - m[0][1] * sf10 + m[0][2] * sf12); + + o[3][0] = -(m[0][1] * sf13 - m[0][2] * sf14 + m[0][3] * sf15); + o[3][1] = +(m[0][0] * sf13 - m[0][2] * sf16 + m[0][3] * sf17); + 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); 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]) - - o[0][0] *= ood - o[0][1] *= ood - o[0][2] *= ood - o[0][3] *= ood - o[1][0] *= ood - o[1][1] *= ood - o[1][2] *= ood - o[1][3] *= ood - o[2][0] *= ood - o[2][1] *= ood - o[2][2] *= ood - o[2][3] *= ood - o[3][0] *= ood - o[3][1] *= ood - o[3][2] *= ood - o[3][3] *= ood - - return o + m[0][3] * o[0][3]); + + o[0][0] *= ood; + o[0][1] *= ood; + o[0][2] *= ood; + o[0][3] *= ood; + o[1][0] *= ood; + o[1][1] *= ood; + o[1][2] *= ood; + o[1][3] *= ood; + o[2][0] *= ood; + o[2][1] *= ood; + o[2][2] *= ood; + o[2][3] *= ood; + o[3][0] *= ood; + o[3][1] *= ood; + o[3][2] *= ood; + o[3][3] *= ood; + + return o; } mat4_translate :: proc(v: Vec3) -> Mat4 { - m := mat4_identity() - m[3][0] = v.x - m[3][1] = v.y - m[3][2] = v.z - m[3][3] = 1 - return m + m := mat4_identity(); + m[3][0] = v.x; + m[3][1] = v.y; + m[3][2] = v.z; + m[3][3] = 1; + return m; } mat4_rotate :: proc(v: Vec3, angle_radians: f32) -> Mat4 { - c := cos32(angle_radians) - s := sin32(angle_radians) + c := cos32(angle_radians); + s := sin32(angle_radians); - a := vec3_norm(v) - t := a * Vec3{1-c} + a := vec3_norm(v); + t := a * Vec3{1-c}; - 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 - rot[0][2] = 0 + t.x*a.z - s*a.y - rot[0][3] = 0 + rot[0][0] = c + t.x*a.x; + rot[0][1] = 0 + t.x*a.y + s*a.z; + rot[0][2] = 0 + t.x*a.z - s*a.y; + rot[0][3] = 0; - rot[1][0] = 0 + t.y*a.x - s*a.z - rot[1][1] = c + t.y*a.y - rot[1][2] = 0 + t.y*a.z + s*a.x - rot[1][3] = 0 + rot[1][0] = 0 + t.y*a.x - s*a.z; + rot[1][1] = c + t.y*a.y; + rot[1][2] = 0 + t.y*a.z + s*a.x; + rot[1][3] = 0; - rot[2][0] = 0 + t.z*a.x + s*a.y - rot[2][1] = 0 + t.z*a.y - s*a.x - rot[2][2] = c + t.z*a.z - rot[2][3] = 0 + rot[2][0] = 0 + t.z*a.x + s*a.y; + rot[2][1] = 0 + t.z*a.y - s*a.x; + rot[2][2] = c + t.z*a.z; + rot[2][3] = 0; - return rot + return rot; } mat4_scale :: proc(m: Mat4, v: Vec3) -> Mat4 { - m[0][0] = v.x - m[1][1] = v.y - m[2][2] = v.z - return m + m[0][0] *= v.x; + m[1][1] *= v.y; + m[2][2] *= v.z; + return m; } mat4_scalef :: proc(m: Mat4, s: f32) -> Mat4 { - m[0][0] = s - m[1][1] = s - m[2][2] = s - return m + m[0][0] *= s; + m[1][1] *= s; + m[2][2] *= s; + return m; } mat4_look_at :: proc(eye, centre, up: Vec3) -> Mat4 { - f := vec3_norm(centre - eye) - s := vec3_norm(cross3(f, up)) - u := cross3(s, f) + f := vec3_norm(centre - eye); + s := vec3_norm(cross3(f, up)); + u := cross3(s, f); - m: Mat4 + m: Mat4; - m[0] = Vec4{+s.x, +s.y, +s.z, 0} - m[1] = Vec4{+u.x, +u.y, +u.z, 0} - m[2] = Vec4{-f.x, -f.y, -f.z, 0} - m[3] = Vec4{dot3(s, eye), dot3(u, eye), dot3(f, eye), 1} + m[0] = Vec4{+s.x, +s.y, +s.z, 0}; + m[1] = Vec4{+u.x, +u.y, +u.z, 0}; + m[2] = Vec4{-f.x, -f.y, -f.z, 0}; + m[3] = Vec4{dot3(s, eye), dot3(u, eye), dot3(f, eye), 1}; - return m + return m; } mat4_perspective :: proc(fovy, aspect, near, far: f32) -> Mat4 { - 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) - m[2][3] = -1.0 - m[3][2] = -2.0*far*near / (far - near) - return m + 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); + m[2][3] = -1.0; + m[3][2] = -2.0*far*near / (far - near); + return m; } mat4_ortho3d :: proc(left, right, bottom, top, near, far: f32) -> Mat4 { - m := mat4_identity() - - m[0][0] = +2.0 / (right - left) - m[1][1] = +2.0 / (top - bottom) - m[2][2] = -2.0 / (far - near) - m[3][0] = -(right + left) / (right - left) - m[3][1] = -(top + bottom) / (top - bottom) - m[3][2] = -(far + near) / (far - near) - - return m + m := mat4_identity(); + m[0][0] = +2.0 / (right - left); + m[1][1] = +2.0 / (top - bottom); + m[2][2] = -2.0 / (far - near); + m[3][0] = -(right + left) / (right - left); + m[3][1] = -(top + bottom) / (top - bottom); + m[3][2] = -(far + near) / (far - near); + return m; } -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 +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 diff --git a/core/mem.odin b/core/mem.odin index 719c2c073..f13b9fa66 100644 --- a/core/mem.odin +++ b/core/mem.odin @@ -1,51 +1,51 @@ -#import "fmt.odin" -#import "os.odin" +#import "fmt.odin"; +#import "os.odin"; set :: proc(data: rawptr, value: i32, len: int) -> rawptr #link_name "__mem_set" { llvm_memset_64bit :: proc(dst: rawptr, val: byte, len: int, align: i32, is_volatile: bool) #foreign "llvm.memset.p0i8.i64" - llvm_memset_64bit(data, value as byte, len, 1, false) - return data + llvm_memset_64bit(data, value as byte, len, 1, false); + return data; } -zero :: proc(data: rawptr, len: int) -> rawptr { - return set(data, 0, len) +zero :: proc(data: rawptr, len: int) -> rawptr #link_name "__mem_zero" { + return set(data, 0, len); } copy :: proc(dst, src: rawptr, len: int) -> rawptr #link_name "__mem_copy" { // NOTE(bill): This _must_ implemented like C's memmove llvm_memmove_64bit :: proc(dst, src: rawptr, len: int, align: i32, is_volatile: bool) #foreign "llvm.memmove.p0i8.p0i8.i64" - llvm_memmove_64bit(dst, src, len, 1, false) - return dst + llvm_memmove_64bit(dst, src, len, 1, false); + return dst; } copy_non_overlapping :: proc(dst, src: rawptr, len: int) -> rawptr #link_name "__mem_copy_non_overlapping" { // NOTE(bill): This _must_ implemented like C's memcpy llvm_memcpy_64bit :: proc(dst, src: rawptr, len: int, align: i32, is_volatile: bool) #foreign "llvm.memcpy.p0i8.p0i8.i64" - llvm_memcpy_64bit(dst, src, len, 1, false) - return dst + llvm_memcpy_64bit(dst, src, len, 1, false); + return dst; } compare :: proc(dst, src: rawptr, n: int) -> int #link_name "__mem_compare" { // Translation of http://mgronhol.github.io/fast-strcmp/ - a := slice_ptr(dst as ^byte, n) - b := slice_ptr(src as ^byte, n) + a := slice_ptr(dst as ^byte, n); + b := slice_ptr(src as ^byte, n); - fast := n/size_of(int) + 1 - offset := (fast-1)*size_of(int) - 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 + fast = 0; } - la := slice_ptr(^a[0] as ^int, fast) - 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 pos := curr_block*size_of(int); pos < n; pos++ { if (a[pos] ~ b[pos]) != 0 { - return a[pos] as int - b[pos] as int + return a[pos] as int - b[pos] as int; } } } @@ -54,11 +54,11 @@ compare :: proc(dst, src: rawptr, n: int) -> int #link_name "__mem_compare" { for ; offset < n; offset++ { if (a[offset] ~ b[offset]) != 0 { - return a[offset] as int - b[offset] as int + return a[offset] as int - b[offset] as int; } } - return 0 + return 0; } @@ -70,42 +70,42 @@ terabytes :: proc(x: int) -> int #inline { return terabytes(x) * 1024; } is_power_of_two :: proc(x: int) -> bool { if x <= 0 { - return false + return false; } - return (x & (x-1)) == 0 + return (x & (x-1)) == 0; } align_forward :: proc(ptr: rawptr, align: int) -> rawptr { - assert(is_power_of_two(align)) + assert(is_power_of_two(align)); - a := align as uint - p := ptr as uint - modulo := p & (a-1) + a := align as uint; + p := ptr as uint; + modulo := p & (a-1); if modulo != 0 { - p += a - modulo + p += a - modulo; } - return p as rawptr + return p as rawptr; } AllocationHeader :: struct { - size: int + size: int; } allocation_header_fill :: proc(header: ^AllocationHeader, data: rawptr, size: int) { - header.size = size - ptr := (header+1) as ^int + header.size = size; + ptr := (header+1) as ^int; for i := 0; ptr as rawptr < data; i++ { - (ptr+i)^ = -1 + (ptr+i)^ = -1; } } allocation_header :: proc(data: rawptr) -> ^AllocationHeader { - p := data as ^int + p := data as ^int; for (p-1)^ == -1 { - p = (p-1) + p = (p-1); } - return (p as ^AllocationHeader)-1 + return (p as ^AllocationHeader)-1; } @@ -115,14 +115,14 @@ allocation_header :: proc(data: rawptr) -> ^AllocationHeader { // Custom allocators Arena :: struct { - backing: Allocator - memory: []byte - temp_count: int + backing: Allocator; + memory: []byte; + temp_count: int; +} - Temp_Memory :: struct { - arena: ^Arena - original_count: int - } +Arena_Temp_Memory :: struct { + arena: ^Arena; + original_count: int; } @@ -130,22 +130,22 @@ Arena :: struct { init_arena_from_memory :: proc(using a: ^Arena, data: []byte) { - backing = Allocator{} - memory = data[:0] - temp_count = 0 + backing = Allocator{}; + memory = data[:0]; + temp_count = 0; } init_arena_from_context :: proc(using a: ^Arena, size: int) { - backing = context.allocator - memory = new_slice(byte, 0, size) - temp_count = 0 + backing = context.allocator; + memory = new_slice(byte, 0, size); + temp_count = 0; } free_arena :: proc(using a: ^Arena) { if backing.procedure != nil { push_allocator backing { - free(memory.data) - memory = memory[0:0:0] + free(memory.data); + memory = memory[0:0:0]; } } } @@ -154,57 +154,57 @@ arena_allocator :: proc(arena: ^Arena) -> Allocator { return Allocator{ procedure = arena_allocator_proc, data = arena, - } + }; } -arena_allocator_proc :: proc(allocator_data: rawptr, mode: Allocator.Mode, +arena_allocator_proc :: proc(allocator_data: rawptr, mode: Allocator_Mode, size, alignment: int, old_memory: rawptr, old_size: int, flags: u64) -> rawptr { - arena := allocator_data as ^Arena + arena := allocator_data as ^Arena; - using Allocator.Mode + using Allocator_Mode; match mode { case ALLOC: - 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 + fmt.fprintln(os.stderr, "Arena out of memory"); + return nil; } - #no_bounds_check end := ^arena.memory[arena.memory.count] + #no_bounds_check end := ^arena.memory[arena.memory.count]; - ptr := align_forward(end, alignment) - arena.memory.count += total_size - return zero(ptr, size) + ptr := align_forward(end, alignment); + arena.memory.count += total_size; + return zero(ptr, size); case FREE: // NOTE(bill): Free all at once - // Use Arena.Temp_Memory if you want to free a block + // Use Arena_Temp_Memory if you want to free a block case FREE_ALL: - arena.memory.count = 0 + arena.memory.count = 0; case RESIZE: - return default_resize_align(old_memory, old_size, size, alignment) + return default_resize_align(old_memory, old_size, size, alignment); } - return nil + return nil; } -begin_arena_temp_memory :: proc(a: ^Arena) -> Arena.Temp_Memory { - tmp: Arena.Temp_Memory - tmp.arena = a - tmp.original_count = a.memory.count - a.temp_count++ - return tmp +begin_arena_temp_memory :: proc(a: ^Arena) -> Arena_Temp_Memory { + tmp: Arena_Temp_Memory; + tmp.arena = a; + tmp.original_count = a.memory.count; + a.temp_count++; + return tmp; } -end_arena_temp_memory :: proc(using tmp: Arena.Temp_Memory) { - assert(arena.memory.count >= original_count) - assert(arena.temp_count > 0) - arena.memory.count = original_count - arena.temp_count-- +end_arena_temp_memory :: proc(using tmp: Arena_Temp_Memory) { + assert(arena.memory.count >= original_count); + assert(arena.temp_count > 0); + arena.memory.count = original_count; + arena.temp_count--; } @@ -214,119 +214,135 @@ end_arena_temp_memory :: proc(using tmp: Arena.Temp_Memory) { align_of_type_info :: proc(type_info: ^Type_Info) -> int { - WORD_SIZE :: size_of(int) - using Type_Info + prev_pow2 :: proc(n: i64) -> i64 { + if n <= 0 { + return 0; + } + n |= n >> 1; + n |= n >> 2; + n |= n >> 4; + n |= n >> 8; + n |= n >> 16; + n |= n >> 32; + return n - (n >> 1); + } + + 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 { case Named: - return align_of_type_info(info.base) + return align_of_type_info(info.base); case Integer: - return info.size + return info.size; case Float: - return info.size + return info.size; case String: - return WORD_SIZE + return WORD_SIZE; case Boolean: - return 1 + return 1; case Pointer: - return WORD_SIZE + return WORD_SIZE; case Maybe: - return max(align_of_type_info(info.elem), 1) + return max(align_of_type_info(info.elem), 1); case Procedure: - return WORD_SIZE + return WORD_SIZE; case Array: - return align_of_type_info(info.elem) + return align_of_type_info(info.elem); case Slice: - return WORD_SIZE + return WORD_SIZE; case Vector: - return align_of_type_info(info.elem) + 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 + return info.align; case Union: - return info.align + return info.align; case Raw_Union: - return info.align + return info.align; case Enum: - return align_of_type_info(info.base) + return align_of_type_info(info.base); } - return 0 + return 0; } align_formula :: proc(size, align: int) -> int { - result := size + align-1 - return result - result%align -} + result := size + align-1; + return result - result%align; +}; size_of_type_info :: proc(type_info: ^Type_Info) -> int { - WORD_SIZE :: size_of(int) - using Type_Info - + WORD_SIZE :: size_of(int); + using Type_Info; match type info : type_info { case Named: - return size_of_type_info(info.base) + return size_of_type_info(info.base); case Integer: - return info.size + return info.size; case Float: - return info.size + return info.size; case Any: - return 2*WORD_SIZE + return 2*WORD_SIZE; case String: - return 2*WORD_SIZE + return 2*WORD_SIZE; case Boolean: - return 1 + return 1; case Pointer: - return WORD_SIZE + return WORD_SIZE; case Maybe: - return size_of_type_info(info.elem) + 1 + return size_of_type_info(info.elem) + 1; case Procedure: - return WORD_SIZE + return WORD_SIZE; case Array: - count := info.count + count := info.count; if count == 0 { - return 0 + return 0; } - size := size_of_type_info(info.elem) - align := align_of_type_info(info.elem) - alignment := align_formula(size, align) - return alignment*(count-1) + size + 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 + return 3*WORD_SIZE; case Vector: is_bool :: proc(type_info: ^Type_Info) -> bool { match type info : type_info { case Named: - return is_bool(info.base) + return is_bool(info.base); case Boolean: - return true + return true; } - return false + return false; } - count := info.count + count := info.count; if count == 0 { - return 0 + return 0; } - 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 + bit_size = 1; } - total_size_in_bits := bit_size * count - total_size := (total_size_in_bits+7)/8 - return total_size + total_size_in_bits := bit_size * count; + total_size := (total_size_in_bits+7)/8; + return total_size; case Struct: - return info.size + return info.size; case Union: - return info.size + return info.size; case Raw_Union: - return info.size + return info.size; case Enum: - return size_of_type_info(info.base) + return size_of_type_info(info.base); } - return 0 + return 0; } diff --git a/core/opengl.odin b/core/opengl.odin index 3e546b9ca..b94bdac4c 100644 --- a/core/opengl.odin +++ b/core/opengl.odin @@ -1,6 +1,6 @@ -#foreign_system_library "opengl32" when ODIN_OS == "windows" -#import "win32.odin" when ODIN_OS == "windows" -#include "opengl_constants.odin" +#foreign_system_library "opengl32" when ODIN_OS == "windows"; +#import win32 "sys/windows.odin" when ODIN_OS == "windows"; +#include "opengl_constants.odin"; Clear :: proc(mask: u32) #foreign "glClear" ClearColor :: proc(r, g, b, a: f32) #foreign "glClearColor" @@ -30,126 +30,126 @@ GetIntegerv :: proc(name: i32, v: ^i32) #foreign "glGetIntegerv" -_libgl := win32.LoadLibraryA(("opengl32.dll\x00" as string).data) +_libgl := win32.LoadLibraryA(("opengl32.dll\x00" as string).data); GetProcAddress :: proc(name: string) -> proc() { - assert(name[name.count-1] == 0) - res := win32.wglGetProcAddress(name.data) + assert(name[name.count-1] == 0); + res := win32.wglGetProcAddress(name.data); if res == nil { - res = win32.GetProcAddress(_libgl, name.data) + res = win32.GetProcAddress(_libgl, name.data); } - return res + return res; } -GenBuffers: proc(count: i32, buffers: ^u32) -GenVertexArrays: proc(count: i32, buffers: ^u32) -GenSamplers: proc(count: i32, buffers: ^u32) -BindBuffer: proc(target: i32, buffer: u32) -BindVertexArray: proc(buffer: u32) -BindSampler: proc(position: i32, sampler: u32) -BufferData: proc(target: i32, size: int, data: rawptr, usage: i32) -BufferSubData: proc(target: i32, offset, size: int, data: rawptr) - -DrawArrays: proc(mode, first: i32, count: u32) -DrawElements: proc(mode: i32, count: u32, type_: i32, indices: rawptr) - -MapBuffer: proc(target, access: i32) -> rawptr -UnmapBuffer: proc(target: i32) - -VertexAttribPointer: proc(index: u32, size, type_: i32, normalized: i32, stride: u32, pointer: rawptr) -EnableVertexAttribArray: proc(index: u32) - -CreateShader: proc(shader_type: i32) -> u32 -ShaderSource: proc(shader: u32, count: u32, string: ^^byte, length: ^i32) -CompileShader: proc(shader: u32) -CreateProgram: proc() -> u32 -AttachShader: proc(program, shader: u32) -DetachShader: proc(program, shader: u32) -DeleteShader: proc(shader: u32) -LinkProgram: proc(program: u32) -UseProgram: proc(program: u32) -DeleteProgram: proc(program: u32) - - -GetShaderiv: proc(shader: u32, pname: i32, params: ^i32) -GetProgramiv: proc(program: u32, pname: i32, params: ^i32) -GetShaderInfoLog: proc(shader: u32, max_length: u32, length: ^u32, info_long: ^byte) -GetProgramInfoLog: proc(program: u32, max_length: u32, length: ^u32, info_long: ^byte) - -ActiveTexture: proc(texture: i32) -GenerateMipmap: proc(target: i32) - -SamplerParameteri: proc(sampler: u32, pname: i32, param: i32) -SamplerParameterf: proc(sampler: u32, pname: i32, param: f32) -SamplerParameteriv: proc(sampler: u32, pname: i32, params: ^i32) -SamplerParameterfv: proc(sampler: u32, pname: i32, params: ^f32) -SamplerParameterIiv: proc(sampler: u32, pname: i32, params: ^i32) -SamplerParameterIuiv: proc(sampler: u32, pname: i32, params: ^u32) - - -Uniform1i: proc(loc: i32, v0: i32) -Uniform2i: proc(loc: i32, v0, v1: i32) -Uniform3i: proc(loc: i32, v0, v1, v2: i32) -Uniform4i: proc(loc: i32, v0, v1, v2, v3: i32) -Uniform1f: proc(loc: i32, v0: f32) -Uniform2f: proc(loc: i32, v0, v1: f32) -Uniform3f: proc(loc: i32, v0, v1, v2: f32) -Uniform4f: proc(loc: i32, v0, v1, v2, v3: f32) -UniformMatrix4fv: proc(loc: i32, count: u32, transpose: i32, value: ^f32) - -GetUniformLocation: proc(program: u32, name: ^byte) -> i32 +GenBuffers: proc(count: i32, buffers: ^u32); +GenVertexArrays: proc(count: i32, buffers: ^u32); +GenSamplers: proc(count: i32, buffers: ^u32); +BindBuffer: proc(target: i32, buffer: u32); +BindVertexArray: proc(buffer: u32); +BindSampler: proc(position: i32, sampler: u32); +BufferData: proc(target: i32, size: int, data: rawptr, usage: i32); +BufferSubData: proc(target: i32, offset, size: int, data: rawptr); + +DrawArrays: proc(mode, first: i32, count: u32); +DrawElements: proc(mode: i32, count: u32, type_: i32, indices: rawptr); + +MapBuffer: proc(target, access: i32) -> rawptr; +UnmapBuffer: proc(target: i32); + +VertexAttribPointer: proc(index: u32, size, type_: i32, normalized: i32, stride: u32, pointer: rawptr); +EnableVertexAttribArray: proc(index: u32); + +CreateShader: proc(shader_type: i32) -> u32; +ShaderSource: proc(shader: u32, count: u32, string: ^^byte, length: ^i32); +CompileShader: proc(shader: u32); +CreateProgram: proc() -> u32; +AttachShader: proc(program, shader: u32); +DetachShader: proc(program, shader: u32); +DeleteShader: proc(shader: u32); +LinkProgram: proc(program: u32); +UseProgram: proc(program: u32); +DeleteProgram: proc(program: u32); + + +GetShaderiv: proc(shader: u32, pname: i32, params: ^i32); +GetProgramiv: proc(program: u32, pname: i32, params: ^i32); +GetShaderInfoLog: proc(shader: u32, max_length: u32, length: ^u32, info_long: ^byte); +GetProgramInfoLog: proc(program: u32, max_length: u32, length: ^u32, info_long: ^byte); + +ActiveTexture: proc(texture: i32); +GenerateMipmap: proc(target: i32); + +SamplerParameteri: proc(sampler: u32, pname: i32, param: i32); +SamplerParameterf: proc(sampler: u32, pname: i32, param: f32); +SamplerParameteriv: proc(sampler: u32, pname: i32, params: ^i32); +SamplerParameterfv: proc(sampler: u32, pname: i32, params: ^f32); +SamplerParameterIiv: proc(sampler: u32, pname: i32, params: ^i32); +SamplerParameterIuiv: proc(sampler: u32, pname: i32, params: ^u32); + + +Uniform1i: proc(loc: i32, v0: i32); +Uniform2i: proc(loc: i32, v0, v1: i32); +Uniform3i: proc(loc: i32, v0, v1, v2: i32); +Uniform4i: proc(loc: i32, v0, v1, v2, v3: i32); +Uniform1f: proc(loc: i32, v0: f32); +Uniform2f: proc(loc: i32, v0, v1: f32); +Uniform3f: proc(loc: i32, v0, v1, v2: f32); +Uniform4f: proc(loc: i32, v0, v1, v2, v3: f32); +UniformMatrix4fv: proc(loc: i32, count: u32, transpose: i32, value: ^f32); + +GetUniformLocation: proc(program: u32, name: ^byte) -> i32; init :: proc() { set_proc_address :: proc(p: rawptr, name: string) #inline { (p as ^proc())^ = GetProcAddress(name); } - set_proc_address(^GenBuffers, "glGenBuffers\x00") - set_proc_address(^GenVertexArrays, "glGenVertexArrays\x00") - set_proc_address(^GenSamplers, "glGenSamplers\x00") - set_proc_address(^BindBuffer, "glBindBuffer\x00") - set_proc_address(^BindSampler, "glBindSampler\x00") - set_proc_address(^BindVertexArray, "glBindVertexArray\x00") - set_proc_address(^BufferData, "glBufferData\x00") - set_proc_address(^BufferSubData, "glBufferSubData\x00") - - set_proc_address(^DrawArrays, "glDrawArrays\x00") - set_proc_address(^DrawElements, "glDrawElements\x00") - - set_proc_address(^MapBuffer, "glMapBuffer\x00") - set_proc_address(^UnmapBuffer, "glUnmapBuffer\x00") - - set_proc_address(^VertexAttribPointer, "glVertexAttribPointer\x00") - set_proc_address(^EnableVertexAttribArray, "glEnableVertexAttribArray\x00") - - set_proc_address(^CreateShader, "glCreateShader\x00") - set_proc_address(^ShaderSource, "glShaderSource\x00") - set_proc_address(^CompileShader, "glCompileShader\x00") - set_proc_address(^CreateProgram, "glCreateProgram\x00") - set_proc_address(^AttachShader, "glAttachShader\x00") - set_proc_address(^DetachShader, "glDetachShader\x00") - set_proc_address(^DeleteShader, "glDeleteShader\x00") - set_proc_address(^LinkProgram, "glLinkProgram\x00") - set_proc_address(^UseProgram, "glUseProgram\x00") - set_proc_address(^DeleteProgram, "glDeleteProgram\x00") - - set_proc_address(^GetShaderiv, "glGetShaderiv\x00") - set_proc_address(^GetProgramiv, "glGetProgramiv\x00") - set_proc_address(^GetShaderInfoLog, "glGetShaderInfoLog\x00") - set_proc_address(^GetProgramInfoLog, "glGetProgramInfoLog\x00") - - set_proc_address(^ActiveTexture, "glActiveTexture\x00") - set_proc_address(^GenerateMipmap, "glGenerateMipmap\x00") - - set_proc_address(^Uniform1i, "glUniform1i\x00") - set_proc_address(^UniformMatrix4fv, "glUniformMatrix4fv\x00") - - set_proc_address(^GetUniformLocation, "glGetUniformLocation\x00") - - set_proc_address(^SamplerParameteri, "glSamplerParameteri\x00") - set_proc_address(^SamplerParameterf, "glSamplerParameterf\x00") - set_proc_address(^SamplerParameteriv, "glSamplerParameteriv\x00") - set_proc_address(^SamplerParameterfv, "glSamplerParameterfv\x00") - set_proc_address(^SamplerParameterIiv, "glSamplerParameterIiv\x00") - set_proc_address(^SamplerParameterIuiv, "glSamplerParameterIuiv\x00") + set_proc_address(^GenBuffers, "glGenBuffers\x00"); + set_proc_address(^GenVertexArrays, "glGenVertexArrays\x00"); + set_proc_address(^GenSamplers, "glGenSamplers\x00"); + set_proc_address(^BindBuffer, "glBindBuffer\x00"); + set_proc_address(^BindSampler, "glBindSampler\x00"); + set_proc_address(^BindVertexArray, "glBindVertexArray\x00"); + set_proc_address(^BufferData, "glBufferData\x00"); + set_proc_address(^BufferSubData, "glBufferSubData\x00"); + + set_proc_address(^DrawArrays, "glDrawArrays\x00"); + set_proc_address(^DrawElements, "glDrawElements\x00"); + + set_proc_address(^MapBuffer, "glMapBuffer\x00"); + set_proc_address(^UnmapBuffer, "glUnmapBuffer\x00"); + + set_proc_address(^VertexAttribPointer, "glVertexAttribPointer\x00"); + set_proc_address(^EnableVertexAttribArray, "glEnableVertexAttribArray\x00"); + + set_proc_address(^CreateShader, "glCreateShader\x00"); + set_proc_address(^ShaderSource, "glShaderSource\x00"); + set_proc_address(^CompileShader, "glCompileShader\x00"); + set_proc_address(^CreateProgram, "glCreateProgram\x00"); + set_proc_address(^AttachShader, "glAttachShader\x00"); + set_proc_address(^DetachShader, "glDetachShader\x00"); + set_proc_address(^DeleteShader, "glDeleteShader\x00"); + set_proc_address(^LinkProgram, "glLinkProgram\x00"); + set_proc_address(^UseProgram, "glUseProgram\x00"); + set_proc_address(^DeleteProgram, "glDeleteProgram\x00"); + + set_proc_address(^GetShaderiv, "glGetShaderiv\x00"); + set_proc_address(^GetProgramiv, "glGetProgramiv\x00"); + set_proc_address(^GetShaderInfoLog, "glGetShaderInfoLog\x00"); + set_proc_address(^GetProgramInfoLog, "glGetProgramInfoLog\x00"); + + set_proc_address(^ActiveTexture, "glActiveTexture\x00"); + set_proc_address(^GenerateMipmap, "glGenerateMipmap\x00"); + + set_proc_address(^Uniform1i, "glUniform1i\x00"); + set_proc_address(^UniformMatrix4fv, "glUniformMatrix4fv\x00"); + + set_proc_address(^GetUniformLocation, "glGetUniformLocation\x00"); + + set_proc_address(^SamplerParameteri, "glSamplerParameteri\x00"); + set_proc_address(^SamplerParameterf, "glSamplerParameterf\x00"); + set_proc_address(^SamplerParameteriv, "glSamplerParameteriv\x00"); + set_proc_address(^SamplerParameterfv, "glSamplerParameterfv\x00"); + set_proc_address(^SamplerParameterIiv, "glSamplerParameterIiv\x00"); + set_proc_address(^SamplerParameterIuiv, "glSamplerParameterIuiv\x00"); } diff --git a/core/opengl_constants.odin b/core/opengl_constants.odin index ffb1c33ec..31ed3e6aa 100644 --- a/core/opengl_constants.odin +++ b/core/opengl_constants.odin @@ -1,1384 +1,1383 @@ -FALSE :: 0 -TRUE :: 1 +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 +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; -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 +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; -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 +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; -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_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; -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 +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_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 +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; -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 +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; -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 +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; -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 +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; +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; -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 +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; -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 +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; -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 +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; -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 +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; -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 +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; -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 +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; -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; -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; diff --git a/core/os_windows.odin b/core/os_windows.odin index 3a882cd73..05abc9e11 100644 --- a/core/os_windows.odin +++ b/core/os_windows.odin @@ -1,83 +1,84 @@ -#import "win32.odin" -#import "fmt.odin" +#import win32 "sys/windows.odin"; +#import "fmt.odin"; -File_Time :: type u64 +File_Time :: type u64; + +File_Handle :: raw_union { + p: rawptr; + i: int; +} File :: struct { - Handle :: raw_union { - p: rawptr - i: int - } - handle: Handle - last_write_time: File_Time + handle: File_Handle; + last_write_time: File_Time; } open :: proc(name: string) -> (File, bool) { - using win32 - buf: [300]byte - copy(buf[:], name as []byte) - f: File - f.handle.p = CreateFileA(^buf[0], FILE_GENERIC_READ, FILE_SHARE_READ, nil, OPEN_EXISTING, 0, nil) as rawptr - success := f.handle.p != INVALID_HANDLE_VALUE - f.last_write_time = last_write_time(^f) - return f, success + using win32; + buf: [300]byte; + copy(buf[:], name as []byte); + f: File; + f.handle.p = CreateFileA(^buf[0], FILE_GENERIC_READ, FILE_SHARE_READ, nil, OPEN_EXISTING, 0, nil) as rawptr; + success := f.handle.p != INVALID_HANDLE_VALUE; + f.last_write_time = last_write_time(^f); + return f, success; } create :: proc(name: string) -> (File, bool) { - using win32 - buf: [300]byte - copy(buf[:], name as []byte) - f: File - f.handle.p = CreateFileA(^buf[0], FILE_GENERIC_WRITE, FILE_SHARE_READ, nil, CREATE_ALWAYS, 0, nil) as rawptr - success := f.handle.p != INVALID_HANDLE_VALUE - f.last_write_time = last_write_time(^f) - return f, success + using win32; + buf: [300]byte; + copy(buf[:], name as []byte); + f: File; + f.handle.p = CreateFileA(^buf[0], FILE_GENERIC_WRITE, FILE_SHARE_READ, nil, CREATE_ALWAYS, 0, nil) as rawptr; + success := f.handle.p != INVALID_HANDLE_VALUE; + f.last_write_time = last_write_time(^f); + return f, success; } close :: proc(using f: ^File) { - win32.CloseHandle(handle.p as win32.HANDLE) + win32.CloseHandle(handle.p as win32.HANDLE); } write :: proc(using f: ^File, buf: []byte) -> bool { - bytes_written: i32 - return win32.WriteFile(handle.p as win32.HANDLE, buf.data, buf.count as i32, ^bytes_written, nil) != 0 + bytes_written: i32; + return win32.WriteFile(handle.p as win32.HANDLE, buf.data, buf.count as i32, ^bytes_written, nil) != 0; } file_has_changed :: proc(f: ^File) -> bool { - last_write_time := last_write_time(f) + last_write_time := last_write_time(f); if f.last_write_time != last_write_time { - f.last_write_time = last_write_time - return true + f.last_write_time = last_write_time; + return true; } - return false + return false; } last_write_time :: proc(f: ^File) -> File_Time { - file_info: win32.BY_HANDLE_FILE_INFORMATION - win32.GetFileInformationByHandle(f.handle.p as win32.HANDLE, ^file_info) - l := file_info.last_write_time.low_date_time as File_Time - h := file_info.last_write_time.high_date_time as File_Time - return l | h << 32 + file_info: win32.BY_HANDLE_FILE_INFORMATION; + win32.GetFileInformationByHandle(f.handle.p as win32.HANDLE, ^file_info); + l := file_info.last_write_time.low_date_time as File_Time; + h := file_info.last_write_time.high_date_time as File_Time; + return l | h << 32; } last_write_time_by_name :: proc(name: string) -> File_Time { - last_write_time: win32.FILETIME - data: win32.WIN32_FILE_ATTRIBUTE_DATA - buf: [1024]byte + last_write_time: win32.FILETIME; + data: win32.WIN32_FILE_ATTRIBUTE_DATA; + buf: [1024]byte; - assert(buf.count > name.count) + assert(buf.count > name.count); - copy(buf[:], name as []byte) + copy(buf[:], name as []byte); if win32.GetFileAttributesExA(^buf[0], win32.GetFileExInfoStandard, ^data) != 0 { - last_write_time = data.last_write_time + last_write_time = data.last_write_time; } - l := last_write_time.low_date_time as File_Time - h := last_write_time.high_date_time as File_Time - return l | h << 32 + l := last_write_time.low_date_time as File_Time; + h := last_write_time.high_date_time as File_Time; + return l | h << 32; } @@ -91,84 +92,84 @@ File_Standard :: enum { // NOTE(bill): Uses startup to initialize it __std_files := [File_Standard.count]File{ - {handle = win32.GetStdHandle(win32.STD_INPUT_HANDLE) transmute File.Handle }, - {handle = win32.GetStdHandle(win32.STD_OUTPUT_HANDLE) transmute File.Handle }, - {handle = win32.GetStdHandle(win32.STD_ERROR_HANDLE) transmute File.Handle }, -} + {handle = win32.GetStdHandle(win32.STD_INPUT_HANDLE) transmute File_Handle }, + {handle = win32.GetStdHandle(win32.STD_OUTPUT_HANDLE) transmute File_Handle }, + {handle = win32.GetStdHandle(win32.STD_ERROR_HANDLE) transmute File_Handle }, +}; -stdin := ^__std_files[File_Standard.INPUT] -stdout := ^__std_files[File_Standard.OUTPUT] -stderr := ^__std_files[File_Standard.ERROR] +stdin := ^__std_files[File_Standard.INPUT]; +stdout := ^__std_files[File_Standard.OUTPUT]; +stderr := ^__std_files[File_Standard.ERROR]; read_entire_file :: proc(name: string) -> ([]byte, bool) { - buf: [300]byte - copy(buf[:], name as []byte) + buf: [300]byte; + copy(buf[:], name as []byte); - f, file_ok := open(name) + f, file_ok := open(name); if !file_ok { - return nil, false + return nil, false; } - defer close(^f) + defer close(^f); - length: i64 - file_size_ok := win32.GetFileSizeEx(f.handle.p as win32.HANDLE, ^length) != 0 + length: i64; + file_size_ok := win32.GetFileSizeEx(f.handle.p as win32.HANDLE, ^length) != 0; if !file_size_ok { - return nil, false + return nil, false; } - data := new_slice(u8, length) + data := new_slice(u8, length); if data.data == nil { - return nil, false + return nil, false; } - single_read_length: i32 - total_read: i64 + single_read_length: i32; + total_read: i64; for total_read < length { - remaining := length - total_read - to_read: u32 - MAX :: 1<<32-1 + remaining := length - total_read; + to_read: u32; + MAX :: 1<<32-1; if remaining <= MAX { - to_read = remaining as u32 + to_read = remaining as u32; } else { - to_read = MAX + to_read = MAX; } - win32.ReadFile(f.handle.p as win32.HANDLE, ^data[total_read], to_read, ^single_read_length, nil) + win32.ReadFile(f.handle.p as win32.HANDLE, ^data[total_read], to_read, ^single_read_length, nil); if single_read_length <= 0 { - free(data.data) - return nil, false + free(data.data); + return nil, false; } - total_read += single_read_length as i64 + total_read += single_read_length as i64; } - return data, true + return data, true; } heap_alloc :: proc(size: int) -> rawptr { - return win32.HeapAlloc(win32.GetProcessHeap(), win32.HEAP_ZERO_MEMORY, size) + return win32.HeapAlloc(win32.GetProcessHeap(), win32.HEAP_ZERO_MEMORY, size); } heap_resize :: proc(ptr: rawptr, new_size: int) -> rawptr { - return win32.HeapReAlloc(win32.GetProcessHeap(), win32.HEAP_ZERO_MEMORY, ptr, new_size) + return win32.HeapReAlloc(win32.GetProcessHeap(), win32.HEAP_ZERO_MEMORY, ptr, new_size); } heap_free :: proc(ptr: rawptr) { - win32.HeapFree(win32.GetProcessHeap(), 0, ptr) + win32.HeapFree(win32.GetProcessHeap(), 0, ptr); } exit :: proc(code: int) { - win32.ExitProcess(code as u32) + win32.ExitProcess(code as u32); } current_thread_id :: proc() -> int { GetCurrentThreadId :: proc() -> u32 #foreign #dll_import - return GetCurrentThreadId() as int + return GetCurrentThreadId() as int; } diff --git a/core/utf8.odin b/core/utf8.odin index 9dc07c6c0..7388133d8 100644 --- a/core/utf8.odin +++ b/core/utf8.odin @@ -1,18 +1,18 @@ -RUNE_ERROR :: '\ufffd' -RUNE_SELF :: 0x80 -RUNE_BOM :: 0xfeff -RUNE_EOF :: ~(0 as rune) -MAX_RUNE :: '\U0010ffff' -UTF_MAX :: 4 +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 +SURROGATE_MIN :: 0xd800; +SURROGATE_MAX :: 0xdfff; Accept_Range :: struct { - lo, hi: u8 -} + lo, hi: u8; +}; accept_ranges := [5]Accept_Range{ {0x80, 0xbf}, @@ -20,7 +20,7 @@ accept_ranges := [5]Accept_Range{ {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 @@ -40,177 +40,177 @@ accept_sizes := [256]byte{ 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 -} +}; encode_rune :: proc(r_: rune) -> ([4]byte, int) { - r := r_ - buf: [4]byte - i := r as u32 - mask :: 0x3f as byte + r := r_; + buf: [4]byte; + i := r as u32; + mask :: 0x3f as byte; if i <= 1<<7-1 { - buf[0] = r as byte - return buf, 1 + buf[0] = r as byte; + return buf, 1; } if i <= 1<<11-1 { - buf[0] = 0xc0 | (r>>6) as byte - buf[1] = 0x80 | (r) as byte & mask - return buf, 2 + buf[0] = 0xc0 | (r>>6) as byte; + buf[1] = 0x80 | (r) as byte & mask; + return buf, 2; } // Invalid or Surrogate range if i > 0x0010ffff || (0xd800 <= i && i <= 0xdfff) { - r = 0xfffd + r = 0xfffd; } if i <= 1<<16-1 { - buf[0] = 0xe0 | (r>>12) as byte - buf[1] = 0x80 | (r>>6) as byte & mask - buf[2] = 0x80 | (r) as byte & mask - return buf, 3 + buf[0] = 0xe0 | (r>>12) as byte; + buf[1] = 0x80 | (r>>6) as byte & mask; + buf[2] = 0x80 | (r) as byte & mask; + return buf, 3; } - buf[0] = 0xf0 | (r>>18) as byte - buf[1] = 0x80 | (r>>12) as byte & mask - buf[2] = 0x80 | (r>>6) as byte & mask - buf[3] = 0x80 | (r) as byte & mask - return buf, 4 + buf[0] = 0xf0 | (r>>18) as byte; + buf[1] = 0x80 | (r>>12) as byte & mask; + buf[2] = 0x80 | (r>>6) as byte & mask; + buf[3] = 0x80 | (r) as byte & mask; + return buf, 4; } decode_rune :: proc(s: string) -> (rune, int) { - n := s.count + n := s.count; if n < 1 { - return RUNE_ERROR, 0 + return RUNE_ERROR, 0; } - b0 := s[0] - x := accept_sizes[b0] + b0 := s[0]; + x := accept_sizes[b0]; if x >= 0xf0 { mask := (x as rune << 31) >> 31; // all zeros or all ones - return (b0 as rune) &~ mask | RUNE_ERROR&mask, 1 + return (b0 as rune) &~ mask | RUNE_ERROR&mask, 1; } - size := x & 7 - ar := accept_ranges[x>>4] + size := x & 7; + ar := accept_ranges[x>>4]; if n < size as int { - return RUNE_ERROR, 1 + return RUNE_ERROR, 1; } - b1 := s[1] + b1 := s[1]; if b1 < ar.lo || ar.hi < b1 { - return RUNE_ERROR, 1 + return RUNE_ERROR, 1; } - 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 + return (b0&MASK_2) as rune <<6 | (b1&MASK_X) as rune, 2; } - b2 := s[2] + b2 := s[2]; if b2 < 0x80 || 0xbf < b2 { - return RUNE_ERROR, 1 + 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 + return (b0&MASK_3) as rune <<12 | (b1&MASK_X) as rune <<6 | (b2&MASK_X) as rune, 3; } - b3 := s[3] + b3 := s[3]; if b3 < 0x80 || 0xbf < b3 { - return RUNE_ERROR, 1 + return RUNE_ERROR, 1; } - return (b0&MASK_4) as rune <<18 | (b1&MASK_X) as rune <<12 | (b3&MASK_X) as rune <<6 | (b3&MASK_X) as rune, 4 + return (b0&MASK_4) as rune <<18 | (b1&MASK_X) as rune <<12 | (b3&MASK_X) as rune <<6 | (b3&MASK_X) as rune, 4; } valid_rune :: proc(r: rune) -> bool { if r < 0 { - return false + return false; } else if SURROGATE_MIN <= r && r <= SURROGATE_MAX { - return false + return false; } else if r > MAX_RUNE { - return false + return false; } - return true + return true; } valid_string :: proc(s: string) -> bool { - n := s.count + n := s.count; for i := 0; i < n; { - si := s[i] + si := s[i]; if si < RUNE_SELF { // ascii - i++ - continue + i++; + continue; } - x := accept_sizes[si] + x := accept_sizes[si]; if x == 0xf1 { - return false + return false; } - size := (x & 7) as int + size := (x & 7) as int; if i+size > n { - return false + return false; } - ar := accept_ranges[x>>4] + ar := accept_ranges[x>>4]; if b := s[i+1]; b < ar.lo || ar.hi < b { - return false + return false; } else if size == 2 { // Okay } else if b := s[i+2]; b < 0x80 || 0xbf < b { - return false + return false; } else if size == 3 { // Okay } else if b := s[i+3]; b < 0x80 || 0xbf < b { - return false + return false; } - i += size + i += size; } - return true + return true; } rune_count :: proc(s: string) -> int { - count := 0 - n := s.count + count := 0; + n := s.count; for i := 0; i < n; count++ { - si := s[i] + si := s[i]; if si < RUNE_SELF { // ascii - i++ - continue + i++; + continue; } - x := accept_sizes[si] + x := accept_sizes[si]; if x == 0xf1 { - i++ - continue + i++; + continue; } - size := (x & 7) as int + size := (x & 7) as int; if i+size > n { - i++ - continue + i++; + continue; } - ar := accept_ranges[x>>4] + ar := accept_ranges[x>>4]; if b := s[i+1]; b < ar.lo || ar.hi < b { - size = 1 + size = 1; } else if size == 2 { // Okay } else if b := s[i+2]; b < 0x80 || 0xbf < b { - size = 1 + size = 1; } else if size == 3 { // Okay } else if b := s[i+3]; b < 0x80 || 0xbf < b { - size = 1 + size = 1; } - i += size + i += size; } - return count + return count; } rune_size :: proc(r: rune) -> int { match { - case r < 0: return -1 - case r <= 1<<7 - 1: return 1 - case r <= 1<<11 - 1: return 2 - case SURROGATE_MIN <= r && r <= SURROGATE_MAX: return -1 - case r <= 1<<16 - 1: return 3 - case r <= MAX_RUNE: return 4 - } - return -1 + case r < 0: return -1; + case r <= 1<<7 - 1: return 1; + case r <= 1<<11 - 1: return 2; + case SURROGATE_MIN <= r && r <= SURROGATE_MAX: return -1; + case r <= 1<<16 - 1: return 3; + case r <= MAX_RUNE: return 4; + } + return -1; } diff --git a/core/win32.odin b/core/win32.odin deleted file mode 100644 index 58d7bb2e8..000000000 --- a/core/win32.odin +++ /dev/null @@ -1,524 +0,0 @@ -#foreign_system_library "user32" when ODIN_OS == "windows" -#foreign_system_library "gdi32" when ODIN_OS == "windows" - -HANDLE :: type rawptr -HWND :: type HANDLE -HDC :: type HANDLE -HINSTANCE :: type HANDLE -HICON :: type HANDLE -HCURSOR :: type HANDLE -HMENU :: type HANDLE -HBRUSH :: type HANDLE -HGDIOBJ :: type HANDLE -HMODULE :: type HANDLE -WPARAM :: type uint -LPARAM :: type int -LRESULT :: type int -ATOM :: type i16 -BOOL :: type i32 -WNDPROC :: type proc(hwnd: HWND, msg: u32, wparam: WPARAM, lparam: LPARAM) -> LRESULT - -INVALID_HANDLE_VALUE :: (-1 as int) as HANDLE - -CS_VREDRAW :: 0x0001 -CS_HREDRAW :: 0x0002 -CS_OWNDC :: 0x0020 -CW_USEDEFAULT :: -0x80000000 - -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 - -WM_DESTROY :: 0x0002 -WM_CLOSE :: 0x0010 -WM_QUIT :: 0x0012 -WM_KEYDOWN :: 0x0100 -WM_KEYUP :: 0x0101 - -PM_REMOVE :: 1 - -COLOR_BACKGROUND :: 1 as HBRUSH -BLACK_BRUSH :: 4 - -SM_CXSCREEN :: 0 -SM_CYSCREEN :: 1 - -SW_SHOW :: 5 - -POINT :: struct #ordered { - x, y: i32 -} - - -WNDCLASSEXA :: struct #ordered { - size, style: u32 - wnd_proc: WNDPROC - cls_extra, wnd_extra: i32 - instance: HINSTANCE - icon: HICON - cursor: HCURSOR - background: HBRUSH - menu_name, class_name: ^u8 - sm: HICON -} - -MSG :: struct #ordered { - hwnd: HWND - message: u32 - wparam: WPARAM - lparam: LPARAM - time: u32 - pt: POINT -} - -RECT :: struct #ordered { - left: i32 - top: i32 - right: i32 - bottom: i32 -} - -FILETIME :: struct #ordered { - low_date_time, high_date_time: u32 -} - -BY_HANDLE_FILE_INFORMATION :: struct #ordered { - file_attributes: u32 - creation_time, - last_access_time, - last_write_time: FILETIME - volume_serial_number, - file_size_high, - file_size_low, - number_of_links, - file_index_high, - file_index_low: u32 -} - -WIN32_FILE_ATTRIBUTE_DATA :: struct #ordered { - file_attributes: u32 - creation_time, - last_access_time, - last_write_time: FILETIME - file_size_high, - file_size_low: u32 -} - -GET_FILEEX_INFO_LEVELS :: type i32 -GetFileExInfoStandard :: 0 as GET_FILEEX_INFO_LEVELS -GetFileExMaxInfoLevel :: 1 as GET_FILEEX_INFO_LEVELS - -GetLastError :: proc() -> i32 #foreign #dll_import -ExitProcess :: proc(exit_code: u32) #foreign #dll_import -GetDesktopWindow :: proc() -> HWND #foreign #dll_import -GetCursorPos :: proc(p: ^POINT) -> i32 #foreign #dll_import -ScreenToClient :: proc(h: HWND, p: ^POINT) -> i32 #foreign #dll_import -GetModuleHandleA :: proc(module_name: ^u8) -> HINSTANCE #foreign #dll_import -GetStockObject :: proc(fn_object: i32) -> HGDIOBJ #foreign #dll_import -PostQuitMessage :: proc(exit_code: i32) #foreign #dll_import -SetWindowTextA :: proc(hwnd: HWND, c_string: ^u8) -> BOOL #foreign #dll_import - -QueryPerformanceFrequency :: proc(result: ^i64) -> i32 #foreign #dll_import -QueryPerformanceCounter :: proc(result: ^i64) -> i32 #foreign #dll_import - -Sleep :: proc(ms: i32) -> i32 #foreign #dll_import - -OutputDebugStringA :: proc(c_str: ^u8) #foreign #dll_import - - -RegisterClassExA :: proc(wc: ^WNDCLASSEXA) -> ATOM #foreign #dll_import -CreateWindowExA :: proc(ex_style: u32, - class_name, title: ^u8, - style: u32, - x, y, w, h: i32, - parent: HWND, menu: HMENU, instance: HINSTANCE, - param: rawptr) -> HWND #foreign #dll_import - -ShowWindow :: proc(hwnd: HWND, cmd_show: i32) -> BOOL #foreign #dll_import -TranslateMessage :: proc(msg: ^MSG) -> BOOL #foreign #dll_import -DispatchMessageA :: proc(msg: ^MSG) -> LRESULT #foreign #dll_import -UpdateWindow :: proc(hwnd: HWND) -> BOOL #foreign #dll_import -PeekMessageA :: proc(msg: ^MSG, hwnd: HWND, - msg_filter_min, msg_filter_max, remove_msg: u32) -> BOOL #foreign #dll_import - -DefWindowProcA :: proc(hwnd: HWND, msg: u32, wparam: WPARAM, lparam: LPARAM) -> LRESULT #foreign #dll_import - -AdjustWindowRect :: proc(rect: ^RECT, style: u32, menu: BOOL) -> BOOL #foreign #dll_import - - -GetQueryPerformanceFrequency :: proc() -> i64 { - r: i64 - QueryPerformanceFrequency(^r) - return r -} - -GetCommandLineA :: proc() -> ^u8 #foreign #dll_import -GetSystemMetrics :: proc(index: i32) -> i32 #foreign #dll_import -GetCurrentThreadId :: proc() -> u32 #foreign #dll_import - -// File Stuff - -CloseHandle :: proc(h: HANDLE) -> i32 #foreign #dll_import -GetStdHandle :: proc(h: i32) -> HANDLE #foreign #dll_import -CreateFileA :: proc(filename: ^u8, desired_access, share_mode: u32, - security: rawptr, - creation, flags_and_attribs: u32, template_file: HANDLE) -> HANDLE #foreign #dll_import -ReadFile :: proc(h: HANDLE, buf: rawptr, to_read: u32, bytes_read: ^i32, overlapped: rawptr) -> BOOL #foreign #dll_import -WriteFile :: proc(h: HANDLE, buf: rawptr, len: i32, written_result: ^i32, overlapped: rawptr) -> i32 #foreign #dll_import - -GetFileSizeEx :: proc(file_handle: HANDLE, file_size: ^i64) -> BOOL #foreign #dll_import -GetFileAttributesExA :: proc(filename: ^u8, info_level_id: GET_FILEEX_INFO_LEVELS, file_info: rawptr) -> BOOL #foreign #dll_import -GetFileInformationByHandle :: proc(file_handle: HANDLE, file_info: ^BY_HANDLE_FILE_INFORMATION) -> BOOL #foreign #dll_import - -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 - -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 - - - - - -HeapAlloc :: proc(h: HANDLE, flags: u32, bytes: int) -> rawptr #foreign #dll_import -HeapReAlloc :: proc(h: HANDLE, flags: u32, memory: rawptr, bytes: int) -> rawptr #foreign #dll_import -HeapFree :: proc(h: HANDLE, flags: u32, memory: rawptr) -> BOOL #foreign #dll_import -GetProcessHeap :: proc() -> HANDLE #foreign #dll_import - - -HEAP_ZERO_MEMORY :: 0x00000008 - -// Synchronization - -SECURITY_ATTRIBUTES :: struct #ordered { - length: u32 - security_descriptor: rawptr - inherit_handle: BOOL -} - -INFINITE :: 0xffffffff - -CreateSemaphoreA :: proc(attributes: ^SECURITY_ATTRIBUTES, initial_count, maximum_count: i32, name: ^byte) -> HANDLE #foreign #dll_import -ReleaseSemaphore :: proc(semaphore: HANDLE, release_count: i32, previous_count: ^i32) -> BOOL #foreign #dll_import -WaitForSingleObject :: proc(handle: HANDLE, milliseconds: u32) -> u32 #foreign #dll_import - - -InterlockedCompareExchange :: proc(dst: ^i32, exchange, comparand: i32) -> i32 #foreign -InterlockedExchange :: proc(dst: ^i32, desired: i32) -> i32 #foreign -InterlockedExchangeAdd :: proc(dst: ^i32, desired: i32) -> i32 #foreign -InterlockedAnd :: proc(dst: ^i32, desired: i32) -> i32 #foreign -InterlockedOr :: proc(dst: ^i32, desired: i32) -> i32 #foreign - -InterlockedCompareExchange64 :: proc(dst: ^i64, exchange, comparand: i64) -> i64 #foreign -InterlockedExchange64 :: proc(dst: ^i64, desired: i64) -> i64 #foreign -InterlockedExchangeAdd64 :: proc(dst: ^i64, desired: i64) -> i64 #foreign -InterlockedAnd64 :: proc(dst: ^i64, desired: i64) -> i64 #foreign -InterlockedOr64 :: proc(dst: ^i64, desired: i64) -> i64 #foreign - -_mm_pause :: proc() #foreign -ReadWriteBarrier :: proc() #foreign -WriteBarrier :: proc() #foreign -ReadBarrier :: proc() #foreign - - -// GDI - -BITMAPINFO :: struct #ordered { - HEADER :: struct #ordered { - size: u32 - width, height: i32 - planes, bit_count: i16 - compression: u32 - size_image: u32 - x_pels_per_meter: i32 - y_pels_per_meter: i32 - clr_used: u32 - clr_important: u32 - } - using header: HEADER - colors: [1]RGBQUAD -} - - -RGBQUAD :: struct #ordered { - blue, green, red, reserved: byte -} - -BI_RGB :: 0 -DIB_RGB_COLORS :: 0x00 -SRCCOPY :: 0x00cc0020 as u32 - -StretchDIBits :: proc(hdc: HDC, - x_dst, y_dst, width_dst, height_dst: i32, - x_src, y_src, width_src, header_src: i32, - bits: rawptr, bits_info: ^BITMAPINFO, - usage: u32, - rop: u32) -> i32 #foreign #dll_import - - - -LoadLibraryA :: proc(c_str: ^u8) -> HMODULE #foreign -FreeLibrary :: proc(h: HMODULE) #foreign -GetProcAddress :: proc(h: HMODULE, c_str: ^u8) -> rawptr #foreign - -GetClientRect :: proc(hwnd: HWND, rect: ^RECT) -> BOOL #foreign - - - -// Windows OpenGL - -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 - -HGLRC :: type HANDLE -PROC :: type proc() -wglCreateContextAttribsARBType :: type proc(hdc: HDC, hshareContext: rawptr, attribList: ^i32) -> HGLRC - - -PIXELFORMATDESCRIPTOR :: struct #ordered { - size, - version, - flags: u32 - - pixel_type, - color_bits, - red_bits, - red_shift, - green_bits, - green_shift, - blue_bits, - blue_shift, - alpha_bits, - alpha_shift, - accum_bits, - accum_red_bits, - accum_green_bits, - accum_blue_bits, - accum_alpha_bits, - depth_bits, - stencil_bits, - aux_buffers, - layer_type, - reserved: byte - - layer_mask, - visible_mask, - damage_mask: u32 -} - -GetDC :: proc(h: HANDLE) -> HDC #foreign -SetPixelFormat :: proc(hdc: HDC, pixel_format: i32, pfd: ^PIXELFORMATDESCRIPTOR ) -> BOOL #foreign #dll_import -ChoosePixelFormat :: proc(hdc: HDC, pfd: ^PIXELFORMATDESCRIPTOR) -> i32 #foreign #dll_import -SwapBuffers :: proc(hdc: HDC) -> BOOL #foreign #dll_import -ReleaseDC :: proc(wnd: HWND, hdc: HDC) -> i32 #foreign #dll_import - -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 - -wglCreateContext :: proc(hdc: HDC) -> HGLRC #foreign #dll_import -wglMakeCurrent :: proc(hdc: HDC, hglrc: HGLRC) -> BOOL #foreign #dll_import -wglGetProcAddress :: proc(c_str: ^u8) -> PROC #foreign #dll_import -wglDeleteContext :: proc(hglrc: HGLRC) -> BOOL #foreign #dll_import - - - -GetKeyState :: proc(v_key: i32) -> i16 #foreign #dll_import -GetAsyncKeyState :: proc(v_key: i32) -> i16 #foreign #dll_import - -is_key_down :: proc(key: Key_Code) -> bool { - return GetAsyncKeyState(key as i32) < 0 -} - -Key_Code :: enum i32 { - LBUTTON = 0x01, - RBUTTON = 0x02, - CANCEL = 0x03, - MBUTTON = 0x04, - - BACK = 0x08, - TAB = 0x09, - - CLEAR = 0x0C, - RETURN = 0x0D, - - SHIFT = 0x10, - CONTROL = 0x11, - MENU = 0x12, - PAUSE = 0x13, - CAPITAL = 0x14, - - KANA = 0x15, - HANGEUL = 0x15, - HANGUL = 0x15, - JUNJA = 0x17, - FINAL = 0x18, - HANJA = 0x19, - KANJI = 0x19, - - ESCAPE = 0x1B, - - CONVERT = 0x1C, - NONCONVERT = 0x1D, - ACCEPT = 0x1E, - MODECHANGE = 0x1F, - - SPACE = 0x20, - PRIOR = 0x21, - NEXT = 0x22, - END = 0x23, - HOME = 0x24, - LEFT = 0x25, - UP = 0x26, - RIGHT = 0x27, - DOWN = 0x28, - SELECT = 0x29, - PRINT = 0x2A, - EXECUTE = 0x2B, - SNAPSHOT = 0x2C, - INSERT = 0x2D, - DELETE = 0x2E, - HELP = 0x2F, - - NUM0 = '0', - NUM1 = '1', - NUM2 = '2', - NUM3 = '3', - NUM4 = '4', - NUM5 = '5', - NUM6 = '6', - NUM7 = '7', - NUM8 = '8', - NUM9 = '9', - - A = 'A', - B = 'B', - C = 'C', - D = 'D', - E = 'E', - F = 'F', - G = 'G', - H = 'H', - I = 'I', - J = 'J', - K = 'K', - L = 'L', - M = 'M', - N = 'N', - O = 'O', - P = 'P', - Q = 'Q', - R = 'R', - S = 'S', - T = 'T', - U = 'U', - V = 'V', - W = 'W', - X = 'X', - Y = 'Y', - Z = 'Z', - - LWIN = 0x5B, - RWIN = 0x5C, - APPS = 0x5D, - - NUMPAD0 = 0x60, - NUMPAD1 = 0x61, - NUMPAD2 = 0x62, - NUMPAD3 = 0x63, - NUMPAD4 = 0x64, - NUMPAD5 = 0x65, - NUMPAD6 = 0x66, - NUMPAD7 = 0x67, - NUMPAD8 = 0x68, - NUMPAD9 = 0x69, - MULTIPLY = 0x6A, - ADD = 0x6B, - SEPARATOR = 0x6C, - SUBTRACT = 0x6D, - DECIMAL = 0x6E, - DIVIDE = 0x6F, - F1 = 0x70, - F2 = 0x71, - F3 = 0x72, - F4 = 0x73, - F5 = 0x74, - F6 = 0x75, - F7 = 0x76, - F8 = 0x77, - F9 = 0x78, - F10 = 0x79, - F11 = 0x7A, - F12 = 0x7B, - F13 = 0x7C, - F14 = 0x7D, - F15 = 0x7E, - F16 = 0x7F, - F17 = 0x80, - F18 = 0x81, - F19 = 0x82, - F20 = 0x83, - F21 = 0x84, - F22 = 0x85, - F23 = 0x86, - F24 = 0x87, - - NUMLOCK = 0x90, - SCROLL = 0x91, - - LSHIFT = 0xA0, - RSHIFT = 0xA1, - LCONTROL = 0xA2, - RCONTROL = 0xA3, - LMENU = 0xA4, - RMENU = 0xA5, - PROCESSKEY = 0xE5, - ATTN = 0xF6, - CRSEL = 0xF7, - EXSEL = 0xF8, - EREOF = 0xF9, - PLAY = 0xFA, - ZOOM = 0xFB, - NONAME = 0xFC, - PA1 = 0xFD, - OEM_CLEAR = 0xFE, -} - diff --git a/roadmap.md b/roadmap.md index 762068550..83fbbb695 100644 --- a/roadmap.md +++ b/roadmap.md @@ -2,23 +2,20 @@ Not in any particular order -* Compile Time Execution (CTE) - - More metaprogramming madness - - Compiler as a library - - AST inspection and modification -* CTE-based build system -* Replace LLVM backend with my own custom backend -* Improve SSA design to accommodate for lowering to a "bytecode" -* SSA optimizations -* Parametric Polymorphism -* Documentation Generator for "Entities" -* Multiple Architecture support -* Linking Options +* Custom backend to replace LLVM + - Improve SSA design to accommodate for lowering to a "bytecode" + - SSA optimizations + - COFF generation + - linker +* Type safe "macros" +* Documentation generator for "Entities" +* Multiple architecture support +* Inline assembly +* Linking options - Executable - Static/Dynamic Library -* Debug Information +* Debug information - pdb format too -* Command Line Tooling -* Compiler Internals: +* Command line tooling +* Compiler internals: - Big numbers library - - Cyclic Type Checking (at the moment will cause compiler to go into an infinite loop) diff --git a/src/checker/checker.c b/src/checker/checker.c index 5bf066c1a..12982f1ac 100644 --- a/src/checker/checker.c +++ b/src/checker/checker.c @@ -991,17 +991,22 @@ void init_preload(Checker *c) { } if (t_type_info == NULL) { - Entity *e = current_scope_lookup_entity(c->global_scope, str_lit("Type_Info")); - if (e == NULL) { + Entity *type_info_entity = current_scope_lookup_entity(c->global_scope, str_lit("Type_Info")); + if (type_info_entity == NULL) { compiler_error("Could not find type declaration for `Type_Info`\n" "Is `runtime.odin` missing from the `core` directory relative to odin.exe?"); } - t_type_info = e->type; + Entity *type_info_member_entity = current_scope_lookup_entity(c->global_scope, str_lit("Type_Info_Member")); + if (type_info_entity == NULL) { + compiler_error("Could not find type declaration for `Type_Info_Member`\n" + "Is `runtime.odin` missing from the `core` directory relative to odin.exe?"); + } + t_type_info = type_info_entity->type; t_type_info_ptr = make_type_pointer(c->allocator, t_type_info); - GB_ASSERT(is_type_union(e->type)); - TypeRecord *record = &base_type(e->type)->Record; + GB_ASSERT(is_type_union(type_info_entity->type)); + TypeRecord *record = &base_type(type_info_entity->type)->Record; - t_type_info_member = record->other_fields[0]->type; + t_type_info_member = type_info_member_entity->type; t_type_info_member_ptr = make_type_pointer(c->allocator, t_type_info_member); if (record->field_count != 18) { diff --git a/src/checker/stmt.c b/src/checker/stmt.c index e3929efe9..9e3efc204 100644 --- a/src/checker/stmt.c +++ b/src/checker/stmt.c @@ -372,10 +372,13 @@ void check_stmt_internal(Checker *c, AstNode *node, u32 flags) { Operand operand = {Addressing_Invalid}; check_expr(c, &operand, ids->expr); - if (operand.mode == Addressing_Invalid) + if (operand.mode == Addressing_Invalid) { return; - if (!is_type_numeric(operand.type)) { - error(ids->op, "Non numeric type"); + } + if (!is_type_numeric(operand.type) && !is_type_pointer(operand.type)) { + gbString type_str = type_to_string(operand.type); + error(ids->op, "Non numeric type `%s`", type_str); + gb_string_free(type_str); return; } diff --git a/src/parser.c b/src/parser.c index 62c8902b0..b075f79e6 100644 --- a/src/parser.c +++ b/src/parser.c @@ -1183,33 +1183,33 @@ Token expect_closing(AstFile *f, TokenKind kind, String context) { } void expect_semicolon(AstFile *f, AstNode *s) { - if (f->prev_token.kind == Token_CloseBrace || - f->prev_token.kind == Token_CloseBrace) { + if (allow_token(f, Token_Semicolon)) { return; } + Token prev_token = f->prev_token; - if (f->curr_token.kind != Token_CloseParen && - f->curr_token.kind != Token_CloseBrace) { - switch (f->curr_token.kind) { - case Token_Comma: - expect_token(f, Token_Semicolon); - /*fallthrough*/ - case Token_Semicolon: - next_token(f); + switch (f->curr_token.kind) { + case Token_EOF: + return; + } + + if (s != NULL) { + switch (s->kind) { + case AstNode_ProcDecl: + return; + case AstNode_TypeDecl: + if (f->prev_token.kind == Token_CloseBrace) { + return; + } break; - default: - expect_token(f, Token_Semicolon); - fix_advance_to_next_stmt(f); } - } - // if (s != NULL) { - // syntax_error(f->prev_token, "Expected `;` after %.*s, got `%.*s`", - // LIT(ast_node_strings[s->kind]), LIT(token_strings[f->prev_token.kind])); - // } else { - // syntax_error(f->prev_token, "Expected `;`"); - // } - // fix_advance_to_next_stmt(f); + syntax_error(prev_token, "Expected `;` after %.*s, got %.*s", + LIT(ast_node_strings[s->kind]), LIT(token_strings[prev_token.kind])); + } else { + syntax_error(prev_token, "Expected `;`"); + } + fix_advance_to_next_stmt(f); } bool parse_at_comma(AstFile *f, String context, TokenKind follow) { @@ -2497,8 +2497,6 @@ AstNode *parse_if_stmt(AstFile *f) { else_stmt = make_bad_stmt(f, f->curr_token, f->tokens.e[f->curr_token_index+1]); break; } - } else { - expect_semicolon(f, body); } return make_if_stmt(f, token, init, cond, body, else_stmt); @@ -2935,8 +2933,8 @@ AstNode *parse_stmt(AstFile *f) { s = make_bad_decl(f, token, file_path); } else { s = make_import_decl(f, hash_token, file_path, import_name, cond, false); - expect_semicolon(f, s); } + expect_semicolon(f, s); return s; } else if (str_eq(tag, str_lit("include"))) { AstNode *cond = NULL; @@ -2984,6 +2982,7 @@ AstNode *parse_stmt(AstFile *f) { return s; } + expect_semicolon(f, s); return make_tag_stmt(f, hash_token, name, parse_stmt(f)); } break; diff --git a/src/tokenizer.c b/src/tokenizer.c index 5d1d63a1b..1839abdc2 100644 --- a/src/tokenizer.c +++ b/src/tokenizer.c @@ -304,8 +304,6 @@ typedef struct Tokenizer { u8 * line; // current line pos isize line_count; - bool insert_semicolon; // Inserts a semicolon before the next newline - isize error_count; Array(String) allocated_strings; } Tokenizer; @@ -418,7 +416,7 @@ gb_inline void destroy_tokenizer(Tokenizer *t) { void tokenizer_skip_whitespace(Tokenizer *t) { while (t->curr_rune == ' ' || t->curr_rune == '\t' || - (t->curr_rune == '\n' && !t->insert_semicolon) || + t->curr_rune == '\n' || t->curr_rune == '\r') { advance_to_next_rune(t); } @@ -677,8 +675,6 @@ Token tokenizer_get_token(Tokenizer *t) { token.pos.line = t->line_count; token.pos.column = t->curr - t->line + 1; - bool insert_semicolon = false; - Rune curr_rune = t->curr_rune; if (rune_is_letter(curr_rune)) { token.kind = Token_Ident; @@ -706,48 +702,19 @@ Token tokenizer_get_token(Tokenizer *t) { } } } - - switch (token.kind) { - case Token_Ident: - case Token_return: - case Token_break: - case Token_continue: - case Token_fallthrough: - insert_semicolon = true; - break; - } - } else { - insert_semicolon = true; } } else if (gb_is_between(curr_rune, '0', '9')) { - insert_semicolon = true; token = scan_number_to_token(t, false); } else { advance_to_next_rune(t); switch (curr_rune) { case GB_RUNE_EOF: - if (t->insert_semicolon) { - t->insert_semicolon = false; - token.string = str_lit("\n"); - token.kind = Token_Semicolon; - return token; - } token.kind = Token_EOF; break; - case '\n': - // NOTE(bill): This will be only be reached if t->insert_semicolom was set - // earlier and exited early from tokenizer_skip_whitespace() - t->insert_semicolon = false; - token.string = str_lit("\n"); - token.kind = Token_Semicolon; - return token; - case '\'': // Rune Literal { - insert_semicolon = true; - token.kind = Token_Rune; Rune quote = curr_rune; bool valid = true; @@ -780,7 +747,6 @@ Token tokenizer_get_token(Tokenizer *t) { if (success == 2) { array_add(&t->allocated_strings, token.string); } - t->insert_semicolon = true; return token; } else { tokenizer_err(t, "Invalid rune literal"); @@ -790,8 +756,6 @@ Token tokenizer_get_token(Tokenizer *t) { case '`': // Raw String Literal case '"': // String Literal { - insert_semicolon = true; - i32 success; Rune quote = curr_rune; token.kind = Token_String; @@ -829,7 +793,6 @@ Token tokenizer_get_token(Tokenizer *t) { if (success == 2) { array_add(&t->allocated_strings, token.string); } - t->insert_semicolon = true; return token; } else { tokenizer_err(t, "Invalid string literal"); @@ -839,7 +802,6 @@ Token tokenizer_get_token(Tokenizer *t) { case '.': token.kind = Token_Period; // Default if (gb_is_between(t->curr_rune, '0', '9')) { // Might be a number - insert_semicolon = true; token = scan_number_to_token(t, true); } else if (t->curr_rune == '.') { // Could be an ellipsis advance_to_next_rune(t); @@ -881,21 +843,18 @@ Token tokenizer_get_token(Tokenizer *t) { token.kind = Token_OpenParen; break; case ')': - insert_semicolon = true; token.kind = Token_CloseParen; break; case '[': token.kind = Token_OpenBracket; break; case ']': - insert_semicolon = true; token.kind = Token_CloseBracket; break; case '{': token.kind = Token_OpenBrace; break; case '}': - insert_semicolon = true; token.kind = Token_CloseBrace; break; @@ -906,56 +865,37 @@ Token tokenizer_get_token(Tokenizer *t) { case '!': token.kind = token_kind_variant2(t, Token_Not, Token_NotEq); break; case '+': token.kind = token_kind_variant3(t, Token_Add, Token_AddEq, '+', Token_Increment); - if (token.kind == Token_Increment) { - insert_semicolon = true; - } break; case '-': token.kind = token_kind_variant4(t, Token_Sub, Token_SubEq, '-', Token_Decrement, '>', Token_ArrowRight); - if (token.kind == Token_Decrement) { - insert_semicolon = true; - } break; case '/': { - if (t->curr_rune == '/' || t->curr_rune == '*') { - if (t->insert_semicolon && tokenizer_find_line_end(t)) { - t->curr_rune = '/'; - t->curr = token.string.text; - t->read_curr = t->curr+1; - t->insert_semicolon = false; - - token.kind = Token_Semicolon; - token.string = str_lit("\n"); - return token; + if (t->curr_rune == '/') { + while (t->curr_rune != '\n') { + advance_to_next_rune(t); } - - if (t->curr_rune == '/') { - while (t->curr_rune != '\n') { + token.kind = Token_Comment; + } else if (t->curr_rune == '*') { + isize comment_scope = 1; + advance_to_next_rune(t); + while (comment_scope > 0) { + if (t->curr_rune == '/') { advance_to_next_rune(t); - } - token.kind = Token_Comment; - } else if (t->curr_rune == '*') { - isize comment_scope = 1; - advance_to_next_rune(t); - while (comment_scope > 0) { - if (t->curr_rune == '/') { + if (t->curr_rune == '*') { advance_to_next_rune(t); - if (t->curr_rune == '*') { - advance_to_next_rune(t); - comment_scope++; - } - } else if (t->curr_rune == '*') { - advance_to_next_rune(t); - if (t->curr_rune == '/') { - advance_to_next_rune(t); - comment_scope--; - } - } else { + comment_scope++; + } + } else if (t->curr_rune == '*') { + advance_to_next_rune(t); + if (t->curr_rune == '/') { advance_to_next_rune(t); + comment_scope--; } + } else { + advance_to_next_rune(t); } - token.kind = Token_Comment; } + token.kind = Token_Comment; } else { token.kind = token_kind_variant2(t, Token_Quo, Token_QuoEq); } @@ -994,14 +934,11 @@ Token tokenizer_get_token(Tokenizer *t) { int len = cast(int)gb_utf8_encode_rune(str, curr_rune); tokenizer_err(t, "Illegal character: %.*s (%d) ", len, str, curr_rune); } - insert_semicolon = t->insert_semicolon; token.kind = Token_Invalid; break; } } - t->insert_semicolon = insert_semicolon; - token.string.len = t->curr - token.string.text; return token; } |