We do not need / use backend->resources anywhere outside of the query_device
function and with the upcoming hotplug support we need to get a fresh set
of resources on change events, so limit the resources lifetime to
query_device.
Signed-off-by: Hans de Goede <hdegoede@redhat.com>
Put all outputs in the outputs array instead of just the connected ones
and store the outputs array and the controller_id-to-head hashtable in the
backend object instead of temporarily allocating them during enumeration.
Also add new heads to the heads list and to the controller_id-to-head
hashtable in ply_renderer_head_new where this really belongs. This
allows nicely balancing these 2 with removing the head from the list
and hash_table in the ply_renderer_head_remove function which is added
in a follow-up commit.
This is a preparation patch for adding support for hotplugging
monitors while plymouth is running.
Signed-off-by: Hans de Goede <hdegoede@redhat.com>
Add a new get_output_info helper function, which fill a ply_output_t with
all info related to the connecter based on a connector-id.
Signed-off-by: Hans de Goede <hdegoede@redhat.com>
This is a preparation patch for hotplug support, for hotplug support we
want to keep the ply_output_t for connectors around, this change decouples
the lifetime of the drmModeConnector from the ply_output_t lifetime.
Signed-off-by: Hans de Goede <hdegoede@redhat.com>
Before this commit we were storing a pointer to the drmModeConnector
in struct _ply_renderer_head, solely so that we can free it when
destroying the head. This was necessary because we also stored a pointer
to the mode we picked, which comes from insided the drmModeConnector.
The drmModeModeInfo struct has no pointers, so we can simply store a copy
of it instead of a pointer, which removes the need to keep the
drmModeConnector around after probing the connectors.
Signed-off-by: Hans de Goede <hdegoede@redhat.com>
Both these function take a bunch of info coming from the ply_output_t
struct and with upcoming changes they are going to be using even more
ply_output_t fields. Instead of passing all these fields one by one,
simply directly pass a pointer to ply_output_t.
Signed-off-by: Hans de Goede <hdegoede@redhat.com>
This function can be called to notify the renderer of udev change-events.
This is a preparation patch for adding support for hotplugging
monitors while plymouth is running.
Signed-off-by: Hans de Goede <hdegoede@redhat.com>
Add a new ply_array_contains_uint32_element which checks if the queried
ply-array contains an element with the passed in uint32_t value.
Signed-off-by: Hans de Goede <hdegoede@redhat.com>
Update the spinner and bgrt themses diskcrypt dialog to match the dialog
from the "Disk decrypt" mockup from:
https://wiki.gnome.org/Design/OS/BootProgress
Signed-off-by: Hans de Goede <hdegoede@redhat.com>
Add watermark alignment settings, so that distros can simply drop
a watermark.png into the theme dir from another package and then have it
show up in the right place.
Signed-off-by: Hans de Goede <hdegoede@redhat.com>
The bgrt theme is using the exact same images as the spinner theme,
remove these and point ImageDir to the spinner theme dir instead.
Signed-off-by: Hans de Goede <hdegoede@redhat.com>
Before this commit plymouth-populate-initrd was only recursively copying the
/usr/share/plymouth/themes/$PLYMOUTH_THEME_NAME to the initrd, assuming
that ImageDir will point there.
This makes it impossible for 2 themes to share their ImageDir, which is
desirable for example for the spinner and bgrt themes, which use the same
images with slightly different settings.
This commit also makes plymouth-populate-initrd also copy the ImageDir
if it is different from the theme-dir, making it possible for ImageDir
to point to a different dir.
Signed-off-by: Hans de Goede <hdegoede@redhat.com>
Since the ask-for-password or ask-question dialog and the firmware background
may intersect so far we've been clearing the screen to black when showing a
dialog and using the firmware background.
This is not always desirable, this commit adds a new
"DialogClearsFirmwareBackground" option to the two-step based theme config
file, which enables this behavior when set.
The new default is to keep using the initial (firmware) background when
showing a dialog, which matches the non firmware-background paths.
Also update the bgrt theme to use the "DialogClearsFirmwareBackground"
option, keeping the current behavior for that theme.
Signed-off-by: Hans de Goede <hdegoede@redhat.com>
Add DialogHorizontalAlignment and DialogVerticalAlignment options which
allow placing the (diskcrypt) dialog aligned at another place then the
center of the screen.
Signed-off-by: Hans de Goede <hdegoede@redhat.com>
Rename the UseBGRT theme configfile option to UseFirmwareBackground,
to make it clear what this does using language which most users will be
able to understand, rather then using the cryptic BGRT ACPI table reference.
While at it also switch to using the new ply_key_file_get_bool function, so
that users can edit an existing configfile with "UseFirmwareBackground=true"
in there and change it to "=false" and actually have that work as expected.
The switch to ply_key_file_get_bool also fixes a memleak as
ply_key_file_get_value returns a strdup-ed value which we were not free-ing.
Signed-off-by: Hans de Goede <hdegoede@redhat.com>
Add a function to read a boolean value from a ply-key-file.
This function will return true if the key exists and it has a value of "1",
"y", "yes" or "true" (case-insensitive). In all other cases it returns
false.
Signed-off-by: Hans de Goede <hdegoede@redhat.com>
Use the locale agnostic plymouth_strtod helper which always uses a "."
as decimal seperator. This fixes the various Alignment options not working
with some locales.
While at it also add a ply_trace to log the size and chosen centering for
the watermark image.
Signed-off-by: Hans de Goede <hdegoede@redhat.com>
Add a ply_strtod helper which always uses "." as decimal separator
independent of the locale.
Using this fixes e.g. HorizontalAlignment in the two-step plugin
not working with some locales.
Signed-off-by: Hans de Goede <hdegoede@redhat.com>
Fix: "warning: enumeration value ‘PLY_KEYBOARD_PROVIDER_TYPE_TERMINAL’
not handled in switch [-Wswitch-enum]" compiler warning.
Signed-off-by: Hans de Goede <hdegoede@redhat.com>
When a renderer goes away on a udev remove event, free keyboards associated with the renderer, before freeing the renderer. This avoids a null pointer dereference when ply_device_manager_deactivate_keyboards gets called later on:
https://bugs.launchpad.net/ubuntu/+source/plymouth/+bug/1794292
See merge request plymouth/plymouth!10
So far we've been relying on the kernel fbcon code to set up all outputs,
now that distros have started using deferred fbcon takeover for flickerfree
booting, we can no longer rely on this and in some cases we must pick
our own controllers.
Signed-off-by: Hans de Goede <hdegoede@redhat.com>
This avoids the need to call ply_renderer_connector_get_rotation_and_tiled
twice and thus also the need to call drmModeGetProperty twice for all
properties.
Signed-off-by: Hans de Goede <hdegoede@redhat.com>
Refactor create_heads_for_active_connectors to prepare it for adding a
step where we assign controllers to connected outputs which do not have
a controller assigned yet.
Signed-off-by: Hans de Goede <hdegoede@redhat.com>
The only way we use mode_index is to get the mode, so its easier to
directly store the mode when we create a head.
Signed-off-by: Hans de Goede <hdegoede@redhat.com>
Upside-down LCD panels are fixed up in HW by the GOP, so the bgrt image is
not rotated in this case and we should not rotate it to compensate.
While at it also fixup the wrong indentation of the
ply_pixel_buffer_set_device_scale() call.
Signed-off-by: Hans de Goede <hdegoede@redhat.com>
Add support for using the firmware splash as background for the two-step splash plugin using the ACPI BGRT extension
See merge request plymouth/plymouth!14
Add a new BGRT theme, this is a copy of the spinner theme, using the ACPI
BGRT graphics (firmware boot splash) as logo when available.
Signed-off-by: Hans de Goede <hdegoede@redhat.com>
On laptops / tablets the LCD panel is typically brought up in
its native resolution, so we can trust the x- and y-offset values
provided by the firmware to be correct for a screen with the panels
resolution.
Moreover some laptop / tablet firmwares to do all kind of hacks wrt
the y-offset. This happens especially on devices where the panel is
mounted 90 degrees rotated, but also on other devices.
So on devices with an internal LCD panel, we prefer to use the firmware
provided offsets, to make sure we match its quirky behavior.
We check that the x-offset matches what we expect for the panel's
native resolution to make sure that the values are indeed for the
panel's native resolution and then we correct for any difference
between the (external) screen's and the panel's resolution.
Signed-off-by: Hans de Goede <hdegoede@redhat.com>
Add support to (optionally) use the firmware splash screen logo
from the ACPI BGRT extension as background.
Signed-off-by: Hans de Goede <hdegoede@redhat.com>
Before this commit background drawing on HiDPI screens is quite slow
and CPU intensive, because we do the interpolating scale, which does
a whole bunch of double-precision float operations for *each* pixel
for every frame we draw.
When using two-step with a background-tile on a Cherry Trail machine with
a HiDPI screen this results in the diskcrypt password entry being visible
laggy, I can type the password much faster then the bullets show up.
This also means we are pegging the CPU during boot, significantly slowing
down the boot.
This commit fixes this by creating the background_buffer at the screen's
device_scale and rotation, only doing the scaling once.
This commit further speeds things up by also doing the solid/gradient fill
of the background + the alpha blend of the tiled background-image once,
creating a solid background which allows us to hit the
ply_pixel_buffer_fill_with_buffer memcpy fast-path and avoids the need to
re-do the solid/gradient fill + alpha-blend each frame we render.
Signed-off-by: Hans de Goede <hdegoede@redhat.com>
Use a pixel-buffer instead of an image, this gives us more flexibility.
This is a preparation patch for adding support to (optionally) use
the firmware splash screen logo (from the ACPI BGRT extension) as
background.
Signed-off-by: Hans de Goede <hdegoede@redhat.com>
For some themes we want to use the firmware-logo / splash as background,
when the LCD panel of a laptop is mounted non-upright then the image which
we get from the firmware will be pre-rotated to match the LCD panel mount.
Until now our device-rotation support was limited to using rotated
pixel_buffer-s as destination / canvas only.
This commit adds a ply_pixel_buffer_rotate_upright helper to rotate
a nop-upright source buffer upright so that we can use it as source-buffer
to other functions which expect source-buffers to always be upright.
Signed-off-by: Hans de Goede <hdegoede@redhat.com>
For some themes we want to use the firmware-logo / splash as background,
when the LCD panel of a laptop is mounted non-upright then the image which
we get from the firmware will be pre-rotated to match the LCD panel mount.
This commit adds ply_pixel_buffer_set/get_device_rotation helpers to
help deal with this.
Signed-off-by: Hans de Goede <hdegoede@redhat.com>
Instead of comparing fill_area addresses actually compare the contents
of the ply_rectangles.
This allows us to use the memcpy fastpath in ply_pixel_buffer_with_buffer
more often.
Signed-off-by: Hans de Goede <hdegoede@redhat.com>
After calling ply_pixel_buffer_crop_area_to_clip_area cropped_area.x/y
are in device coordinates. So when calculating the x/y offset in the
source-buffer due to device-clip areas possible making cropped_area.x/y
larger then just the xoffset/yoffset (in the canvas) we must multiply
the original xoffset/yoffset by device_scale before subtracting.
Signed-off-by: Hans de Goede <hdegoede@redhat.com>
For some themes we want to read the firmware-logo to use as background,
when the LCD panel of a laptop is mounted non-upright and/or if it is
using scaling because of HiDPI then the image which we get from the
firmware will be pre-rotated and scaled to match the LCD panel.
This new function will allow renderers to let themes know about this so
that they can adjust for the logo being pre-rotated and scaled.
Signed-off-by: Hans de Goede <hdegoede@redhat.com>