Created
December 18, 2017 23:52
-
-
Save jontro/b3e247bcc2d92a081191bc4cdf56e0b0 to your computer and use it in GitHub Desktop.
This file contains bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
diff --git a/index.html b/index.html | |
index dd19415..e015780 100644 | |
--- a/index.html | |
+++ b/index.html | |
@@ -14,20 +14,23 @@ fetch('target/wasm32-unknown-unknown/release/wasmmem.wasm') | |
.then(bytes => WebAssembly.instantiate(bytes, { | |
env: { | |
- draw: function(data_ptr, counter) { | |
+ draw: function(counter) { | |
console.log("Called draw with counter: ", counter); | |
- console.log("Called draw with ptr:", data_ptr); | |
for(var i = 0; i < 5; i++) { | |
- console.log("data[", i, "]:", rust_memory[data_ptr + i]); | |
+ console.log("data[", i, "]:", rust_memory[i]); | |
} | |
} | |
} | |
})) | |
.then(results => { | |
- rust_memory = new Uint8Array(results.instance.exports.memory.buffer); | |
var gamestate_ptr = results.instance.exports.start(); | |
+ var pointer = results.instance.exports.data_address(gamestate_ptr); | |
+ var len = results.instance.exports.data_length(gamestate_ptr); | |
+ console.log(pointer, len); | |
+ rust_memory = new Uint8Array(results.instance.exports.memory.buffer, pointer, len); | |
+ | |
console.log("Gamestate pointer:", gamestate_ptr); | |
results.instance.exports.update(gamestate_ptr); | |
diff --git a/src/main.rs b/src/main.rs | |
index 0d2ee27..9fcc499 100644 | |
--- a/src/main.rs | |
+++ b/src/main.rs | |
@@ -1,5 +1,7 @@ | |
+use std::os::raw::c_void; | |
+ | |
extern { | |
- fn draw(data: *const u8, counter: i32); | |
+ fn draw(counter: i32); | |
} | |
pub struct Gamestate { | |
@@ -13,7 +15,7 @@ impl Gamestate { | |
// NOTE: changing this to `66_000` will make the web | |
// client show zeros instead of the initial values set | |
// here as well as in `update`. | |
- data: vec![5; 65_000], | |
+ data: vec![5; 66_000], | |
counter: 0, | |
} | |
} | |
@@ -26,6 +28,26 @@ pub fn start() -> *mut Gamestate { | |
Box::into_raw(state) | |
} | |
+ | |
+#[no_mangle] | |
+pub extern "C" fn data_address(state_ptr: *mut Gamestate) -> *mut c_void { | |
+ let mut state = unsafe { Box::from_raw(state_ptr) }; | |
+ | |
+ let ptr = state.data.as_mut_ptr(); | |
+ std::mem::forget(state); | |
+ return ptr as *mut c_void; | |
+} | |
+ | |
+#[no_mangle] | |
+pub extern "C" fn data_length(state_ptr: *mut Gamestate) -> usize { | |
+ let state = unsafe { Box::from_raw(state_ptr) }; | |
+ | |
+ let ret = state.data.len(); | |
+ std::mem::forget(state); | |
+ return ret; | |
+ | |
+} | |
+ | |
#[no_mangle] | |
pub fn update(state_ptr: *mut Gamestate) { | |
let mut state = unsafe { Box::from_raw(state_ptr) }; | |
@@ -39,11 +61,10 @@ pub fn update(state_ptr: *mut Gamestate) { | |
*num = 42 + counter as u8; | |
} | |
- let data_ptr = state.data.as_ptr(); | |
std::mem::forget(state); | |
unsafe { | |
- draw(data_ptr, counter) | |
+ draw(counter) | |
} | |
} | |
Sign up for free
to join this conversation on GitHub.
Already have an account?
Sign in to comment