From bb6937949dbc95e6dc7d55d2480d076fb42a28b8 Mon Sep 17 00:00:00 2001
From: libretroadmin <reallibretroretroarch@gmail.com>
Date: Wed, 6 Jul 2022 11:40:59 +0200
Subject: [PATCH] gfx_widget_draw_icon optimization - if radians is 0, we know
 cosine and sine already. Avoid sinf/cosf computation when possible

---
 gfx/gfx_widgets.c                             | 67 ++++++++++++-------
 gfx/gfx_widgets.h                             |  4 +-
 gfx/widgets/gfx_widget_achievement_popup.c    | 10 ++-
 gfx/widgets/gfx_widget_leaderboard_display.c  | 34 +++++++---
 .../gfx_widget_load_content_animation.c       |  4 +-
 gfx/widgets/gfx_widget_screenshot.c           |  8 ++-
 gfx/widgets/gfx_widget_volume.c               |  8 ++-
 7 files changed, 95 insertions(+), 40 deletions(-)

diff --git a/gfx/gfx_widgets.c b/gfx/gfx_widgets.c
index 18973e0ca9..05a29cf1d5 100644
--- a/gfx/gfx_widgets.c
+++ b/gfx/gfx_widgets.c
@@ -610,6 +610,8 @@ void gfx_widgets_draw_icon(
       uintptr_t texture,
       float x, float y,
       float radians,
+      float cosine,
+      float sine,
       float *color)
 {
    gfx_display_ctx_draw_t draw;
@@ -622,11 +624,7 @@ void gfx_widgets_draw_icon(
       return;
 
    if (!p_disp->dispctx->handles_transform)
-   {
-      float cosine             = cosf(radians);
-      float sine               = sinf(radians);
       gfx_display_rotate_z(p_disp, &mymat, cosine, sine, userdata);
-   }
 
    coords.vertices      = 4;
    coords.vertex        = NULL;
@@ -1103,9 +1101,13 @@ static int gfx_widgets_draw_indicator(
             p_disp,
             video_width,
             video_height,
-            width, height,
-            icon, top_right_x_advance - width, y,
-            0,
+            width,
+            height,
+            icon,
+            top_right_x_advance - width, y,
+            0.0f, /* rad */
+            1.0f, /* cos(rad)   = cos(0)  = 1.0f */
+            0.0f, /* sine(rad)  = sine(0) = 0.0f */
             p_dispwidget->pure_white
             );
       if (dispctx && dispctx->blend_end)
@@ -1255,21 +1257,34 @@ static void gfx_widgets_draw_task_msg(
    gfx_display_set_alpha(p_dispwidget->pure_white, msg->alpha);
    if (dispctx && dispctx->blend_begin)
       dispctx->blend_begin(userdata);
-   gfx_widgets_draw_icon(
-         userdata,
-         p_disp,
-         video_width,
-         video_height,
-         p_dispwidget->msg_queue_height / 2,
-         p_dispwidget->msg_queue_height / 2,
-         p_dispwidget->gfx_widgets_icons_textures[
-         msg->task_finished 
-         ? MENU_WIDGETS_ICON_CHECK 
-         : MENU_WIDGETS_ICON_HOURGLASS],
-         p_dispwidget->msg_queue_task_hourglass_x,
-         video_height - msg->offset_y,
-         msg->task_finished ? 0 : msg->hourglass_rotation,
-         p_dispwidget->pure_white);
+   {
+      float radians = 0.0f; /* rad                        */
+      float cosine  = 0.0f; /* cos(rad)  = cos(0)  = 1.0f */
+      float sine    = 1.0f; /* sine(rad) = sine(0) = 0.0f */
+      if (!msg->task_finished)
+      {
+         radians    = msg->hourglass_rotation;
+         cosine     = cosf(radians);
+         sine       = sinf(radians);
+      }
+      gfx_widgets_draw_icon(
+            userdata,
+            p_disp,
+            video_width,
+            video_height,
+            p_dispwidget->msg_queue_height / 2,
+            p_dispwidget->msg_queue_height / 2,
+            p_dispwidget->gfx_widgets_icons_textures[
+            msg->task_finished 
+            ? MENU_WIDGETS_ICON_CHECK 
+            : MENU_WIDGETS_ICON_HOURGLASS],
+            p_dispwidget->msg_queue_task_hourglass_x,
+            video_height - msg->offset_y,
+            radians,
+            cosine,
+            sine,
+            p_dispwidget->pure_white);
+   }
    if (dispctx && dispctx->blend_end)
       dispctx->blend_end(userdata);
 
@@ -1451,7 +1466,9 @@ static void gfx_widgets_draw_regular_msg(
             p_dispwidget->gfx_widgets_icons_textures[MENU_WIDGETS_ICON_INFO],
             p_dispwidget->msg_queue_spacing,
             video_height - msg->offset_y  - p_dispwidget->msg_queue_icon_offset_y,
-            0,
+            0.0f, /* rad                         */
+            1.0f, /* cos(rad)   = cos(0)  = 1.0f */
+            0.0f, /* sine(rad)  = sine(0) = 0.0f */
             msg_queue_info);
 
       if (dispctx && dispctx->blend_end)
@@ -1532,7 +1549,9 @@ void gfx_widgets_frame(void *data)
                p_dispwidget->ai_service_overlay_texture,
                0,
                0,
-               0,
+               0.0f, /* rad                         */
+               1.0f, /* cos(rad)   = cos(0)  = 1.0f */
+               0.0f, /* sine(rad)  = sine(0) = 0.0f */
                p_dispwidget->pure_white
                );
          if (dispctx->blend_end)
diff --git a/gfx/gfx_widgets.h b/gfx/gfx_widgets.h
index 8121d0e293..f0f25264b3 100644
--- a/gfx/gfx_widgets.h
+++ b/gfx/gfx_widgets.h
@@ -286,7 +286,9 @@ void gfx_widgets_draw_icon(
       unsigned icon_height,
       uintptr_t texture,
       float x, float y,
-      float rotation,
+      float radians,
+      float cosine,
+      float sine,
       float *color);
 
 void gfx_widgets_draw_text(
diff --git a/gfx/widgets/gfx_widget_achievement_popup.c b/gfx/widgets/gfx_widget_achievement_popup.c
index 3002e7c67f..43037db91b 100644
--- a/gfx/widgets/gfx_widget_achievement_popup.c
+++ b/gfx/widgets/gfx_widget_achievement_popup.c
@@ -176,7 +176,10 @@ static void gfx_widget_achievement_popup_frame(void* data, void* userdata)
                   MENU_WIDGETS_ICON_ACHIEVEMENT],
                   0,
                   state->y,
-                  0, pure_white);
+                  0.0f, /* rad */
+                  1.0f, /* cos(rad)   = cos(0)  = 1.0f */
+                  0.0f, /* sine(rad)  = sine(0) = 0.0f */
+                  pure_white);
             if (dispctx && dispctx->blend_end)
                dispctx->blend_end(video_info->userdata);
          }
@@ -194,7 +197,10 @@ static void gfx_widget_achievement_popup_frame(void* data, void* userdata)
                state->queue[state->queue_read_index].badge,
                0,
                state->y,
-               0, pure_white);
+               0.0f, /* rad */
+               1.0f, /* cos(rad)   = cos(0)  = 1.0f */
+               0.0f, /* sine(rad)  = sine(0) = 0.0f */
+               pure_white);
       }
 
       /* I _think_ state->unfold changes in another thread */
diff --git a/gfx/widgets/gfx_widget_leaderboard_display.c b/gfx/widgets/gfx_widget_leaderboard_display.c
index 2642d10f81..452a341d87 100644
--- a/gfx/widgets/gfx_widget_leaderboard_display.c
+++ b/gfx/widgets/gfx_widget_leaderboard_display.c
@@ -174,12 +174,21 @@ static void gfx_widget_leaderboard_display_frame(void* data, void* userdata)
                   if (dispctx && dispctx->blend_begin)
                      dispctx->blend_begin(video_info->userdata);
 
-                  gfx_widgets_draw_icon(video_info->userdata,
-                        p_disp, video_width, video_height,
-                        widget_size, widget_size,
+                  gfx_widgets_draw_icon(
+                        video_info->userdata,
+                        p_disp,
+                        video_width,
+                        video_height,
+                        widget_size,
+                        widget_size,
                         p_dispwidget->gfx_widgets_icons_textures[
                               MENU_WIDGETS_ICON_ACHIEVEMENT],
-                        x, y, 0, pure_white);
+                        x,
+                        y,
+                        0.0f, /* rad */
+                        1.0f, /* cos(rad)   = cos(0)  = 1.0f */
+                        0.0f, /* sine(rad)  = sine(0) = 0.0f */
+                        pure_white);
 
                   if (dispctx && dispctx->blend_end)
                      dispctx->blend_end(video_info->userdata);
@@ -188,11 +197,20 @@ static void gfx_widget_leaderboard_display_frame(void* data, void* userdata)
             else
             {
                /* achievement badge */
-               gfx_widgets_draw_icon(video_info->userdata,
-                     p_disp, video_width, video_height,
-                     widget_size, widget_size,
+               gfx_widgets_draw_icon(
+                     video_info->userdata,
+                     p_disp,
+                     video_width,
+                     video_height,
+                     widget_size,
+                     widget_size,
                      state->challenge_info[i].image,
-                     x, y, 0, pure_white);
+                     x,
+                     y,
+                     0.0f, /* rad */
+                     1.0f, /* cos(rad)   = cos(0)  = 1.0f */
+                     0.0f, /* sine(rad)  = sine(0) = 0.0f */
+                     pure_white);
             }
          }
       }
diff --git a/gfx/widgets/gfx_widget_load_content_animation.c b/gfx/widgets/gfx_widget_load_content_animation.c
index f7951a3fcd..42eb3b8b7f 100644
--- a/gfx/widgets/gfx_widget_load_content_animation.c
+++ b/gfx/widgets/gfx_widget_load_content_animation.c
@@ -805,7 +805,9 @@ static void gfx_widget_load_content_animation_frame(void *data, void *user_data)
                   state->icon_texture,
                   icon_x,
                   state->icon_y,
-                  0.0f,
+                  0.0f, /* rad */
+                  1.0f, /* cos(rad)   = cos(0)  = 1.0f */
+                  0.0f, /* sine(rad)  = sine(0) = 0.0f */
                   state->icon_color);
 
             if (dispctx && dispctx->blend_end)
diff --git a/gfx/widgets/gfx_widget_screenshot.c b/gfx/widgets/gfx_widget_screenshot.c
index 7bdc643114..3a7ecb66a3 100644
--- a/gfx/widgets/gfx_widget_screenshot.c
+++ b/gfx/widgets/gfx_widget_screenshot.c
@@ -240,8 +240,12 @@ static void gfx_widget_screenshot_frame(void* data, void *user_data)
             state->thumbnail_width,
             state->thumbnail_height,
             state->texture,
-            0, state->y,
-            0, pure_white
+            0,
+            state->y,
+            0.0f, /* rad */
+            1.0f, /* cos(rad)   = cos(0)  = 1.0f */
+            0.0f, /* sine(rad)  = sine(0) = 0.0f */
+            pure_white
             );
 
       gfx_widgets_draw_text(font_regular,
diff --git a/gfx/widgets/gfx_widget_volume.c b/gfx/widgets/gfx_widget_volume.c
index 703026d512..9240036efd 100644
--- a/gfx/widgets/gfx_widget_volume.c
+++ b/gfx/widgets/gfx_widget_volume.c
@@ -198,8 +198,12 @@ static void gfx_widget_volume_frame(void* data, void *user_data)
                video_height,
                icon_size, icon_size,
                volume_icon,
-               0, 0,
-               0, pure_white
+               0,
+               0,
+               0.0f, /* rad */
+               1.0f, /* cos(rad)   = cos(0)  = 1.0f */
+               0.0f, /* sine(rad)  = sine(0) = 0.0f */
+               pure_white
                );
          if (dispctx && dispctx->blend_end)
             dispctx->blend_end(userdata);