mirror of https://gitee.com/openkylin/qemu.git
hw/display/bcm2835_fb: Abstract out calculation of pitch, size
Abstract out the calculation of the pitch and size of the framebuffer into functions that operate on the BCM2835FBConfig struct -- these are about to get a little more complicated when we add support for virtual and physical sizes differing. Signed-off-by: Peter Maydell <peter.maydell@linaro.org> Reviewed-by: Richard Henderson <richard.henderson@linaro.org> Message-id: 20180814144436.679-6-peter.maydell@linaro.org
This commit is contained in:
parent
9e2938a0fd
commit
9a1f03f4ee
|
@ -139,7 +139,7 @@ static void fb_update_display(void *opaque)
|
|||
return;
|
||||
}
|
||||
|
||||
src_width = s->config.xres * (s->config.bpp >> 3);
|
||||
src_width = bcm2835_fb_get_pitch(&s->config);
|
||||
dest_width = s->config.xres;
|
||||
|
||||
switch (surface_bits_per_pixel(surface)) {
|
||||
|
@ -204,8 +204,8 @@ static void bcm2835_fb_mbox_push(BCM2835FBState *s, uint32_t value)
|
|||
|
||||
/* TODO - Manage properly virtual resolution */
|
||||
|
||||
pitch = s->config.xres * (s->config.bpp >> 3);
|
||||
size = s->config.yres * pitch;
|
||||
pitch = bcm2835_fb_get_pitch(&s->config);
|
||||
size = bcm2835_fb_get_size(&s->config);
|
||||
|
||||
stl_le_phys(&s->dma_as, value + 16, pitch);
|
||||
stl_le_phys(&s->dma_as, value + 32, s->config.base);
|
||||
|
|
|
@ -146,7 +146,7 @@ static void bcm2835_property_mbox_push(BCM2835PropertyState *s, uint32_t value)
|
|||
case 0x00040001: /* Allocate buffer */
|
||||
stl_le_phys(&s->dma_as, value + 12, fbconfig.base);
|
||||
stl_le_phys(&s->dma_as, value + 16,
|
||||
fbconfig.xres * fbconfig.yres * fbconfig.bpp / 8);
|
||||
bcm2835_fb_get_size(&fbconfig));
|
||||
resplen = 8;
|
||||
break;
|
||||
case 0x00048001: /* Release buffer */
|
||||
|
@ -210,7 +210,7 @@ static void bcm2835_property_mbox_push(BCM2835PropertyState *s, uint32_t value)
|
|||
break;
|
||||
case 0x00040008: /* Get pitch */
|
||||
stl_le_phys(&s->dma_as, value + 12,
|
||||
fbconfig.xres * fbconfig.bpp / 8);
|
||||
bcm2835_fb_get_pitch(&fbconfig));
|
||||
resplen = 4;
|
||||
break;
|
||||
case 0x00040009: /* Get virtual offset */
|
||||
|
|
|
@ -52,4 +52,26 @@ typedef struct {
|
|||
|
||||
void bcm2835_fb_reconfigure(BCM2835FBState *s, BCM2835FBConfig *newconfig);
|
||||
|
||||
/**
|
||||
* bcm2835_fb_get_pitch: return number of bytes per line of the framebuffer
|
||||
* @config: configuration info for the framebuffer
|
||||
*
|
||||
* Return the number of bytes per line of the framebuffer, ie the number
|
||||
* that must be added to a pixel address to get the address of the pixel
|
||||
* directly below it on screen.
|
||||
*/
|
||||
static inline uint32_t bcm2835_fb_get_pitch(BCM2835FBConfig *config)
|
||||
{
|
||||
return config->xres * (config->bpp >> 3);
|
||||
}
|
||||
|
||||
/**
|
||||
* bcm2835_fb_get_size: return total size of framebuffer in bytes
|
||||
* @config: configuration info for the framebuffer
|
||||
*/
|
||||
static inline uint32_t bcm2835_fb_get_size(BCM2835FBConfig *config)
|
||||
{
|
||||
return config->yres * bcm2835_fb_get_pitch(config);
|
||||
}
|
||||
|
||||
#endif
|
||||
|
|
Loading…
Reference in New Issue