[coreboot-gerrit] Change in libgfxinit[master]: [WIP] gfx_test: Move Cursors

Nico Huber (Code Review) gerrit at coreboot.org
Wed Feb 7 12:13:05 CET 2018


Nico Huber has uploaded this change for review. ( https://review.coreboot.org/23638


Change subject: [WIP] gfx_test: Move Cursors
......................................................................

[WIP] gfx_test: Move Cursors

Change-Id: I5187379c0b6c3c20f43c323fa6b4a903746a02a8
Signed-off-by: Nico Huber <nico.h at gmx.de>
---
M gfxtest/hw-gfx-gma-gfx_test.adb
1 file changed, 154 insertions(+), 6 deletions(-)



  git pull ssh://review.coreboot.org:29418/libgfxinit refs/changes/38/23638/1

diff --git a/gfxtest/hw-gfx-gma-gfx_test.adb b/gfxtest/hw-gfx-gma-gfx_test.adb
index 0c29fbe..aa83aa8 100644
--- a/gfxtest/hw-gfx-gma-gfx_test.adb
+++ b/gfxtest/hw-gfx-gma-gfx_test.adb
@@ -15,9 +15,9 @@
 is
    pragma Disable_Atomic_Synchronization;
 
-   package Rand_P is new Ada.Numerics.Discrete_Random (Pos_Type);
+   package Rand_P is new Ada.Numerics.Discrete_Random (Natural);
    Gen : Rand_P.Generator;
-   function Rand return Pos_Type is (Rand_P.Random (Gen));
+   function Rand return Int32 is (Int32 (Rand_P.Random (Gen)));
 
    Start_X : constant := 0;
    Start_Y : constant := 0;
@@ -371,6 +371,147 @@
       GMA.Dump_Configs (Pipes);
    end Prepare_Configs;
 
+   procedure Script_Cursors
+     (Pipes    : in out GMA.Pipe_Configs;
+      Time_S   : in     Natural)
+   is
+      type Corner is (UL, UR, LR, LL);
+      type Cursor_Script_Entry is record
+         Rel : Corner;
+         X, Y : Int32;
+      end record;
+      Cursor_Script : constant array (Natural range 0 .. 19) of Cursor_Script_Entry :=
+        ((UL,  16,  16), (UL,  16,  16), (UL,  16,  16), (UL, -32,   0), (UL,  16,  16),
+         (UR, -16,  16), (UR, -16,  16), (UR, -16,  16), (UR,   0, -32), (UR, -16,  16),
+         (LR, -16, -16), (LR, -16, -16), (LR, -16, -16), (LR,  32,   0), (LR, -16, -16),
+         (LL,  16, -16), (LL,  16, -16), (LL,  16, -16), (LL,   0,  32), (LL,  16, -16));
+
+      Deadline : constant Time.T := Time.MS_From_Now (1_000 * Time_S);
+      Timed_Out : Boolean := False;
+      Cnt : Word32 := 0;
+   begin
+      loop
+         for Pipe in Pipe_Index loop
+            exit when Pipes (Pipe).Port = GMA.Disabled;
+            declare
+               C : Cursor_Type renames Pipes (Pipe).Cursor;
+               FB : Framebuffer_Type renames Pipes (Pipe).Framebuffer;
+               Width : constant Int32 := Int32 (Rotated_Width (FB));
+               Height : constant Int32 := Int32 (Rotated_Height (FB));
+               CS : Cursor_Script_Entry renames Cursor_Script
+                 (Natural (Cnt) mod (Cursor_Script'Last + 1));
+            begin
+               C.Center_X := CS.X;
+               C.Center_Y := CS.Y;
+               case CS.Rel is
+                  when UL  => null;
+                  when UR  => C.Center_X := CS.X + Width;
+                  when LR  => C.Center_X := CS.X + Width;
+                              C.Center_Y := CS.Y + Height;
+                  when LL  => C.Center_Y := CS.Y + Height;
+               end case;
+               GMA.Place_Cursor (Pipe, C.Center_X, C.Center_Y);
+            end;
+         end loop;
+         Timed_Out := Time.Timed_Out (Deadline);
+         exit when Timed_Out;
+         Time.M_Delay (160);
+         Cnt := Cnt + 1;
+      end loop;
+   end Script_Cursors;
+
+   type Cursor_Info is record
+      X_Velo, Y_Velo : Int32;
+      X_Acc, Y_Acc : Int32;
+      Color : Pipe_Index;
+      Size : Cursor_Size;
+   end record;
+   function Cursor_Rand return Int32 is (Rand mod 51 - 25);
+   Cursor_Infos : array (Pipe_Index) of Cursor_Info :=
+     (others =>
+        (Color    => Pipe_Index'Val (Rand mod 3),
+         Size     => Cursor_Size'Val (Rand mod 3),
+         X_Velo   => 3 * Cursor_Rand,
+         Y_Velo   => 3 * Cursor_Rand,
+         others   => Cursor_Rand));
+
+   procedure Move_Cursors
+     (Pipes    : in out GMA.Pipe_Configs;
+      Time_S   : in     Natural)
+   is
+      procedure Select_New_Cursor
+        (P  : in     Pipe_Index;
+         C  : in out Cursor_Type;
+         CI : in out Cursor_Info)
+      is
+         Old_C : constant Cursor_Type := C;
+      begin
+         -- change either size or color
+         if Rand mod 2 = 0 then
+            CI.Color := Pipe_Index'Val
+              ((Pipe_Index'Pos (CI.Color) + 1 + Rand mod 2) mod 3);
+         else
+            CI.Size := Cursor_Size'Val
+              ((Cursor_Size'Pos (CI.Size) + 1 + Rand mod 2) mod 3);
+         end if;
+         C := Cursors (CI.Color) (CI.Size);
+         C.Center_X := Old_C.Center_X;
+         C.Center_Y := Old_C.Center_Y;
+         GMA.Update_Cursor (P, C);
+      end Select_New_Cursor;
+
+      Deadline : constant Time.T := Time.MS_From_Now (1_000 * Time_S);
+      Timed_Out : Boolean := False;
+      Cnt : Word32 := 0;
+   begin
+      for Pipe in Pipe_Index loop
+         exit when Pipes (Pipe).Port = GMA.Disabled;
+         Select_New_Cursor (Pipe, Pipes (Pipe).Cursor, Cursor_Infos (Pipe));
+      end loop;
+      loop
+         for Pipe in Pipe_Index loop
+            exit when Pipes (Pipe).Port = GMA.Disabled;
+            declare
+               C : Cursor_Type renames Pipes (Pipe).Cursor;
+               CI : Cursor_Info renames Cursor_Infos (Pipe);
+               FB : Framebuffer_Type renames Pipes (Pipe).Framebuffer;
+               Width : constant Int32 := Int32 (Rotated_Width (FB));
+               Height : constant Int32 := Int32 (Rotated_Height (FB));
+
+               Update : Boolean := False;
+            begin
+               if Cnt mod 16 = 0 then
+                  CI.X_Acc := Cursor_Rand;
+                  CI.Y_Acc := Cursor_Rand;
+               end if;
+               CI.X_Velo := CI.X_Velo + CI.X_Acc;
+               CI.Y_Velo := CI.Y_Velo + CI.Y_Acc;
+               C.Center_X := C.Center_X + CI.X_Velo / 100;
+               C.Center_Y := C.Center_Y + CI.Y_Velo / 100;
+               if C.Center_X not in 0 .. Width - 1 then
+                 C.Center_X := Int32'Max (0, Int32'Min (Width, C.Center_X));
+                 CI.X_Velo := -CI.X_Velo;
+                 Update := True;
+               end if;
+               if C.Center_Y not in 0 .. Height - 1 then
+                 C.Center_Y := Int32'Max (0, Int32'Min (Height, C.Center_Y));
+                 CI.Y_Velo := -CI.Y_Velo;
+                 Update := True;
+               end if;
+               if Update then
+                  Select_New_Cursor (Pipe, C, CI);
+               else
+                  GMA.Place_Cursor (Pipe, C.Center_X, C.Center_Y);
+               end if;
+            end;
+         end loop;
+         Timed_Out := Time.Timed_Out (Deadline);
+         exit when Timed_Out;
+         Time.M_Delay (16);   -- ~60 fps
+         Cnt := Cnt + 1;
+      end loop;
+   end Move_Cursors;
+
    procedure Print_Usage
    is
    begin
@@ -465,8 +606,10 @@
             end loop;
          end loop;
 
-         if Delay_S >= 12 then -- getting bored?
-            Time.M_Delay (8_000);
+         if Delay_S < 12 then
+            Script_Cursors (Pipes, Delay_S);
+         else -- getting bored?
+            Script_Cursors (Pipes, 8);
             Delay_S := Delay_S - 8;
             declare
                New_Pipes : GMA.Pipe_Configs := Pipes;
@@ -485,6 +628,7 @@
                      declare
                         New_FB : Framebuffer_Type renames
                            New_Pipes (Pipe).Framebuffer;
+                        Cursor : Cursor_Type renames New_Pipes (Pipe).Cursor;
                         Width : constant Width_Type :=
                            Pipes (Pipe).Framebuffer.Width;
                         Height : constant Height_Type :=
@@ -498,16 +642,20 @@
                           (320, Width - New_FB.Start_X - Rand_Div (Width));
                         New_FB.Height := Height_Type'Max
                           (320, Height - New_FB.Start_Y - Rand_Div (Height));
+
+                        Cursor.Center_X := Int32 (Rotated_Width (New_FB)) / 2;
+                        Cursor.Center_Y := Int32 (Rotated_Height (New_FB)) / 2;
+                        GMA.Update_Cursor (Pipe, Cursor);
                      end;
                   end loop;
                   GMA.Dump_Configs (New_Pipes);
                   GMA.Update_Outputs (New_Pipes);
-                  Time.M_Delay (4_000);
+                  Move_Cursors (New_Pipes, 4);
                   Delay_S := Delay_S - 4;
                end loop;
+               Move_Cursors (New_Pipes, Delay_S);
             end;
          end if;
-         Time.M_Delay (Delay_S * 1_000);
 
          for Pipe in GMA.Pipe_Index loop
             if Pipes (Pipe).Port /= GMA.Disabled then

-- 
To view, visit https://review.coreboot.org/23638
To unsubscribe, or for help writing mail filters, visit https://review.coreboot.org/settings

Gerrit-Project: libgfxinit
Gerrit-Branch: master
Gerrit-MessageType: newchange
Gerrit-Change-Id: I5187379c0b6c3c20f43c323fa6b4a903746a02a8
Gerrit-Change-Number: 23638
Gerrit-PatchSet: 1
Gerrit-Owner: Nico Huber <nico.h at gmx.de>
-------------- next part --------------
An HTML attachment was scrubbed...
URL: <http://mail.coreboot.org/pipermail/coreboot-gerrit/attachments/20180207/d3d6c784/attachment-0001.html>


More information about the coreboot-gerrit mailing list