<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>