浏览代码

Merge pull request #5567 from alexriedl/webgl-binding-fixes

Webgl binding fixes
gingerBill 1 月之前
父节点
当前提交
dbc338248e
共有 3 个文件被更改,包括 96 次插入9 次删除
  1. 37 0
      core/sys/wasm/js/odin.js
  2. 58 8
      vendor/wasm/WebGL/webgl.odin
  3. 1 1
      vendor/wasm/WebGL/webgl2.odin

+ 37 - 0
core/sys/wasm/js/odin.js

@@ -392,6 +392,9 @@ class WebGLInterface {
 			BindTexture: (target, texture) => {
 				this.ctx.bindTexture(target, texture ? this.textures[texture] : null)
 			},
+			BindRenderbuffer: (target, renderbuffer) => {
+				this.ctx.bindRenderbuffer(target, renderbuffer ? this.renderbuffers[renderbuffer] : null)
+			},
 			BlendColor: (red, green, blue, alpha) => {
 				this.ctx.blendColor(red, green, blue, alpha);
 			},
@@ -809,6 +812,40 @@ class WebGLInterface {
 			Uniform3i: (location, v0, v1, v2)     => { this.ctx.uniform3i(this.uniforms[location], v0, v1, v2);     },
 			Uniform4i: (location, v0, v1, v2, v3) => { this.ctx.uniform4i(this.uniforms[location], v0, v1, v2, v3); },
 
+			Uniform1fv: (location, count, addr) => {
+				let array = this.mem.loadF32Array(addr, 1*count);
+				this.ctx.uniform1fv(this.uniforms[location], array);
+			},
+			Uniform2fv: (location, count, addr) => {
+				let array = this.mem.loadF32Array(addr, 2*count);
+				this.ctx.uniform2fv(this.uniforms[location], array);
+			},
+			Uniform3fv: (location, count, addr) => {
+				let array = this.mem.loadF32Array(addr, 3*count);
+				this.ctx.uniform3fv(this.uniforms[location], array);
+			},
+			Uniform4fv: (location, count, addr) => {
+				let array = this.mem.loadF32Array(addr, 4*count);
+				this.ctx.uniform4fv(this.uniforms[location], array);
+			},
+
+			Uniform1iv: (location, count, addr) => {
+				let array = this.mem.loadI32Array(addr, 1*count);
+				this.ctx.uniform1iv(this.uniforms[location], array);
+			},
+			Uniform2iv: (location, count, addr) => {
+				let array = this.mem.loadI32Array(addr, 2*count);
+				this.ctx.uniform2iv(this.uniforms[location], array);
+			},
+			Uniform3iv: (location, count, addr) => {
+				let array = this.mem.loadI32Array(addr, 3*count);
+				this.ctx.uniform3iv(this.uniforms[location], array);
+			},
+			Uniform4iv: (location, count, addr) => {
+				let array = this.mem.loadI32Array(addr, 4*count);
+				this.ctx.uniform4iv(this.uniforms[location], array);
+			},
+
 			UniformMatrix2fv: (location, addr) => {
 				let array = this.mem.loadF32Array(addr, 2*2);
 				this.ctx.uniformMatrix2fv(this.uniforms[location], false, array);

+ 58 - 8
vendor/wasm/WebGL/webgl.odin

@@ -52,6 +52,7 @@ foreign webgl {
 	BindBuffer            :: proc(target: Enum, buffer: Buffer) ---
 	BindFramebuffer       :: proc(target: Enum, framebuffer: Framebuffer) ---
 	BindTexture           :: proc(target: Enum, texture: Texture) ---
+	BindRenderbuffer      :: proc(target: Enum, renderbuffer: Renderbuffer) ---
 	BlendColor            :: proc(red, green, blue, alpha: f32) ---
 	BlendEquation         :: proc(mode: Enum) ---
 	BlendEquationSeparate :: proc(modeRGB: Enum, modeAlpha: Enum) ---
@@ -172,14 +173,63 @@ foreign webgl {
 	Viewport :: proc(x, y, w, h: i32) ---
 }
 
-Uniform1fv :: proc "contextless" (location: i32, v: f32)       { Uniform1f(location, v) }
-Uniform2fv :: proc "contextless" (location: i32, v: glm.vec2)  { Uniform2f(location, v.x, v.y) }
-Uniform3fv :: proc "contextless" (location: i32, v: glm.vec3)  { Uniform3f(location, v.x, v.y, v.z) }
-Uniform4fv :: proc "contextless" (location: i32, v: glm.vec4)  { Uniform4f(location, v.x, v.y, v.z, v.w) }
-Uniform1iv :: proc "contextless" (location: i32, v: i32)       { Uniform1i(location, v) }
-Uniform2iv :: proc "contextless" (location: i32, v: glm.ivec2) { Uniform2i(location, v.x, v.y) }
-Uniform3iv :: proc "contextless" (location: i32, v: glm.ivec3) { Uniform3i(location, v.x, v.y, v.z) }
-Uniform4iv :: proc "contextless" (location: i32, v: glm.ivec4) { Uniform4i(location, v.x, v.y, v.z, v.w) }
+Uniform1fv :: proc "contextless" (location: i32, v: []f32) {
+	foreign webgl {
+		@(link_name="Uniform1fv")
+		_Uniform1fv :: proc "contextless" (location: i32, count: int, value: [^]f32) ---
+	}
+	_Uniform1fv(location, len(v), &v[0])
+}
+Uniform2fv :: proc "contextless" (location: i32, v: []glm.vec2) {
+	foreign webgl {
+		@(link_name="Uniform2fv")
+		_Uniform2fv :: proc "contextless" (location: i32, count: int, value: [^]f32) ---
+	}
+	_Uniform2fv(location, len(v), &v[0].x)
+}
+Uniform3fv :: proc "contextless" (location: i32, v: []glm.vec3) {
+	foreign webgl {
+		@(link_name="Uniform3fv")
+		_Uniform3fv :: proc "contextless" (location: i32, count: int, value: [^]f32) ---
+	}
+	_Uniform3fv(location, len(v), &v[0].x)
+}
+Uniform4fv :: proc "contextless" (location: i32, v: []glm.vec4) {
+	foreign webgl {
+		@(link_name="Uniform4fv")
+		_Uniform4fv :: proc "contextless" (location: i32, count: int, value: [^]f32) ---
+	}
+	_Uniform4fv(location, len(v), &v[0].x)
+}
+
+Uniform1iv :: proc "contextless" (location: i32, v: []i32) {
+	foreign webgl {
+		@(link_name="Uniform1iv")
+		_Uniform1iv :: proc "contextless" (location: i32, count: int, value: [^]i32) ---
+	}
+	_Uniform1iv(location, len(v), &v[0])
+}
+Uniform2iv :: proc "contextless" (location: i32, v: []glm.ivec2) {
+	foreign webgl {
+		@(link_name="Uniform2iv")
+		_Uniform2iv :: proc "contextless" (location: i32, count: int, value: [^]i32) ---
+	}
+	_Uniform2iv(location, len(v), &v[0].x)
+}
+Uniform3iv :: proc "contextless" (location: i32, v: []glm.ivec3) {
+	foreign webgl {
+		@(link_name="Uniform3iv")
+		_Uniform3iv :: proc "contextless" (location: i32, count: int, value: [^]i32) ---
+	}
+	_Uniform3iv(location, len(v), &v[0].x)
+}
+Uniform4iv :: proc "contextless" (location: i32, v: []glm.ivec4) {
+	foreign webgl {
+		@(link_name="Uniform4iv")
+		_Uniform4iv :: proc "contextless" (location: i32, count: int, value: [^]i32) ---
+	}
+	_Uniform4iv(location, len(v), &v[0].x)
+}
 
 VertexAttrib1fv :: proc "contextless" (index: i32, v: f32)     { VertexAttrib1f(index, v) }
 VertexAttrib2fv :: proc "contextless" (index: i32, v: glm.vec2){ VertexAttrib2f(index, v.x, v.y) }

+ 1 - 1
vendor/wasm/WebGL/webgl2.odin

@@ -36,7 +36,7 @@ foreign webgl2 {
 	/* Texture objects */
 	TexStorage3D            :: proc(target: Enum, levels: i32, internalformat: Enum, width, height, depth: i32) ---
 	TexImage3D              :: proc(target: Enum, level: i32, internalformat: Enum, width, height, depth: i32, border: i32, format, type: Enum, size: int, data: rawptr) ---
-	TexSubImage3D           :: proc(target: Enum, level: i32, xoffset, yoffset, width, height, depth: i32, format, type: Enum, size: int, data: rawptr) ---
+	TexSubImage3D           :: proc(target: Enum, level: i32, xoffset, yoffset, zoffset, width, height, depth: i32, format, type: Enum, size: int, data: rawptr) ---
 	CompressedTexImage3D    :: proc(target: Enum, level: i32, internalformat: Enum, width, height, depth: i32, border: i32, imageSize: int, data: rawptr) ---
 	CompressedTexSubImage3D :: proc(target: Enum, level: i32, xoffset, yoffset: i32, width, height, depth: i32, format: Enum, imageSize: int, data: rawptr) ---
 	CopyTexSubImage3D       :: proc(target: Enum, level: i32, xoffset, yoffset, zoffset: i32, x, y, width, height: i32) ---