g364fb: make display updates thread safe
Signed-off-by: Gerd Hoffmann <kraxel@redhat.com> Message-id: 20170421091632.30900-8-kraxel@redhat.com Signed-off-by: Gerd Hoffmann <kraxel@redhat.com>
This commit is contained in:
		
							parent
							
								
									553bcce5ac
								
							
						
					
					
						commit
						7fcf0c24e7
					
				| 
						 | 
				
			
			@ -64,17 +64,8 @@ typedef struct G364State {
 | 
			
		|||
 | 
			
		||||
static inline int check_dirty(G364State *s, ram_addr_t page)
 | 
			
		||||
{
 | 
			
		||||
    return memory_region_get_dirty(&s->mem_vram, page, G364_PAGE_SIZE,
 | 
			
		||||
                                   DIRTY_MEMORY_VGA);
 | 
			
		||||
}
 | 
			
		||||
 | 
			
		||||
static inline void reset_dirty(G364State *s,
 | 
			
		||||
                               ram_addr_t page_min, ram_addr_t page_max)
 | 
			
		||||
{
 | 
			
		||||
    memory_region_reset_dirty(&s->mem_vram,
 | 
			
		||||
                              page_min,
 | 
			
		||||
                              page_max + G364_PAGE_SIZE - page_min - 1,
 | 
			
		||||
                              DIRTY_MEMORY_VGA);
 | 
			
		||||
    return memory_region_test_and_clear_dirty(&s->mem_vram, page, G364_PAGE_SIZE,
 | 
			
		||||
                                              DIRTY_MEMORY_VGA);
 | 
			
		||||
}
 | 
			
		||||
 | 
			
		||||
static void g364fb_draw_graphic8(G364State *s)
 | 
			
		||||
| 
						 | 
				
			
			@ -83,7 +74,7 @@ static void g364fb_draw_graphic8(G364State *s)
 | 
			
		|||
    int i, w;
 | 
			
		||||
    uint8_t *vram;
 | 
			
		||||
    uint8_t *data_display, *dd;
 | 
			
		||||
    ram_addr_t page, page_min, page_max;
 | 
			
		||||
    ram_addr_t page;
 | 
			
		||||
    int x, y;
 | 
			
		||||
    int xmin, xmax;
 | 
			
		||||
    int ymin, ymax;
 | 
			
		||||
| 
						 | 
				
			
			@ -114,8 +105,6 @@ static void g364fb_draw_graphic8(G364State *s)
 | 
			
		|||
    }
 | 
			
		||||
 | 
			
		||||
    page = 0;
 | 
			
		||||
    page_min = (ram_addr_t)-1;
 | 
			
		||||
    page_max = 0;
 | 
			
		||||
 | 
			
		||||
    x = y = 0;
 | 
			
		||||
    xmin = s->width;
 | 
			
		||||
| 
						 | 
				
			
			@ -137,9 +126,6 @@ static void g364fb_draw_graphic8(G364State *s)
 | 
			
		|||
        if (check_dirty(s, page)) {
 | 
			
		||||
            if (y < ymin)
 | 
			
		||||
                ymin = ymax = y;
 | 
			
		||||
            if (page_min == (ram_addr_t)-1)
 | 
			
		||||
                page_min = page;
 | 
			
		||||
            page_max = page;
 | 
			
		||||
            if (x < xmin)
 | 
			
		||||
                xmin = x;
 | 
			
		||||
            for (i = 0; i < G364_PAGE_SIZE; i++) {
 | 
			
		||||
| 
						 | 
				
			
			@ -196,10 +182,7 @@ static void g364fb_draw_graphic8(G364State *s)
 | 
			
		|||
                ymax = y;
 | 
			
		||||
        } else {
 | 
			
		||||
            int dy;
 | 
			
		||||
            if (page_min != (ram_addr_t)-1) {
 | 
			
		||||
                reset_dirty(s, page_min, page_max);
 | 
			
		||||
                page_min = (ram_addr_t)-1;
 | 
			
		||||
                page_max = 0;
 | 
			
		||||
            if (xmax || ymax) {
 | 
			
		||||
                dpy_gfx_update(s->con, xmin, ymin,
 | 
			
		||||
                               xmax - xmin + 1, ymax - ymin + 1);
 | 
			
		||||
                xmin = s->width;
 | 
			
		||||
| 
						 | 
				
			
			@ -219,9 +202,8 @@ static void g364fb_draw_graphic8(G364State *s)
 | 
			
		|||
    }
 | 
			
		||||
 | 
			
		||||
done:
 | 
			
		||||
    if (page_min != (ram_addr_t)-1) {
 | 
			
		||||
    if (xmax || ymax) {
 | 
			
		||||
        dpy_gfx_update(s->con, xmin, ymin, xmax - xmin + 1, ymax - ymin + 1);
 | 
			
		||||
        reset_dirty(s, page_min, page_max);
 | 
			
		||||
    }
 | 
			
		||||
}
 | 
			
		||||
 | 
			
		||||
| 
						 | 
				
			
			
 | 
			
		|||
		Loading…
	
		Reference in New Issue