<p>Nico Huber has uploaded this change for <strong>review</strong>.</p><p><a href="https://review.coreboot.org/23638">View Change</a></p><pre style="font-family: monospace,monospace; white-space: pre-wrap;">[WIP] gfx_test: Move Cursors<br><br>Change-Id: I5187379c0b6c3c20f43c323fa6b4a903746a02a8<br>Signed-off-by: Nico Huber <nico.h@gmx.de><br>---<br>M gfxtest/hw-gfx-gma-gfx_test.adb<br>1 file changed, 154 insertions(+), 6 deletions(-)<br><br></pre><pre style="font-family: monospace,monospace; white-space: pre-wrap;">git pull ssh://review.coreboot.org:29418/libgfxinit refs/changes/38/23638/1</pre><pre style="font-family: monospace,monospace; white-space: pre-wrap;"><span>diff --git a/gfxtest/hw-gfx-gma-gfx_test.adb b/gfxtest/hw-gfx-gma-gfx_test.adb</span><br><span>index 0c29fbe..aa83aa8 100644</span><br><span>--- a/gfxtest/hw-gfx-gma-gfx_test.adb</span><br><span>+++ b/gfxtest/hw-gfx-gma-gfx_test.adb</span><br><span>@@ -15,9 +15,9 @@</span><br><span> is</span><br><span>    pragma Disable_Atomic_Synchronization;</span><br><span> </span><br><span style="color: hsl(0, 100%, 40%);">-   package Rand_P is new Ada.Numerics.Discrete_Random (Pos_Type);</span><br><span style="color: hsl(120, 100%, 40%);">+   package Rand_P is new Ada.Numerics.Discrete_Random (Natural);</span><br><span>    Gen : Rand_P.Generator;</span><br><span style="color: hsl(0, 100%, 40%);">-   function Rand return Pos_Type is (Rand_P.Random (Gen));</span><br><span style="color: hsl(120, 100%, 40%);">+   function Rand return Int32 is (Int32 (Rand_P.Random (Gen)));</span><br><span> </span><br><span>    Start_X : constant := 0;</span><br><span>    Start_Y : constant := 0;</span><br><span>@@ -371,6 +371,147 @@</span><br><span>       GMA.Dump_Configs (Pipes);</span><br><span>    end Prepare_Configs;</span><br><span> </span><br><span style="color: hsl(120, 100%, 40%);">+   procedure Script_Cursors</span><br><span style="color: hsl(120, 100%, 40%);">+     (Pipes    : in out GMA.Pipe_Configs;</span><br><span style="color: hsl(120, 100%, 40%);">+      Time_S   : in     Natural)</span><br><span style="color: hsl(120, 100%, 40%);">+   is</span><br><span style="color: hsl(120, 100%, 40%);">+      type Corner is (UL, UR, LR, LL);</span><br><span style="color: hsl(120, 100%, 40%);">+      type Cursor_Script_Entry is record</span><br><span style="color: hsl(120, 100%, 40%);">+         Rel : Corner;</span><br><span style="color: hsl(120, 100%, 40%);">+         X, Y : Int32;</span><br><span style="color: hsl(120, 100%, 40%);">+      end record;</span><br><span style="color: hsl(120, 100%, 40%);">+      Cursor_Script : constant array (Natural range 0 .. 19) of Cursor_Script_Entry :=</span><br><span style="color: hsl(120, 100%, 40%);">+        ((UL,  16,  16), (UL,  16,  16), (UL,  16,  16), (UL, -32,   0), (UL,  16,  16),</span><br><span style="color: hsl(120, 100%, 40%);">+         (UR, -16,  16), (UR, -16,  16), (UR, -16,  16), (UR,   0, -32), (UR, -16,  16),</span><br><span style="color: hsl(120, 100%, 40%);">+         (LR, -16, -16), (LR, -16, -16), (LR, -16, -16), (LR,  32,   0), (LR, -16, -16),</span><br><span style="color: hsl(120, 100%, 40%);">+         (LL,  16, -16), (LL,  16, -16), (LL,  16, -16), (LL,   0,  32), (LL,  16, -16));</span><br><span style="color: hsl(120, 100%, 40%);">+</span><br><span style="color: hsl(120, 100%, 40%);">+      Deadline : constant Time.T := Time.MS_From_Now (1_000 * Time_S);</span><br><span style="color: hsl(120, 100%, 40%);">+      Timed_Out : Boolean := False;</span><br><span style="color: hsl(120, 100%, 40%);">+      Cnt : Word32 := 0;</span><br><span style="color: hsl(120, 100%, 40%);">+   begin</span><br><span style="color: hsl(120, 100%, 40%);">+      loop</span><br><span style="color: hsl(120, 100%, 40%);">+         for Pipe in Pipe_Index loop</span><br><span style="color: hsl(120, 100%, 40%);">+            exit when Pipes (Pipe).Port = GMA.Disabled;</span><br><span style="color: hsl(120, 100%, 40%);">+            declare</span><br><span style="color: hsl(120, 100%, 40%);">+               C : Cursor_Type renames Pipes (Pipe).Cursor;</span><br><span style="color: hsl(120, 100%, 40%);">+               FB : Framebuffer_Type renames Pipes (Pipe).Framebuffer;</span><br><span style="color: hsl(120, 100%, 40%);">+               Width : constant Int32 := Int32 (Rotated_Width (FB));</span><br><span style="color: hsl(120, 100%, 40%);">+               Height : constant Int32 := Int32 (Rotated_Height (FB));</span><br><span style="color: hsl(120, 100%, 40%);">+               CS : Cursor_Script_Entry renames Cursor_Script</span><br><span style="color: hsl(120, 100%, 40%);">+                 (Natural (Cnt) mod (Cursor_Script'Last + 1));</span><br><span style="color: hsl(120, 100%, 40%);">+            begin</span><br><span style="color: hsl(120, 100%, 40%);">+               C.Center_X := CS.X;</span><br><span style="color: hsl(120, 100%, 40%);">+               C.Center_Y := CS.Y;</span><br><span style="color: hsl(120, 100%, 40%);">+               case CS.Rel is</span><br><span style="color: hsl(120, 100%, 40%);">+                  when UL  => null;</span><br><span style="color: hsl(120, 100%, 40%);">+                  when UR  => C.Center_X := CS.X + Width;</span><br><span style="color: hsl(120, 100%, 40%);">+                  when LR  => C.Center_X := CS.X + Width;</span><br><span style="color: hsl(120, 100%, 40%);">+                              C.Center_Y := CS.Y + Height;</span><br><span style="color: hsl(120, 100%, 40%);">+                  when LL  => C.Center_Y := CS.Y + Height;</span><br><span style="color: hsl(120, 100%, 40%);">+               end case;</span><br><span style="color: hsl(120, 100%, 40%);">+               GMA.Place_Cursor (Pipe, C.Center_X, C.Center_Y);</span><br><span style="color: hsl(120, 100%, 40%);">+            end;</span><br><span style="color: hsl(120, 100%, 40%);">+         end loop;</span><br><span style="color: hsl(120, 100%, 40%);">+         Timed_Out := Time.Timed_Out (Deadline);</span><br><span style="color: hsl(120, 100%, 40%);">+         exit when Timed_Out;</span><br><span style="color: hsl(120, 100%, 40%);">+         Time.M_Delay (160);</span><br><span style="color: hsl(120, 100%, 40%);">+         Cnt := Cnt + 1;</span><br><span style="color: hsl(120, 100%, 40%);">+      end loop;</span><br><span style="color: hsl(120, 100%, 40%);">+   end Script_Cursors;</span><br><span style="color: hsl(120, 100%, 40%);">+</span><br><span style="color: hsl(120, 100%, 40%);">+   type Cursor_Info is record</span><br><span style="color: hsl(120, 100%, 40%);">+      X_Velo, Y_Velo : Int32;</span><br><span style="color: hsl(120, 100%, 40%);">+      X_Acc, Y_Acc : Int32;</span><br><span style="color: hsl(120, 100%, 40%);">+      Color : Pipe_Index;</span><br><span style="color: hsl(120, 100%, 40%);">+      Size : Cursor_Size;</span><br><span style="color: hsl(120, 100%, 40%);">+   end record;</span><br><span style="color: hsl(120, 100%, 40%);">+   function Cursor_Rand return Int32 is (Rand mod 51 - 25);</span><br><span style="color: hsl(120, 100%, 40%);">+   Cursor_Infos : array (Pipe_Index) of Cursor_Info :=</span><br><span style="color: hsl(120, 100%, 40%);">+     (others =></span><br><span style="color: hsl(120, 100%, 40%);">+        (Color    => Pipe_Index'Val (Rand mod 3),</span><br><span style="color: hsl(120, 100%, 40%);">+         Size     => Cursor_Size'Val (Rand mod 3),</span><br><span style="color: hsl(120, 100%, 40%);">+         X_Velo   => 3 * Cursor_Rand,</span><br><span style="color: hsl(120, 100%, 40%);">+         Y_Velo   => 3 * Cursor_Rand,</span><br><span style="color: hsl(120, 100%, 40%);">+         others   => Cursor_Rand));</span><br><span style="color: hsl(120, 100%, 40%);">+</span><br><span style="color: hsl(120, 100%, 40%);">+   procedure Move_Cursors</span><br><span style="color: hsl(120, 100%, 40%);">+     (Pipes    : in out GMA.Pipe_Configs;</span><br><span style="color: hsl(120, 100%, 40%);">+      Time_S   : in     Natural)</span><br><span style="color: hsl(120, 100%, 40%);">+   is</span><br><span style="color: hsl(120, 100%, 40%);">+      procedure Select_New_Cursor</span><br><span style="color: hsl(120, 100%, 40%);">+        (P  : in     Pipe_Index;</span><br><span style="color: hsl(120, 100%, 40%);">+         C  : in out Cursor_Type;</span><br><span style="color: hsl(120, 100%, 40%);">+         CI : in out Cursor_Info)</span><br><span style="color: hsl(120, 100%, 40%);">+      is</span><br><span style="color: hsl(120, 100%, 40%);">+         Old_C : constant Cursor_Type := C;</span><br><span style="color: hsl(120, 100%, 40%);">+      begin</span><br><span style="color: hsl(120, 100%, 40%);">+         -- change either size or color</span><br><span style="color: hsl(120, 100%, 40%);">+         if Rand mod 2 = 0 then</span><br><span style="color: hsl(120, 100%, 40%);">+            CI.Color := Pipe_Index'Val</span><br><span style="color: hsl(120, 100%, 40%);">+              ((Pipe_Index'Pos (CI.Color) + 1 + Rand mod 2) mod 3);</span><br><span style="color: hsl(120, 100%, 40%);">+         else</span><br><span style="color: hsl(120, 100%, 40%);">+            CI.Size := Cursor_Size'Val</span><br><span style="color: hsl(120, 100%, 40%);">+              ((Cursor_Size'Pos (CI.Size) + 1 + Rand mod 2) mod 3);</span><br><span style="color: hsl(120, 100%, 40%);">+         end if;</span><br><span style="color: hsl(120, 100%, 40%);">+         C := Cursors (CI.Color) (CI.Size);</span><br><span style="color: hsl(120, 100%, 40%);">+         C.Center_X := Old_C.Center_X;</span><br><span style="color: hsl(120, 100%, 40%);">+         C.Center_Y := Old_C.Center_Y;</span><br><span style="color: hsl(120, 100%, 40%);">+         GMA.Update_Cursor (P, C);</span><br><span style="color: hsl(120, 100%, 40%);">+      end Select_New_Cursor;</span><br><span style="color: hsl(120, 100%, 40%);">+</span><br><span style="color: hsl(120, 100%, 40%);">+      Deadline : constant Time.T := Time.MS_From_Now (1_000 * Time_S);</span><br><span style="color: hsl(120, 100%, 40%);">+      Timed_Out : Boolean := False;</span><br><span style="color: hsl(120, 100%, 40%);">+      Cnt : Word32 := 0;</span><br><span style="color: hsl(120, 100%, 40%);">+   begin</span><br><span style="color: hsl(120, 100%, 40%);">+      for Pipe in Pipe_Index loop</span><br><span style="color: hsl(120, 100%, 40%);">+         exit when Pipes (Pipe).Port = GMA.Disabled;</span><br><span style="color: hsl(120, 100%, 40%);">+         Select_New_Cursor (Pipe, Pipes (Pipe).Cursor, Cursor_Infos (Pipe));</span><br><span style="color: hsl(120, 100%, 40%);">+      end loop;</span><br><span style="color: hsl(120, 100%, 40%);">+      loop</span><br><span style="color: hsl(120, 100%, 40%);">+         for Pipe in Pipe_Index loop</span><br><span style="color: hsl(120, 100%, 40%);">+            exit when Pipes (Pipe).Port = GMA.Disabled;</span><br><span style="color: hsl(120, 100%, 40%);">+            declare</span><br><span style="color: hsl(120, 100%, 40%);">+               C : Cursor_Type renames Pipes (Pipe).Cursor;</span><br><span style="color: hsl(120, 100%, 40%);">+               CI : Cursor_Info renames Cursor_Infos (Pipe);</span><br><span style="color: hsl(120, 100%, 40%);">+               FB : Framebuffer_Type renames Pipes (Pipe).Framebuffer;</span><br><span style="color: hsl(120, 100%, 40%);">+               Width : constant Int32 := Int32 (Rotated_Width (FB));</span><br><span style="color: hsl(120, 100%, 40%);">+               Height : constant Int32 := Int32 (Rotated_Height (FB));</span><br><span style="color: hsl(120, 100%, 40%);">+</span><br><span style="color: hsl(120, 100%, 40%);">+               Update : Boolean := False;</span><br><span style="color: hsl(120, 100%, 40%);">+            begin</span><br><span style="color: hsl(120, 100%, 40%);">+               if Cnt mod 16 = 0 then</span><br><span style="color: hsl(120, 100%, 40%);">+                  CI.X_Acc := Cursor_Rand;</span><br><span style="color: hsl(120, 100%, 40%);">+                  CI.Y_Acc := Cursor_Rand;</span><br><span style="color: hsl(120, 100%, 40%);">+               end if;</span><br><span style="color: hsl(120, 100%, 40%);">+               CI.X_Velo := CI.X_Velo + CI.X_Acc;</span><br><span style="color: hsl(120, 100%, 40%);">+               CI.Y_Velo := CI.Y_Velo + CI.Y_Acc;</span><br><span style="color: hsl(120, 100%, 40%);">+               C.Center_X := C.Center_X + CI.X_Velo / 100;</span><br><span style="color: hsl(120, 100%, 40%);">+               C.Center_Y := C.Center_Y + CI.Y_Velo / 100;</span><br><span style="color: hsl(120, 100%, 40%);">+               if C.Center_X not in 0 .. Width - 1 then</span><br><span style="color: hsl(120, 100%, 40%);">+                 C.Center_X := Int32'Max (0, Int32'Min (Width, C.Center_X));</span><br><span style="color: hsl(120, 100%, 40%);">+                 CI.X_Velo := -CI.X_Velo;</span><br><span style="color: hsl(120, 100%, 40%);">+                 Update := True;</span><br><span style="color: hsl(120, 100%, 40%);">+               end if;</span><br><span style="color: hsl(120, 100%, 40%);">+               if C.Center_Y not in 0 .. Height - 1 then</span><br><span style="color: hsl(120, 100%, 40%);">+                 C.Center_Y := Int32'Max (0, Int32'Min (Height, C.Center_Y));</span><br><span style="color: hsl(120, 100%, 40%);">+                 CI.Y_Velo := -CI.Y_Velo;</span><br><span style="color: hsl(120, 100%, 40%);">+                 Update := True;</span><br><span style="color: hsl(120, 100%, 40%);">+               end if;</span><br><span style="color: hsl(120, 100%, 40%);">+               if Update then</span><br><span style="color: hsl(120, 100%, 40%);">+                  Select_New_Cursor (Pipe, C, CI);</span><br><span style="color: hsl(120, 100%, 40%);">+               else</span><br><span style="color: hsl(120, 100%, 40%);">+                  GMA.Place_Cursor (Pipe, C.Center_X, C.Center_Y);</span><br><span style="color: hsl(120, 100%, 40%);">+               end if;</span><br><span style="color: hsl(120, 100%, 40%);">+            end;</span><br><span style="color: hsl(120, 100%, 40%);">+         end loop;</span><br><span style="color: hsl(120, 100%, 40%);">+         Timed_Out := Time.Timed_Out (Deadline);</span><br><span style="color: hsl(120, 100%, 40%);">+         exit when Timed_Out;</span><br><span style="color: hsl(120, 100%, 40%);">+         Time.M_Delay (16);   -- ~60 fps</span><br><span style="color: hsl(120, 100%, 40%);">+         Cnt := Cnt + 1;</span><br><span style="color: hsl(120, 100%, 40%);">+      end loop;</span><br><span style="color: hsl(120, 100%, 40%);">+   end Move_Cursors;</span><br><span style="color: hsl(120, 100%, 40%);">+</span><br><span>    procedure Print_Usage</span><br><span>    is</span><br><span>    begin</span><br><span>@@ -465,8 +606,10 @@</span><br><span>             end loop;</span><br><span>          end loop;</span><br><span> </span><br><span style="color: hsl(0, 100%, 40%);">-         if Delay_S >= 12 then -- getting bored?</span><br><span style="color: hsl(0, 100%, 40%);">-            Time.M_Delay (8_000);</span><br><span style="color: hsl(120, 100%, 40%);">+         if Delay_S < 12 then</span><br><span style="color: hsl(120, 100%, 40%);">+            Script_Cursors (Pipes, Delay_S);</span><br><span style="color: hsl(120, 100%, 40%);">+         else -- getting bored?</span><br><span style="color: hsl(120, 100%, 40%);">+            Script_Cursors (Pipes, 8);</span><br><span>             Delay_S := Delay_S - 8;</span><br><span>             declare</span><br><span>                New_Pipes : GMA.Pipe_Configs := Pipes;</span><br><span>@@ -485,6 +628,7 @@</span><br><span>                      declare</span><br><span>                         New_FB : Framebuffer_Type renames</span><br><span>                            New_Pipes (Pipe).Framebuffer;</span><br><span style="color: hsl(120, 100%, 40%);">+                        Cursor : Cursor_Type renames New_Pipes (Pipe).Cursor;</span><br><span>                         Width : constant Width_Type :=</span><br><span>                            Pipes (Pipe).Framebuffer.Width;</span><br><span>                         Height : constant Height_Type :=</span><br><span>@@ -498,16 +642,20 @@</span><br><span>                           (320, Width - New_FB.Start_X - Rand_Div (Width));</span><br><span>                         New_FB.Height := Height_Type'Max</span><br><span>                           (320, Height - New_FB.Start_Y - Rand_Div (Height));</span><br><span style="color: hsl(120, 100%, 40%);">+</span><br><span style="color: hsl(120, 100%, 40%);">+                        Cursor.Center_X := Int32 (Rotated_Width (New_FB)) / 2;</span><br><span style="color: hsl(120, 100%, 40%);">+                        Cursor.Center_Y := Int32 (Rotated_Height (New_FB)) / 2;</span><br><span style="color: hsl(120, 100%, 40%);">+                        GMA.Update_Cursor (Pipe, Cursor);</span><br><span>                      end;</span><br><span>                   end loop;</span><br><span>                   GMA.Dump_Configs (New_Pipes);</span><br><span>                   GMA.Update_Outputs (New_Pipes);</span><br><span style="color: hsl(0, 100%, 40%);">-                  Time.M_Delay (4_000);</span><br><span style="color: hsl(120, 100%, 40%);">+                  Move_Cursors (New_Pipes, 4);</span><br><span>                   Delay_S := Delay_S - 4;</span><br><span>                end loop;</span><br><span style="color: hsl(120, 100%, 40%);">+               Move_Cursors (New_Pipes, Delay_S);</span><br><span>             end;</span><br><span>          end if;</span><br><span style="color: hsl(0, 100%, 40%);">-         Time.M_Delay (Delay_S * 1_000);</span><br><span> </span><br><span>          for Pipe in GMA.Pipe_Index loop</span><br><span>             if Pipes (Pipe).Port /= GMA.Disabled then</span><br><span></span><br></pre><p>To view, visit <a href="https://review.coreboot.org/23638">change 23638</a>. To unsubscribe, or for help writing mail filters, visit <a href="https://review.coreboot.org/settings">settings</a>.</p><div itemscope itemtype="http://schema.org/EmailMessage"><div itemscope itemprop="action" itemtype="http://schema.org/ViewAction"><link itemprop="url" href="https://review.coreboot.org/23638"/><meta itemprop="name" content="View Change"/></div></div>

<div style="display:none"> Gerrit-Project: libgfxinit </div>
<div style="display:none"> Gerrit-Branch: master </div>
<div style="display:none"> Gerrit-MessageType: newchange </div>
<div style="display:none"> Gerrit-Change-Id: I5187379c0b6c3c20f43c323fa6b4a903746a02a8 </div>
<div style="display:none"> Gerrit-Change-Number: 23638 </div>
<div style="display:none"> Gerrit-PatchSet: 1 </div>
<div style="display:none"> Gerrit-Owner: Nico Huber <nico.h@gmx.de> </div>