diff options
| author | Alejandro Soto <alejandro@34project.org> | 2024-05-26 12:50:32 -0600 |
|---|---|---|
| committer | Alejandro Soto <alejandro@34project.org> | 2024-05-26 12:51:52 -0600 |
| commit | 8cb646e5a2c9e8ab796973185f4ebf9cbcea57fe (patch) | |
| tree | 27c63658ffd07fce2a69229a95fab0da62384856 /platform/wavelet3d | |
| parent | 2ea327c97ed9008f4f5a7bcbe1bfe05f1970ab50 (diff) | |
platform/wavelet3d: implement video output simulation
Diffstat (limited to 'platform/wavelet3d')
| -rw-r--r-- | platform/wavelet3d/main.cpp | 48 |
1 files changed, 48 insertions, 0 deletions
diff --git a/platform/wavelet3d/main.cpp b/platform/wavelet3d/main.cpp index 8cd3989..a94fa4f 100644 --- a/platform/wavelet3d/main.cpp +++ b/platform/wavelet3d/main.cpp @@ -64,6 +64,8 @@ int main(int argc, char **argv) top->jtag_tms = 1; top->jtag_tdi = 1; + top->dac_ready = 1; + cycle(); top->rst_n = 1; @@ -119,6 +121,16 @@ int main(int argc, char **argv) fclose(flash_img); + constexpr std::size_t FB_SIZE = 640 * 480; + auto fb = std::make_unique<unsigned[]>(FB_SIZE); + std::size_t fb_ptr = 0; + + ::SDL_Init(SDL_INIT_VIDEO); + + ::SDL_Window *window = nullptr; + ::SDL_Renderer *renderer = nullptr; + ::SDL_Texture *texture = nullptr; + auto sys_bus_cycle = [&]() { cycle(); @@ -223,6 +235,37 @@ int main(int argc, char **argv) .data = top->dram_wdata, .strb = top->dram_wstrb, }); + + if (top->dac_valid) { + if (top->dac_first) + fb_ptr = 0; + + fb[fb_ptr++] + = (unsigned)(top->dac_r >> 2) << 16 + | (unsigned)(top->dac_g >> 2) << 8 + | (unsigned)(top->dac_b >> 2) << 0; + + if (top->dac_last) { + if (!window) { + window = ::SDL_CreateWindow + ( + "w3d", SDL_WINDOWPOS_CENTERED, SDL_WINDOWPOS_CENTERED, 640, 480, 0 + ); + + renderer = ::SDL_CreateRenderer(window, -1, SDL_RENDERER_ACCELERATED); + + texture = ::SDL_CreateTexture + ( + renderer, SDL_PIXELFORMAT_ARGB32, SDL_TEXTUREACCESS_STREAMING, 640, 480 + ); + } + + ::SDL_UpdateTexture(texture, nullptr, &fb[0], 640 * sizeof fb[0]); + ::SDL_RenderClear(renderer); + ::SDL_RenderCopy(renderer, texture, nullptr, nullptr); + ::SDL_RenderPresent(renderer); + } + } }; remote_jtag jtag(1234); @@ -247,5 +290,10 @@ int main(int argc, char **argv) top->final(); + ::SDL_DestroyTexture(texture); + ::SDL_DestroyRenderer(renderer); + ::SDL_DestroyWindow(window); + ::SDL_Quit(); + return EXIT_SUCCESS; } |
