mirror of
https://github.com/Motorhead1991/qemu.git
synced 2025-08-03 15:53:54 -06:00
hw/display/bcm2835_fb: Fix handling of virtual framebuffer
The raspi framebuffir in bcm2835_fb supports the definition of a virtual "viewport", which is smaller than the full physical framebuffer size and at an adjustable offset within it. Only the viewport area is sent to the screen. This allows the guest to do things like double buffering, or scrolling by adjusting the viewport origin. Currently QEMU doesn't implement this at all. Add support for this feature: * the property mailbox code needs to distinguish the virtual width/height from the physical width/height * the framebuffer code needs to do something with the virtual width/height/origin information Note that the wiki documentation on the semantics of the virtual and physical height and width has it the wrong way around -- the virtual size is the size of the allocated buffer, and the physical size is the size of the display, so the virtual size is always the same as or larger than the physical. If the viewport size is set smaller than the physical screen size, we ignore the viewport settings completely and just display the physical screen area. Signed-off-by: Peter Maydell <peter.maydell@linaro.org> Reviewed-by: Richard Henderson <richard.henderson@linaro.org> Message-id: 20180814144436.679-7-peter.maydell@linaro.org
This commit is contained in:
parent
9a1f03f4ee
commit
01f18af98b
3 changed files with 41 additions and 14 deletions
|
@ -62,7 +62,8 @@ void bcm2835_fb_reconfigure(BCM2835FBState *s, BCM2835FBConfig *newconfig);
|
|||
*/
|
||||
static inline uint32_t bcm2835_fb_get_pitch(BCM2835FBConfig *config)
|
||||
{
|
||||
return config->xres * (config->bpp >> 3);
|
||||
uint32_t xres = MAX(config->xres, config->xres_virtual);
|
||||
return xres * (config->bpp >> 3);
|
||||
}
|
||||
|
||||
/**
|
||||
|
@ -71,7 +72,8 @@ static inline uint32_t bcm2835_fb_get_pitch(BCM2835FBConfig *config)
|
|||
*/
|
||||
static inline uint32_t bcm2835_fb_get_size(BCM2835FBConfig *config)
|
||||
{
|
||||
return config->yres * bcm2835_fb_get_pitch(config);
|
||||
uint32_t yres = MAX(config->yres, config->yres_virtual);
|
||||
return yres * bcm2835_fb_get_pitch(config);
|
||||
}
|
||||
|
||||
#endif
|
||||
|
|
Loading…
Add table
Add a link
Reference in a new issue