aboutsummaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authorKarl Zylinski <karl@zylinski.se>2025-12-26 23:02:35 +0100
committerKarl Zylinski <karl@zylinski.se>2025-12-26 23:02:35 +0100
commit7e39239907885447b73c8c03648a85554552f1bc (patch)
tree652d2ac6b3031cfdc3db38a95b5818545dcfd8c7
parent2e6554b8c85c904eb1eb010f0312641be800823f (diff)
WebGL: Add GetActiveAttrib binding
-rw-r--r--core/sys/wasm/js/odin.js21
-rw-r--r--vendor/wasm/WebGL/webgl.odin44
2 files changed, 64 insertions, 1 deletions
diff --git a/core/sys/wasm/js/odin.js b/core/sys/wasm/js/odin.js
index ef203e24d..ca4af18b8 100644
--- a/core/sys/wasm/js/odin.js
+++ b/core/sys/wasm/js/odin.js
@@ -625,6 +625,26 @@ class WebGLInterface {
this.ctx.generateMipmap(target);
},
+ GetActiveAttrib: (program, index, size_ptr, type_ptr, name_buf_ptr, name_buf_len, name_len_ptr) => {
+ let info = this.ctx.getActiveAttrib(program, index);
+
+ if (size_ptr) {
+ this.mem.storeInt(size_ptr, info.size);
+ }
+
+ if (type_ptr) {
+ this.mem.storeI32(type_ptr, info.type);
+ }
+
+ if name_buf_ptr && name_buf_len > 0 {
+ let n = Math.min(name_buf_len, info.name.length);
+ let name = info.name.substring(0, n);
+ this.mem.loadBytes(name_buf_ptr, name_buf_len).set(new TextEncoder().encode(name));
+ this.mem.storeInt(name_len_ptr, n);
+ } else if name_len_ptr {
+ this.mem.storeInt(name_len_ptr, info.name.length);
+ }
+ },
GetAttribLocation: (program, name_ptr, name_len) => {
let name = this.mem.loadString(name_ptr, name_len);
@@ -1840,6 +1860,7 @@ function odinSetupDefaultImports(wasmMemoryInterface, consoleElement, memory) {
return false;
},
+ // Writes a struct of type `Gamepad_State`, see `core/sys/wasm/js/events.odin`
get_gamepad_state: (gamepad_id, ep) => {
let index = gamepad_id;
let gps = navigator.getGamepads();
diff --git a/vendor/wasm/WebGL/webgl.odin b/vendor/wasm/WebGL/webgl.odin
index 5616f3660..1c3bda2e6 100644
--- a/vendor/wasm/WebGL/webgl.odin
+++ b/vendor/wasm/WebGL/webgl.odin
@@ -3,6 +3,7 @@ package webgl
foreign import "webgl"
import glm "core:math/linalg/glsl"
+import "base:runtime"
Enum :: distinct u32
@@ -25,6 +26,12 @@ ContextAttribute :: enum u32 {
}
ContextAttributes :: distinct bit_set[ContextAttribute; u32]
+ActiveInfo :: struct {
+ size: int,
+ type: Enum,
+ name: string,
+}
+
DEFAULT_CONTEXT_ATTRIBUTES :: ContextAttributes{}
@(default_calling_convention="contextless")
@@ -260,7 +267,6 @@ UniformMatrix4fv :: proc "contextless" (location: i32, m: glm.mat4) {
value := transmute([4*4]f32)m
_UniformMatrix4fv(location, &value[0])
}
-
GetShaderiv :: proc "contextless" (shader: Shader, pname: Enum) -> (p: i32) {
foreign webgl {
@(link_name="GetShaderiv")
@@ -270,6 +276,42 @@ GetShaderiv :: proc "contextless" (shader: Shader, pname: Enum) -> (p: i32) {
return
}
+GetActiveAttribBuf :: proc "contextless" (program: Program, index: u32, name_buf: []byte) -> (info: ActiveInfo) {
+ foreign webgl {
+ @(link_name="GetActiveAttrib")
+ _GetActiveAttrib :: proc "contextless" (shader: Program, index: u32, size: ^int, type: ^Enum, name_buf: []byte, name_len: ^int) ---
+ }
+ name_len: int
+ _GetActiveAttrib(program, index, &info.size, &info.type, name_buf, &name_len)
+ info.name = string(name_buf[:name_len])
+ return
+}
+
+GetActiveAttribAlloc :: proc(program: Program, index: u32, allocator: runtime.Allocator, loc := #caller_location) -> (info: ActiveInfo) {
+ foreign webgl {
+ @(link_name="GetActiveAttrib")
+ _GetActiveAttrib :: proc "contextless" (shader: Program, index: u32, size: ^int, type: ^Enum, name_buf: []byte, name_len: ^int) ---
+ }
+
+ name_len: int
+
+ // Passing {} to the buf but giving it a name_len ptr will write the needed len into that int
+ _GetActiveAttrib(program, index, &info.size, &info.type, {}, &name_len)
+
+ if name_len > 0 {
+ name_buf := make([]byte, name_len, allocator, loc)
+ _GetActiveAttrib(program, index, &info.size, &info.type, name_buf, &name_len)
+ assert(name_len == len(name_buf))
+ info.name = string(name_buf[:name_len])
+ }
+
+ return
+}
+
+GetActiveAttrib :: proc {
+ GetActiveAttribBuf,
+ GetActiveAttribAlloc,
+}
GetProgramInfoLog :: proc "contextless" (program: Program, buf: []byte) -> string {
foreign webgl {