From d19c4e5bea26c6cbc362ed558c8a944638e3b666 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Ond=C5=99ej=20Hru=C5=A1ka?= Date: Mon, 28 Sep 2020 22:16:19 +0200 Subject: [PATCH] add experimental framebuffer extension using minifb --- Cargo.lock | 692 ++++++++++++++++++++++++++++++--- Cargo.toml | 1 + crsn/src/runtime/fault.rs | 4 + crsn/src/runtime/run_thread.rs | 1 + crsn_screen/Cargo.toml | 13 + crsn_screen/src/defs.rs | 14 + crsn_screen/src/exec.rs | 99 +++++ crsn_screen/src/lib.rs | 30 ++ crsn_screen/src/parse.rs | 30 ++ crsn_stacks/src/lib.rs | 7 + launcher/Cargo.toml | 1 + launcher/src/main.rs | 46 ++- 12 files changed, 867 insertions(+), 71 deletions(-) create mode 100644 crsn_screen/Cargo.toml create mode 100644 crsn_screen/src/defs.rs create mode 100644 crsn_screen/src/exec.rs create mode 100644 crsn_screen/src/lib.rs create mode 100644 crsn_screen/src/parse.rs diff --git a/Cargo.lock b/Cargo.lock index 380662f..707c7e2 100644 --- a/Cargo.lock +++ b/Cargo.lock @@ -12,17 +12,35 @@ version = "0.2.14" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "d9b39be18770d11421cdb1b9947a45dd3f37e93092cbf377614828a319d5fee8" dependencies = [ - "hermit-abi", - "libc", - "winapi", + "hermit-abi", + "libc", + "winapi", ] +[[package]] +name = "autocfg" +version = "0.1.7" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "1d49d90015b3c36167a20fe2810c5cd875ad504b39cff3d4eae7977e6b7c1cb2" + [[package]] name = "autocfg" version = "1.0.1" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "cdb031dd78e28731d87d56cc8ffef4a8f36ca26c38fe2de700543e627f8a464a" +[[package]] +name = "bitflags" +version = "1.2.1" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "cf1de2fe8c75bc145a2f577add951f8134889b4795d47466a54a5c846d691693" + +[[package]] +name = "cc" +version = "1.0.60" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "ef611cc68ff783f18535d77ddd080185275713d852c4f5cbb6122c462a7a825c" + [[package]] name = "cfg-if" version = "0.1.10" @@ -35,9 +53,27 @@ version = "0.4.15" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "942f72db697d8767c22d46a598e01f2d3b475501ea43d0db4f16d90259182d0b" dependencies = [ - "num-integer", - "num-traits", - "time", + "num-integer", + "num-traits", + "time", +] + +[[package]] +name = "cloudabi" +version = "0.0.3" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "ddfc5b9aa5d4507acaf872de71051dfd0e309860e88966e1051e462a077aac4f" +dependencies = [ + "bitflags", +] + +[[package]] +name = "cloudabi" +version = "0.1.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "4344512281c643ae7638bbabc3af17a11307803ec8f0fcad9fae512a8bf36467" +dependencies = [ + "bitflags", ] [[package]] @@ -46,46 +82,62 @@ version = "1.9.3" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "f4ffc801dacf156c5854b9df4f425a626539c3a6ef7893cc0c5084a23f0b6c59" dependencies = [ - "atty", - "lazy_static", - "winapi", + "atty", + "lazy_static", + "winapi", ] [[package]] name = "crsn" version = "0.1.0" dependencies = [ - "anyhow", - "dyn-clonable", - "log", - "num-traits", - "sexp", - "thiserror", + "anyhow", + "dyn-clonable", + "log", + "num-traits", + "sexp", + "thiserror", ] [[package]] name = "crsn_arith" version = "0.1.0" dependencies = [ - "crsn", - "num-traits", + "crsn", + "num-traits", +] + +[[package]] +name = "crsn_screen" +version = "0.1.0" +dependencies = [ + "crsn", + "log", + "minifb", + "parking_lot", ] [[package]] name = "crsn_stacks" version = "0.1.0" dependencies = [ - "crsn", + "crsn", ] +[[package]] +name = "downcast-rs" +version = "1.2.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "9ea835d29036a4087793836fa931b08837ad5e957da9e23886b29586fb9b6650" + [[package]] name = "dyn-clonable" version = "0.9.0" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "4e9232f0e607a262ceb9bd5141a3dfb3e4db6994b31989bbfd845878cba59fd4" dependencies = [ - "dyn-clonable-impl", - "dyn-clone", + "dyn-clonable-impl", + "dyn-clone", ] [[package]] @@ -94,9 +146,9 @@ version = "0.9.0" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "558e40ea573c374cf53507fd240b7ee2f5477df7cfebdb97323ec61c719399c5" dependencies = [ - "proc-macro2", - "quote", - "syn", + "proc-macro2", + "quote", + "syn", ] [[package]] @@ -105,26 +157,53 @@ version = "1.0.2" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "4c53dc3a653e0f64081026e4bf048d48fec9fce90c66e8326ca7292df0ff2d82" +[[package]] +name = "fuchsia-cprng" +version = "0.1.1" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "a06f77d526c1a601b7c4cdd98f54b5eaabffc14d5f2f0296febdc7f357c6d3ba" + +[[package]] +name = "getrandom" +version = "0.1.15" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "fc587bc0ec293155d5bfa6b9891ec18a1e330c234f896ea47fbada4cadbe47e6" +dependencies = [ + "cfg-if", + "libc", + "wasi 0.9.0+wasi-snapshot-preview1", +] + [[package]] name = "hermit-abi" version = "0.1.16" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "4c30f6d0bc6b00693347368a67d41b58f2fb851215ff1da49e90fe2c5c667151" dependencies = [ - "libc", + "libc", +] + +[[package]] +name = "instant" +version = "0.1.7" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "63312a18f7ea8760cdd0a7c5aac1a619752a246b833545e3e36d1f81f7cd9e66" +dependencies = [ + "cfg-if", ] [[package]] name = "launcher" version = "0.1.0" dependencies = [ - "anyhow", - "crsn", - "crsn_arith", - "crsn_stacks", - "log", - "simple_logger", - "thiserror", + "anyhow", + "crsn", + "crsn_arith", + "crsn_screen", + "crsn_stacks", + "log", + "simple_logger", + "thiserror", ] [[package]] @@ -139,13 +218,87 @@ version = "0.2.77" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "f2f96b10ec2560088a8e76961b00d47107b3a625fecb76dedb29ee7ccbf98235" +[[package]] +name = "lock_api" +version = "0.4.1" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "28247cc5a5be2f05fbcd76dd0cf2c7d3b5400cb978a28042abcd4fa0b3f8261c" +dependencies = [ + "scopeguard", +] + [[package]] name = "log" version = "0.4.11" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "4fabed175da42fed1fa0746b0ea71f412aa9d35e76e95e59b192c64b9dc2bf8b" dependencies = [ - "cfg-if", + "cfg-if", +] + +[[package]] +name = "maybe-uninit" +version = "2.0.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "60302e4db3a61da70c0cb7991976248362f30319e88850c487b9b95bbf059e00" + +[[package]] +name = "memchr" +version = "2.3.3" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "3728d817d99e5ac407411fa471ff9800a778d88a24685968b36824eaf4bee400" + +[[package]] +name = "minifb" +version = "0.19.1" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "2eb411a297b8f714800f085846cbda55fbd2ae17ecd381f1b4652af0e5bebe63" +dependencies = [ + "cc", + "orbclient", + "raw-window-handle", + "tempfile", + "wayland-client", + "wayland-cursor", + "wayland-protocols", + "winapi", + "x11-dl", + "xkb", + "xkbcommon-sys", +] + +[[package]] +name = "nix" +version = "0.17.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "50e4785f2c3b7589a0d0c1dd60285e1188adac4006e8abd6dd578e1567027363" +dependencies = [ + "bitflags", + "cc", + "cfg-if", + "libc", + "void", +] + +[[package]] +name = "nom" +version = "5.1.2" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "ffb4262d26ed83a1c0a33a38fe2bb15797329c85770da05e6b828ddb782627af" +dependencies = [ + "memchr", + "version_check", +] + +[[package]] +name = "num" +version = "0.1.42" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "4703ad64153382334aa8db57c637364c322d3372e097840c72000dabdcf6156e" +dependencies = [ + "num-integer", + "num-iter", + "num-traits", ] [[package]] @@ -154,8 +307,19 @@ version = "0.1.43" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "8d59457e662d541ba17869cf51cf177c0b5f0cbf476c66bdc90bf1edac4f875b" dependencies = [ - "autocfg", - "num-traits", + "autocfg 1.0.1", + "num-traits", +] + +[[package]] +name = "num-iter" +version = "0.1.41" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "7a6e6b7c748f995c4c29c5f5ae0248536e04a5739927c74ec0fa564805094b9f" +dependencies = [ + "autocfg 1.0.1", + "num-integer", + "num-traits", ] [[package]] @@ -164,16 +328,70 @@ version = "0.2.12" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "ac267bcc07f48ee5f8935ab0d24f316fb722d7a1292e2913f0cc196b29ffd611" dependencies = [ - "autocfg", + "autocfg 1.0.1", ] +[[package]] +name = "once_cell" +version = "1.4.1" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "260e51e7efe62b592207e9e13a68e43692a7a279171d6ba57abd208bf23645ad" + +[[package]] +name = "orbclient" +version = "0.3.27" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "f8b18f57ab94fbd058e30aa57f712ec423c0bb7403f8493a6c58eef0c36d9402" +dependencies = [ + "redox_syscall", + "sdl2", +] + +[[package]] +name = "parking_lot" +version = "0.11.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "a4893845fa2ca272e647da5d0e46660a314ead9c2fdd9a883aabc32e481a8733" +dependencies = [ + "instant", + "lock_api", + "parking_lot_core", +] + +[[package]] +name = "parking_lot_core" +version = "0.8.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "c361aa727dd08437f2f1447be8b59a33b0edd15e0fcee698f935613d9efbca9b" +dependencies = [ + "cfg-if", + "cloudabi 0.1.0", + "instant", + "libc", + "redox_syscall", + "smallvec", + "winapi", +] + +[[package]] +name = "pkg-config" +version = "0.3.18" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "d36492546b6af1463394d46f0c834346f31548646f6ba10849802c9c9a27ac33" + +[[package]] +name = "ppv-lite86" +version = "0.2.9" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "c36fa947111f5c62a733b652544dd0016a43ce89619538a8ef92724a6f501a20" + [[package]] name = "proc-macro2" version = "1.0.21" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "36e28516df94f3dd551a587da5357459d9b36d945a7c37c3557928c1c2ff2a2c" dependencies = [ - "unicode-xid", + "unicode-xid", ] [[package]] @@ -182,7 +400,217 @@ version = "1.0.7" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "aa563d17ecb180e500da1cfd2b028310ac758de548efdd203e18f283af693f37" dependencies = [ - "proc-macro2", + "proc-macro2", +] + +[[package]] +name = "rand" +version = "0.6.5" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "6d71dacdc3c88c1fde3885a3be3fbab9f35724e6ce99467f7d9c5026132184ca" +dependencies = [ + "autocfg 0.1.7", + "libc", + "rand_chacha 0.1.1", + "rand_core 0.4.2", + "rand_hc 0.1.0", + "rand_isaac", + "rand_jitter", + "rand_os", + "rand_pcg", + "rand_xorshift", + "winapi", +] + +[[package]] +name = "rand" +version = "0.7.3" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "6a6b1679d49b24bbfe0c803429aa1874472f50d9b363131f0e89fc356b544d03" +dependencies = [ + "getrandom", + "libc", + "rand_chacha 0.2.2", + "rand_core 0.5.1", + "rand_hc 0.2.0", +] + +[[package]] +name = "rand_chacha" +version = "0.1.1" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "556d3a1ca6600bfcbab7c7c91ccb085ac7fbbcd70e008a98742e7847f4f7bcef" +dependencies = [ + "autocfg 0.1.7", + "rand_core 0.3.1", +] + +[[package]] +name = "rand_chacha" +version = "0.2.2" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "f4c8ed856279c9737206bf725bf36935d8666ead7aa69b52be55af369d193402" +dependencies = [ + "ppv-lite86", + "rand_core 0.5.1", +] + +[[package]] +name = "rand_core" +version = "0.3.1" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "7a6fdeb83b075e8266dcc8762c22776f6877a63111121f5f8c7411e5be7eed4b" +dependencies = [ + "rand_core 0.4.2", +] + +[[package]] +name = "rand_core" +version = "0.4.2" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "9c33a3c44ca05fa6f1807d8e6743f3824e8509beca625669633be0acbdf509dc" + +[[package]] +name = "rand_core" +version = "0.5.1" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "90bde5296fc891b0cef12a6d03ddccc162ce7b2aff54160af9338f8d40df6d19" +dependencies = [ + "getrandom", +] + +[[package]] +name = "rand_hc" +version = "0.1.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "7b40677c7be09ae76218dc623efbf7b18e34bced3f38883af07bb75630a21bc4" +dependencies = [ + "rand_core 0.3.1", +] + +[[package]] +name = "rand_hc" +version = "0.2.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "ca3129af7b92a17112d59ad498c6f81eaf463253766b90396d39ea7a39d6613c" +dependencies = [ + "rand_core 0.5.1", +] + +[[package]] +name = "rand_isaac" +version = "0.1.1" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "ded997c9d5f13925be2a6fd7e66bf1872597f759fd9dd93513dd7e92e5a5ee08" +dependencies = [ + "rand_core 0.3.1", +] + +[[package]] +name = "rand_jitter" +version = "0.1.4" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "1166d5c91dc97b88d1decc3285bb0a99ed84b05cfd0bc2341bdf2d43fc41e39b" +dependencies = [ + "libc", + "rand_core 0.4.2", + "winapi", +] + +[[package]] +name = "rand_os" +version = "0.1.3" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "7b75f676a1e053fc562eafbb47838d67c84801e38fc1ba459e8f180deabd5071" +dependencies = [ + "cloudabi 0.0.3", + "fuchsia-cprng", + "libc", + "rand_core 0.4.2", + "rdrand", + "winapi", +] + +[[package]] +name = "rand_pcg" +version = "0.1.2" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "abf9b09b01790cfe0364f52bf32995ea3c39f4d2dd011eac241d2914146d0b44" +dependencies = [ + "autocfg 0.1.7", + "rand_core 0.4.2", +] + +[[package]] +name = "rand_xorshift" +version = "0.1.1" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "cbf7e9e623549b0e21f6e97cf8ecf247c1a8fd2e8a992ae265314300b2455d5c" +dependencies = [ + "rand_core 0.3.1", +] + +[[package]] +name = "raw-window-handle" +version = "0.3.3" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "0a441a7a6c80ad6473bd4b74ec1c9a4c951794285bf941c2126f607c72e48211" +dependencies = [ + "libc", +] + +[[package]] +name = "rdrand" +version = "0.4.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "678054eb77286b51581ba43620cc911abf02758c91f93f479767aed0f90458b2" +dependencies = [ + "rand_core 0.3.1", +] + +[[package]] +name = "redox_syscall" +version = "0.1.57" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "41cc0f7e4d5d4544e8861606a285bb08d3e70712ccc7d2b84d7c0ccfaf4b05ce" + +[[package]] +name = "remove_dir_all" +version = "0.5.3" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "3acd125665422973a33ac9d3dd2df85edad0f4ae9b00dafb1a05e43a9f5ef8e7" +dependencies = [ + "winapi", +] + +[[package]] +name = "scopeguard" +version = "1.1.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "d29ab0c6d3fc0ee92fe66e2d99f700eab17a8d57d1c1d3b748380fb20baa78cd" + +[[package]] +name = "sdl2" +version = "0.32.2" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "d051a07231e303f5f719da78cb6f7394f6d5b54f733aef5b0b447804a83edd7b" +dependencies = [ + "bitflags", + "lazy_static", + "libc", + "num", + "rand 0.6.5", + "sdl2-sys", +] + +[[package]] +name = "sdl2-sys" +version = "0.32.6" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "34e71125077d297d57e4c1acfe8981b5bdfbf5a20e7b589abfdcb33bf1127f86" +dependencies = [ + "cfg-if", + "libc", ] [[package]] @@ -197,22 +625,42 @@ version = "1.9.0" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "13a53ed2efd04911c8280f2da7bf9abd350c931b86bc7f9f2386fbafbf525ff9" dependencies = [ - "atty", - "chrono", - "colored", - "log", - "winapi", + "atty", + "chrono", + "colored", + "log", + "winapi", ] +[[package]] +name = "smallvec" +version = "1.4.2" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "fbee7696b84bbf3d89a1c2eccff0850e3047ed46bfcd2e92c29a2d074d57e252" + [[package]] name = "syn" version = "1.0.41" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "6690e3e9f692504b941dc6c3b188fd28df054f7fb8469ab40680df52fdcc842b" dependencies = [ - "proc-macro2", - "quote", - "unicode-xid", + "proc-macro2", + "quote", + "unicode-xid", +] + +[[package]] +name = "tempfile" +version = "3.1.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "7a6e24d9338a0a5be79593e2fa15a648add6138caa803e2d5bc782c371732ca9" +dependencies = [ + "cfg-if", + "libc", + "rand 0.7.3", + "redox_syscall", + "remove_dir_all", + "winapi", ] [[package]] @@ -221,7 +669,7 @@ version = "1.0.20" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "7dfdd070ccd8ccb78f4ad66bf1982dc37f620ef696c6b5028fe2ed83dd3d0d08" dependencies = [ - "thiserror-impl", + "thiserror-impl", ] [[package]] @@ -230,9 +678,9 @@ version = "1.0.20" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "bd80fc12f73063ac132ac92aceea36734f04a1d93c1240c6944e23a3b8841793" dependencies = [ - "proc-macro2", - "quote", - "syn", + "proc-macro2", + "quote", + "syn", ] [[package]] @@ -241,9 +689,9 @@ version = "0.1.44" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "6db9e6914ab8b1ae1c260a4ae7a49b6c5611b40328a735b21862567685e73255" dependencies = [ - "libc", - "wasi", - "winapi", + "libc", + "wasi 0.10.0+wasi-snapshot-preview1", + "winapi", ] [[package]] @@ -252,20 +700,108 @@ version = "0.2.1" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "f7fe0bb3479651439c9112f72b6c505038574c9fbb575ed1bf3b797fa39dd564" +[[package]] +name = "version_check" +version = "0.9.2" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "b5a972e5669d67ba988ce3dc826706fb0a8b01471c088cb0b6110b805cc36aed" + +[[package]] +name = "void" +version = "1.0.2" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "6a02e4885ed3bc0f2de90ea6dd45ebcbb66dacffe03547fadbb0eeae2770887d" + +[[package]] +name = "wasi" +version = "0.9.0+wasi-snapshot-preview1" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "cccddf32554fecc6acb585f82a32a72e28b48f8c4c1883ddfeeeaa96f7d8e519" + [[package]] name = "wasi" version = "0.10.0+wasi-snapshot-preview1" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "1a143597ca7c7793eff794def352d41792a93c481eb1042423ff7ff72ba2c31f" +[[package]] +name = "wayland-client" +version = "0.27.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "ab702fefbcd6d6f67fb5816e3a89a3b5a42a94290abbc015311c9a30d1068ae4" +dependencies = [ + "bitflags", + "downcast-rs", + "libc", + "nix", + "wayland-commons", + "wayland-scanner", + "wayland-sys", +] + +[[package]] +name = "wayland-commons" +version = "0.27.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "e972e9336ad5a9dd861b4e21ff35ad71d3e5c6b4803d65c39913612f851b95f1" +dependencies = [ + "nix", + "once_cell", + "smallvec", + "wayland-sys", +] + +[[package]] +name = "wayland-cursor" +version = "0.27.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "539f346e1a3f706f38c8ccbe1196001e2fb1c9b3e6b605c27d665db2f5b60d41" +dependencies = [ + "nix", + "wayland-client", + "xcursor", +] + +[[package]] +name = "wayland-protocols" +version = "0.27.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "f3d6fc54b17b98b5083bc21ae3a30e6d75cb4b01647360e4c3a04648bcf8781d" +dependencies = [ + "bitflags", + "wayland-client", + "wayland-commons", + "wayland-scanner", +] + +[[package]] +name = "wayland-scanner" +version = "0.27.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "030f56009d932bd9400bb472764fea8109be1b0fc482d9cd75496c943ac30328" +dependencies = [ + "proc-macro2", + "quote", + "xml-rs", +] + +[[package]] +name = "wayland-sys" +version = "0.27.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "8bdeffbbb474477dfa2acb45ac7479e5fe8f741c64ab032c5d11b94d07edc269" +dependencies = [ + "pkg-config", +] + [[package]] name = "winapi" version = "0.3.9" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "5c839a674fcd7a98952e593242ea400abe93992746761e38641405d28b00f419" dependencies = [ - "winapi-i686-pc-windows-gnu", - "winapi-x86_64-pc-windows-gnu", + "winapi-i686-pc-windows-gnu", + "winapi-x86_64-pc-windows-gnu", ] [[package]] @@ -279,3 +815,51 @@ name = "winapi-x86_64-pc-windows-gnu" version = "0.4.0" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "712e227841d057c1ee1cd2fb22fa7e5a5461ae8e48fa2ca79ec42cfc1931183f" + +[[package]] +name = "x11-dl" +version = "2.18.5" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "2bf981e3a5b3301209754218f962052d4d9ee97e478f4d26d4a6eced34c1fef8" +dependencies = [ + "lazy_static", + "libc", + "maybe-uninit", + "pkg-config", +] + +[[package]] +name = "xcursor" +version = "0.3.2" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "d3a481cfdefd35e1c50073ae33a8000d695c98039544659f5dc5dd71311b0d01" +dependencies = [ + "nom", +] + +[[package]] +name = "xkb" +version = "0.2.1" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "aec02bc5de902aa579f3d2f2c522edaf40fa42963cbaffe645b058ddcc68fdb2" +dependencies = [ + "bitflags", + "libc", + "xkbcommon-sys", +] + +[[package]] +name = "xkbcommon-sys" +version = "0.7.4" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "fa434980dca02ebf28795d71e570dbb78316d095a228707efd6117bf8246d78b" +dependencies = [ + "libc", + "pkg-config", +] + +[[package]] +name = "xml-rs" +version = "0.8.3" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "b07db065a5cf61a7e4ba64f29e67db906fb1787316516c4e6e5ff0fea1efcd8a" diff --git a/Cargo.toml b/Cargo.toml index 43dae3e..3ec18f3 100644 --- a/Cargo.toml +++ b/Cargo.toml @@ -4,4 +4,5 @@ members = [ "crsn", "crsn_arith", "crsn_stacks", + "crsn_screen", ] diff --git a/crsn/src/runtime/fault.rs b/crsn/src/runtime/fault.rs index 2cd4a3b..ed9097f 100644 --- a/crsn/src/runtime/fault.rs +++ b/crsn/src/runtime/fault.rs @@ -2,6 +2,7 @@ use thiserror::Error; use crate::asm::data::literal::{DebugMsg, Label, RoutineName, Value}; use crate::asm::data::Register; +use std::borrow::Cow; #[derive(Error, Debug)] pub enum Fault { @@ -24,6 +25,9 @@ pub enum Fault { #[error("Program ended.")] Halt, + #[error("Operation not allowed: {0}")] + NotAllowed(Cow<'static, str>), + #[error("Object does not exist: {0:#x}")] ObjectNotExist(Value), diff --git a/crsn/src/runtime/run_thread.rs b/crsn/src/runtime/run_thread.rs index f26758a..8e2212f 100644 --- a/crsn/src/runtime/run_thread.rs +++ b/crsn/src/runtime/run_thread.rs @@ -11,6 +11,7 @@ use crate::module::EvalRes; use crate::runtime::fault::Fault; use crate::runtime::frame::StackFrame; use crate::runtime::program::Program; +use std::pin::Pin; #[derive(Clone, Copy, Eq, PartialEq, Debug, Ord, PartialOrd)] pub struct ThreadToken(pub u32); diff --git a/crsn_screen/Cargo.toml b/crsn_screen/Cargo.toml new file mode 100644 index 0000000..4647f6c --- /dev/null +++ b/crsn_screen/Cargo.toml @@ -0,0 +1,13 @@ +[package] +name = "crsn_screen" +version = "0.1.0" +authors = ["Ondřej Hruška "] +edition = "2018" + +# See more keys and their definitions at https://doc.rust-lang.org/cargo/reference/manifest.html + +[dependencies] +crsn = { path = "../crsn" } +minifb = "0.19.1" +parking_lot = "0.11.0" +log = "0.4.11" diff --git a/crsn_screen/src/defs.rs b/crsn_screen/src/defs.rs new file mode 100644 index 0000000..3558e4a --- /dev/null +++ b/crsn_screen/src/defs.rs @@ -0,0 +1,14 @@ +use crsn::asm::data::{Rd, RdObj, Wr}; + +#[derive(Clone, Debug, Eq, PartialEq)] +pub enum ScreenOp { + ScreenInit { + width: Rd, + height: Rd, + }, + SetPixel { + x: Rd, + y: Rd, + color: Rd, + } +} diff --git a/crsn_screen/src/exec.rs b/crsn_screen/src/exec.rs new file mode 100644 index 0000000..0910294 --- /dev/null +++ b/crsn_screen/src/exec.rs @@ -0,0 +1,99 @@ +use std::collections::{HashMap, VecDeque}; + +use crsn::asm::data::literal::Value; +use crsn::asm::instr::Cond; +use crsn::module::{CrsnExtension, EvalRes, OpTrait}; +use crsn::runtime::fault::Fault; +use crsn::runtime::run_thread::{state::RunState, ThreadInfo}; + +use crate::defs::ScreenOp; +use minifb::{Window, WindowOptions, ScaleMode}; +use parking_lot::Mutex; +use std::sync::Arc; + +#[derive(Debug, Default)] +struct Backend { + width: usize, + height: usize, + buffer: Vec, + window: Option, +} + +// Hack for Window +unsafe impl std::marker::Send for Backend { } + +impl OpTrait for ScreenOp { + fn execute(&self, info: &ThreadInfo, state: &mut RunState) -> Result { + let eres = EvalRes::default(); + match self { + ScreenOp::ScreenInit { width, height } => { + let w = state.read(*width)?; + let h = state.read(*height)?; + init(state, w, h)?; + } + ScreenOp::SetPixel { x, y, color } => { + let x = state.read(*x)?; + let y = state.read(*y)?; + let color = state.read(*color)?; + + let backend : &mut Backend = state.ext_mut(); + match &mut backend.window { + Some(w) => { + let index = y * backend.width as u64 + x; + if index as usize > backend.buffer.len() { + warn!("Screen set pixel out of bounds"); + state.set_flag(Cond::Invalid, true); + } else { + backend.buffer[index as usize] = color as u32; + + w + .update_with_buffer(&backend.buffer, backend.width, backend.height) + .expect("Update screen"); // TODO fault + } + } + None => { + state.set_flag(Cond::Invalid, true); + } + } + } + } + + Ok(eres) + } + // +} + +fn init(state: &mut RunState, width: Value, height: Value) -> Result<(), Fault> { + let mut window = Window::new( + "Croissant", + width as usize, + height as usize, + WindowOptions { + resize: true, + scale_mode: ScaleMode::AspectRatioStretch, + ..WindowOptions::default() + }, + ).expect("Unable to create window"); // TODO fault + + + let backend : &mut Backend = state.ext_mut(); + + if backend.window.is_some() { + return Err(Fault::NotAllowed("Screen already initialized".into())); + } + + backend.width = width as usize; + backend.height = height as usize; + backend.buffer = vec![0; (width * height) as usize]; + + // window.limit_update_rate(Some(std::time::Duration::from_micros(16600))); + window.limit_update_rate(None); + + window + .update_with_buffer(&backend.buffer, backend.width, backend.height) + .expect("Update screen"); // TODO fault + + backend.window = Some(window); + + Ok(()) +} diff --git a/crsn_screen/src/lib.rs b/crsn_screen/src/lib.rs new file mode 100644 index 0000000..75c5360 --- /dev/null +++ b/crsn_screen/src/lib.rs @@ -0,0 +1,30 @@ +#[macro_use] +extern crate log; + +use crsn::module::{CrsnExtension, ParseOpRes}; +use crsn::asm::parse::arg_parser::ArgParser; +use crsn::asm::instr::Op; +use crsn::asm::error::CrsnError; + +mod defs; +mod parse; +mod exec; + +#[derive(Debug, Clone)] +pub struct ScreenOps; + +impl ScreenOps { + pub fn new() -> Box { + Box::new(Self) + } +} + +impl CrsnExtension for ScreenOps { + fn name(&self) -> &'static str { + "screen" + } + + fn parse_op(&self, keyword: &str, args: ArgParser) -> Result, CrsnError> { + parse::parse(keyword, args) + } +} diff --git a/crsn_screen/src/parse.rs b/crsn_screen/src/parse.rs new file mode 100644 index 0000000..440592f --- /dev/null +++ b/crsn_screen/src/parse.rs @@ -0,0 +1,30 @@ + +use crsn::asm::error::CrsnError; +use crsn::asm::instr::Op; +use crsn::asm::parse::arg_parser::ArgParser; +use crsn::module::{ParseOpRes}; + +use crate::defs::ScreenOp; + +pub(crate) fn parse(keyword: &str, mut args: ArgParser) -> Result, CrsnError> { + Ok(ParseOpRes::ext(match keyword { + "sc-init" => { + ScreenOp::ScreenInit { + width: args.next_rd()?, + height: args.next_rd()?, + } + } + + "sc-px" => { + ScreenOp::SetPixel { + x: args.next_rd()?, + y: args.next_rd()?, + color: args.next_rd()?, + } + } + + _other => { + return Ok(ParseOpRes::Unknown(args)); + } + })) +} diff --git a/crsn_stacks/src/lib.rs b/crsn_stacks/src/lib.rs index 78b8c7f..914575a 100644 --- a/crsn_stacks/src/lib.rs +++ b/crsn_stacks/src/lib.rs @@ -2,6 +2,9 @@ use crsn::module::{CrsnExtension, ParseOpRes}; use crsn::asm::parse::arg_parser::ArgParser; use crsn::asm::instr::Op; use crsn::asm::error::CrsnError; +use crsn::runtime::run_thread::{ThreadInfo, RunState}; +use crsn::asm::data::literal::Value; +use crsn::runtime::fault::Fault; mod defs; mod parse; @@ -24,4 +27,8 @@ impl CrsnExtension for StackOps { fn parse_op(&self, keyword: &str, args: ArgParser) -> Result, CrsnError> { parse::parse(keyword, args) } + + fn drop_obj(&self, ti: &ThreadInfo, state: &mut RunState, handle: Value) -> Result, Fault> { + exec::drop_obj(state, handle) + } } diff --git a/launcher/Cargo.toml b/launcher/Cargo.toml index 7749f43..5db0e67 100644 --- a/launcher/Cargo.toml +++ b/launcher/Cargo.toml @@ -10,6 +10,7 @@ edition = "2018" crsn = { path = "../crsn" } crsn_arith = { path = "../crsn_arith" } crsn_stacks = { path = "../crsn_stacks" } +crsn_screen = { path = "../crsn_screen" } simple_logger = "1.9.0" log = "0.4.11" diff --git a/launcher/src/main.rs b/launcher/src/main.rs index 30aa6f9..1e549f7 100644 --- a/launcher/src/main.rs +++ b/launcher/src/main.rs @@ -11,9 +11,14 @@ use crsn::runtime::run_thread::{RunThread, ThreadToken}; use crsn::runtime::run_thread; use crsn_arith::ArithOps; use crsn_stacks::StackOps; +use crsn_screen::ScreenOps; +use std::time::Duration; +use log::LevelFilter; fn main() { - SimpleLogger::new().init().unwrap(); + SimpleLogger::new() + .with_level(LevelFilter::Warn) + .init().unwrap(); // ;(dec r0 (z? (ret))) /*let program = " @@ -72,21 +77,27 @@ fn main() { let program = " ( (main - (stack r7) - (push @r7 10) - (push @r7 20) - (call emptystack r7) - (push @r7 30) - (pop r0 @r7) - (pop r0 @r7) - (drop @r7) - (pop r0 @r7) ; this fails - (halt) - ) - (emptystack - (:again) - (pop _ @arg0 (nz? (j :again))) - (ret) + (sc-init 640 480) + + (ld r0 39) ; x + (ld r1 0) ; y + + (ld r2 1) ; dx + (ld r3 1) ; dy + + (ld r5 0xffffff) + + (:loop) + (add r5 0x123456) + (and r5 0xffffff) + (sc-px r0 r1 r5) + (add r0 r2) + (add r1 r3) + (cmp r0 639 (eq? (ld r2 -1))) + (cmp r0 0 (eq? (ld r2 1))) + (cmp r1 479 (eq? (ld r3 -1))) + (cmp r1 0 (eq? (ld r3 1))) + (j :loop) ) ) "; @@ -94,13 +105,14 @@ fn main() { let parsers = Arc::new(vec![ ArithOps::new(), StackOps::new(), + ScreenOps::new(), ]); let parsed = crsn::asm::assemble(program, parsers).unwrap(); let uniq = run_thread::new_uniq(); - let thread1 = RunThread::new(ThreadToken(0), Some(uniq.clone()), parsed.clone(), Addr(0), &[]); + let mut thread1 = RunThread::new(ThreadToken(0), Some(uniq.clone()), parsed.clone(), Addr(0), &[]); //thread1.set_speed(Duration::from_millis(250)); let _thread2 = RunThread::new(ThreadToken(1), Some(uniq), parsed.clone(), Addr(0), &[]);