[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