generated from saji/ecp5-template
sokol works, working on nix tooling
Some checks failed
Verilator Unit Tests / Test (push) Failing after 5m10s
Some checks failed
Verilator Unit Tests / Test (push) Failing after 5m10s
This commit is contained in:
parent
4b570ad5a5
commit
f3789b6432
|
@ -28,6 +28,9 @@
|
||||||
}
|
}
|
||||||
));
|
));
|
||||||
in {
|
in {
|
||||||
|
packages = forAllSystems (pkgs: {
|
||||||
|
sim = import ./sim/package.nix pkgs;
|
||||||
|
});
|
||||||
devShells = forAllSystems (pkgs: {
|
devShells = forAllSystems (pkgs: {
|
||||||
default = pkgs.mkShell {
|
default = pkgs.mkShell {
|
||||||
packages = with pkgs; [
|
packages = with pkgs; [
|
||||||
|
|
|
@ -7,7 +7,6 @@ project(groovylight-sim)
|
||||||
set(CMAKE_CXX_STANDARD 20)
|
set(CMAKE_CXX_STANDARD 20)
|
||||||
set(CMAKE_C_STANDARD 11)
|
set(CMAKE_C_STANDARD 11)
|
||||||
|
|
||||||
|
|
||||||
FetchContent_Declare(
|
FetchContent_Declare(
|
||||||
dear_imgui
|
dear_imgui
|
||||||
GIT_REPOSITORY https://github.com/ocornut/imgui.git
|
GIT_REPOSITORY https://github.com/ocornut/imgui.git
|
||||||
|
@ -24,41 +23,72 @@ FetchContent_Declare(
|
||||||
BUILD_COMMAND ""
|
BUILD_COMMAND ""
|
||||||
)
|
)
|
||||||
|
|
||||||
|
|
||||||
FetchContent_Declare(
|
FetchContent_Declare(
|
||||||
Catch2
|
Catch2
|
||||||
GIT_REPOSITORY https://github.com/catchorg/Catch2.git
|
GIT_REPOSITORY https://github.com/catchorg/Catch2.git
|
||||||
GIT_TAG v3.4.0 # or a later release
|
GIT_TAG v3.4.0 # or a later release
|
||||||
)
|
)
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
FetchContent_MakeAvailable(sokol dear_imgui Catch2)
|
FetchContent_MakeAvailable(sokol dear_imgui Catch2)
|
||||||
|
|
||||||
|
# imgui
|
||||||
|
add_library(imgui INTERFACE)
|
||||||
|
target_sources(imgui INTERFACE
|
||||||
|
${dear_imgui_SOURCE_DIR}/imgui.cpp
|
||||||
|
${dear_imgui_SOURCE_DIR}/imgui_draw.cpp
|
||||||
|
${dear_imgui_SOURCE_DIR}/imgui_tables.cpp
|
||||||
|
${dear_imgui_SOURCE_DIR}/imgui_widgets.cpp
|
||||||
|
${dear_imgui_SOURCE_DIR}/imgui_widgets.cpp
|
||||||
|
${dear_imgui_SOURCE_DIR}/imgui_demo.cpp
|
||||||
|
)
|
||||||
|
target_include_directories(imgui INTERFACE
|
||||||
|
${dear_imgui_SOURCE_DIR}
|
||||||
|
${dear_imgui_SOURCE_DIR}/backends/
|
||||||
|
)
|
||||||
|
# target_compile_options(imgui PRIVATE -Wno-unused-but-set-variable -Wno-type-limits -Wno-missing-field-initializers)
|
||||||
|
|
||||||
|
|
||||||
# sokol
|
# sokol
|
||||||
add_library(sokol INTERFACE)
|
add_library(sokol INTERFACE)
|
||||||
target_include_directories(sokol INTERFACE ${sokol_SOURCE_DIR})
|
target_include_directories(sokol INTERFACE ${sokol_SOURCE_DIR})
|
||||||
|
|
||||||
|
|
||||||
|
# Catch2 setup
|
||||||
list(APPEND CMAKE_MODULE_PATH ${catch2_SOURCE_DIR}/extras) # needed for the catch_discover_tests function
|
list(APPEND CMAKE_MODULE_PATH ${catch2_SOURCE_DIR}/extras) # needed for the catch_discover_tests function
|
||||||
|
|
||||||
|
|
||||||
|
# Verilator
|
||||||
list(APPEND VSOURCES ../verilog/hub75e.sv ../verilog/lineram.v)
|
list(APPEND VSOURCES ../verilog/hub75e.sv ../verilog/lineram.v)
|
||||||
|
|
||||||
set(CMAKE_EXPORT_COMPILE_COMMANDS TRUE)
|
set(CMAKE_EXPORT_COMPILE_COMMANDS TRUE)
|
||||||
|
|
||||||
find_package(verilator HINTS $ENV{VERILATOR_ROOT})
|
find_package(verilator HINTS $ENV{VERILATOR_ROOT})
|
||||||
|
|
||||||
|
|
||||||
|
# OpenGL
|
||||||
|
find_package(OpenGL REQUIRED)
|
||||||
|
find_package(X11 REQUIRED)
|
||||||
|
|
||||||
|
# SIM
|
||||||
add_executable(sim)
|
add_executable(sim)
|
||||||
|
|
||||||
target_sources(sim PRIVATE
|
target_sources(sim PRIVATE
|
||||||
src/main.cpp
|
src/main.cpp
|
||||||
|
src/sokol.cpp
|
||||||
)
|
)
|
||||||
|
|
||||||
target_include_directories(sim PRIVATE inc/)
|
target_include_directories(sim PRIVATE inc/)
|
||||||
|
target_compile_options(sim PRIVATE -DSOKOL_GLCORE33)
|
||||||
|
|
||||||
verilate(sim SOURCES ${VSOURCES} TRACE VERILATOR_ARGS -Wno-MULTITOP)
|
verilate(sim SOURCES ${VSOURCES} TRACE VERILATOR_ARGS -Wno-MULTITOP)
|
||||||
|
|
||||||
target_link_libraries(sim PRIVATE sokol)
|
target_link_libraries(sim PUBLIC OpenGL::GL X11 Xi Xcursor dl pthread m)
|
||||||
|
target_link_libraries(sim PUBLIC sokol)
|
||||||
|
target_link_libraries(sim PUBLIC imgui)
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
|
# SIM TEST
|
||||||
add_executable(sim_test)
|
add_executable(sim_test)
|
||||||
target_sources(sim_test PRIVATE
|
target_sources(sim_test PRIVATE
|
||||||
test/hub75.cpp
|
test/hub75.cpp
|
||||||
|
|
10
sim/package.nix
Normal file
10
sim/package.nix
Normal file
|
@ -0,0 +1,10 @@
|
||||||
|
{ pkgs }:
|
||||||
|
stdenv.mkDerivation {
|
||||||
|
pname = "groovysim";
|
||||||
|
version = "0.0.1";
|
||||||
|
meta = with pkgs.lib; {
|
||||||
|
description = "Hub75 display simulator";
|
||||||
|
};
|
||||||
|
src = ./.;
|
||||||
|
nativeBuildInputs = with pkgs; [ cmake ];
|
||||||
|
}
|
|
@ -1,4 +1,97 @@
|
||||||
|
#include "sokol_app.h"
|
||||||
|
#include "sokol_gfx.h"
|
||||||
|
#include "sokol_log.h"
|
||||||
|
#include "sokol_glue.h"
|
||||||
|
#include "imgui.h"
|
||||||
|
#include "util/sokol_imgui.h"
|
||||||
|
|
||||||
|
|
||||||
int main() {
|
static bool show_test_window = true;
|
||||||
|
static bool show_another_window = false;
|
||||||
|
|
||||||
|
static sg_pass_action pass_action;
|
||||||
|
|
||||||
|
void init(void) {
|
||||||
|
// setup sokol-gfx, sokol-time and sokol-imgui
|
||||||
|
sg_desc desc = { };
|
||||||
|
desc.environment = sglue_environment();
|
||||||
|
desc.logger.func = slog_func;
|
||||||
|
sg_setup(&desc);
|
||||||
|
|
||||||
|
// use sokol-imgui with all default-options (we're not doing
|
||||||
|
// multi-sampled rendering or using non-default pixel formats)
|
||||||
|
simgui_desc_t simgui_desc = { };
|
||||||
|
simgui_desc.logger.func = slog_func;
|
||||||
|
simgui_setup(&simgui_desc);
|
||||||
|
|
||||||
|
// initial clear color
|
||||||
|
pass_action.colors[0].load_action = SG_LOADACTION_CLEAR;
|
||||||
|
pass_action.colors[0].clear_value = { 0.0f, 0.5f, 0.7f, 1.0f };
|
||||||
|
}
|
||||||
|
|
||||||
|
void frame(void) {
|
||||||
|
const int width = sapp_width();
|
||||||
|
const int height = sapp_height();
|
||||||
|
simgui_new_frame({ width, height, sapp_frame_duration(), sapp_dpi_scale() });
|
||||||
|
|
||||||
|
// 1. Show a simple window
|
||||||
|
// Tip: if we don't call ImGui::Begin()/ImGui::End() the widgets appears in a window automatically called "Debug"
|
||||||
|
static float f = 0.0f;
|
||||||
|
ImGui::Text("Hello, world!");
|
||||||
|
ImGui::SliderFloat("float", &f, 0.0f, 1.0f);
|
||||||
|
ImGui::ColorEdit3("clear color", &pass_action.colors[0].clear_value.r);
|
||||||
|
if (ImGui::Button("Test Window")) show_test_window ^= 1;
|
||||||
|
if (ImGui::Button("Another Window")) show_another_window ^= 1;
|
||||||
|
ImGui::Text("Application average %.3f ms/frame (%.1f FPS)", 1000.0f / ImGui::GetIO().Framerate, ImGui::GetIO().Framerate);
|
||||||
|
ImGui::Text("w: %d, h: %d, dpi_scale: %.1f", sapp_width(), sapp_height(), sapp_dpi_scale());
|
||||||
|
if (ImGui::Button(sapp_is_fullscreen() ? "Switch to windowed" : "Switch to fullscreen")) {
|
||||||
|
sapp_toggle_fullscreen();
|
||||||
|
}
|
||||||
|
|
||||||
|
// 2. Show another simple window, this time using an explicit Begin/End pair
|
||||||
|
if (show_another_window) {
|
||||||
|
ImGui::SetNextWindowSize(ImVec2(200,100), ImGuiCond_FirstUseEver);
|
||||||
|
ImGui::Begin("Another Window", &show_another_window);
|
||||||
|
ImGui::Text("Hello");
|
||||||
|
ImGui::End();
|
||||||
|
}
|
||||||
|
|
||||||
|
// 3. Show the ImGui test window. Most of the sample code is in ImGui::ShowDemoWindow()
|
||||||
|
if (show_test_window) {
|
||||||
|
ImGui::SetNextWindowPos(ImVec2(460, 20), ImGuiCond_FirstUseEver);
|
||||||
|
ImGui::ShowDemoWindow();
|
||||||
|
}
|
||||||
|
|
||||||
|
// the sokol_gfx draw pass
|
||||||
|
sg_pass pass = {};
|
||||||
|
pass.action = pass_action;
|
||||||
|
pass.swapchain = sglue_swapchain();
|
||||||
|
sg_begin_pass(&pass);
|
||||||
|
simgui_render();
|
||||||
|
sg_end_pass();
|
||||||
|
sg_commit();
|
||||||
|
}
|
||||||
|
|
||||||
|
void cleanup(void) {
|
||||||
|
simgui_shutdown();
|
||||||
|
sg_shutdown();
|
||||||
|
}
|
||||||
|
|
||||||
|
void input(const sapp_event* event) {
|
||||||
|
simgui_handle_event(event);
|
||||||
|
}
|
||||||
|
|
||||||
|
sapp_desc sokol_main(int argc, char* argv[]) {
|
||||||
|
(void)argc; (void)argv;
|
||||||
|
sapp_desc desc = { };
|
||||||
|
desc.init_cb = init;
|
||||||
|
desc.frame_cb = frame;
|
||||||
|
desc.cleanup_cb = cleanup;
|
||||||
|
desc.event_cb = input;
|
||||||
|
desc.window_title = "Dear ImGui (sokol-app)";
|
||||||
|
desc.ios_keyboard_resizes_canvas = false;
|
||||||
|
desc.icon.sokol_default = true;
|
||||||
|
desc.enable_clipboard = true;
|
||||||
|
desc.logger.func = slog_func;
|
||||||
|
return desc;
|
||||||
}
|
}
|
||||||
|
|
8
sim/src/sokol.cpp
Normal file
8
sim/src/sokol.cpp
Normal file
|
@ -0,0 +1,8 @@
|
||||||
|
#define SOKOL_IMPL
|
||||||
|
#define SOKOL_IMGUI_IMPL
|
||||||
|
#include "sokol_app.h"
|
||||||
|
#include "sokol_gfx.h"
|
||||||
|
#include "sokol_log.h"
|
||||||
|
#include "sokol_glue.h"
|
||||||
|
#include "imgui.h"
|
||||||
|
#include "util/sokol_imgui.h"
|
Loading…
Reference in a new issue