mirror of
https://github.com/gopher64/gopher64.git
synced 2026-09-03 19:25:23 +02:00
@@ -75,6 +75,11 @@ typedef struct {
|
||||
FrameBufferInfo frame_buffer_info;
|
||||
} RDP_DEVICE;
|
||||
|
||||
typedef struct {
|
||||
uint32_t fps;
|
||||
uint32_t vis;
|
||||
} FPS_DATA;
|
||||
|
||||
typedef struct {
|
||||
std::string message;
|
||||
Vulkan::ImageHandle image;
|
||||
@@ -106,6 +111,9 @@ static Vulkan::ImageHandle achievement_progress_indicator_image;
|
||||
static std::map<uint32_t, std::string> leaderboard_trackers;
|
||||
static bool display_challenge_indicator;
|
||||
|
||||
static bool display_fps;
|
||||
static Vulkan::ImageHandle fps_image;
|
||||
|
||||
#define MESSAGE_TIME 3000 // 3 seconds
|
||||
|
||||
typedef struct {
|
||||
@@ -147,6 +155,9 @@ bool sdl_event_filter(void *userdata, SDL_Event *event) {
|
||||
if (gfx_info.fullscreen)
|
||||
callback.emu_running = false;
|
||||
break;
|
||||
case SDL_SCANCODE_F1:
|
||||
display_fps = !display_fps;
|
||||
break;
|
||||
case SDL_SCANCODE_F4:
|
||||
crop_letterbox = !crop_letterbox;
|
||||
break;
|
||||
@@ -331,12 +342,15 @@ void rdp_init(void *_window, GFX_INFO _gfx_info, const void *font,
|
||||
leaderboard_trackers.clear();
|
||||
achievement_challenge_indicator_image = Vulkan::ImageHandle();
|
||||
achievement_progress_indicator_image = Vulkan::ImageHandle();
|
||||
fps_image = Vulkan::ImageHandle();
|
||||
display_fps = false;
|
||||
}
|
||||
|
||||
void rdp_close() {
|
||||
messages = std::queue<Message>();
|
||||
achievement_challenge_indicator_image = Vulkan::ImageHandle();
|
||||
achievement_progress_indicator_image = Vulkan::ImageHandle();
|
||||
fps_image = Vulkan::ImageHandle();
|
||||
|
||||
if (wsi)
|
||||
wsi->end_frame();
|
||||
@@ -421,6 +435,18 @@ static void draw_indicator(CommandBufferHandle cmd,
|
||||
cmd->draw(3);
|
||||
}
|
||||
|
||||
static void draw_fps(CommandBufferHandle cmd, Vulkan::ImageHandle fps_image,
|
||||
VkViewport &vp) {
|
||||
cmd->set_texture(0, 0, fps_image->get_view(),
|
||||
Vulkan::StockSampler::NearestClamp);
|
||||
vp.y = vp.y + vp.height - fps_image->get_height();
|
||||
vp.height = fps_image->get_height();
|
||||
vp.width = fps_image->get_width();
|
||||
cmd->set_viewport(vp);
|
||||
|
||||
cmd->draw(3);
|
||||
}
|
||||
|
||||
static void render_frame(Vulkan::Device &device) {
|
||||
RDP::ScanoutOptions options = {};
|
||||
options.persist_frame_on_invalid_input = true;
|
||||
@@ -517,6 +543,10 @@ static void render_frame(Vulkan::Device &device) {
|
||||
display_challenge_indicator) {
|
||||
draw_indicator(cmd, achievement_challenge_indicator_image, vp);
|
||||
}
|
||||
|
||||
if (messages.empty() && display_fps && fps_image) {
|
||||
draw_fps(cmd, fps_image, vp);
|
||||
}
|
||||
}
|
||||
|
||||
cmd->end_render_pass();
|
||||
@@ -822,6 +852,18 @@ uint64_t rdp_process_commands() {
|
||||
return interrupt_timer;
|
||||
}
|
||||
|
||||
void rdp_set_fps_callback(void *userdata) {
|
||||
FPS_DATA *data = (FPS_DATA *)userdata;
|
||||
fps_image = create_message_image(
|
||||
wsi->get_device(), 0, message_font,
|
||||
std::format("FPS: {} VI/S: {}", data->fps, data->vis).c_str());
|
||||
}
|
||||
|
||||
void rdp_set_fps(uint32_t fps, uint32_t vis) {
|
||||
FPS_DATA data = {fps, vis};
|
||||
SDL_RunOnMainThread(rdp_set_fps_callback, &data, true);
|
||||
}
|
||||
|
||||
static void update_challenge_indicator() {
|
||||
std::string message;
|
||||
for (const auto &leaderboard_tracker : leaderboard_trackers) {
|
||||
|
||||
Reference in New Issue
Block a user