diff mbox

[v2,10/14] sm501: Add support for panel layer

Message ID ae7dc986dd60d4a4baef3d4aef31e10b281e85a7.1488068248.git.balaton@eik.bme.hu
State New
Headers show

Commit Message

BALATON Zoltan Feb. 25, 2017, 7:25 p.m. UTC
Signed-off-by: BALATON Zoltan <balaton@eik.bme.hu>
---

v2: Split off renaming a variable to separate clean up patch

 hw/display/sm501.c | 63 +++++++++++++++++++++++++++---------------------------
 1 file changed, 32 insertions(+), 31 deletions(-)

Comments

Peter Maydell March 2, 2017, 7:44 p.m. UTC | #1
On 25 February 2017 at 19:25, BALATON Zoltan <balaton@eik.bme.hu> wrote:
> Signed-off-by: BALATON Zoltan <balaton@eik.bme.hu>
> ---
>
> v2: Split off renaming a variable to separate clean up patch
>
>  hw/display/sm501.c | 63 +++++++++++++++++++++++++++---------------------------
>  1 file changed, 32 insertions(+), 31 deletions(-)
>
> diff --git a/hw/display/sm501.c b/hw/display/sm501.c
> index 9c5ded3..caa7e5c 100644
> --- a/hw/display/sm501.c
> +++ b/hw/display/sm501.c
> @@ -2,6 +2,7 @@
>   * QEMU SM501 Device
>   *
>   * Copyright (c) 2008 Shin-ichiro KAWASAKI
> + * Copyright (c) 2016 BALATON Zoltan
>   *
>   * Permission is hereby granted, free of charge, to any person obtaining a copy
>   * of this software and associated documentation files (the "Software"), to deal
> @@ -41,8 +42,11 @@
>   *   - Minimum implementation for Linux console : mmio regs and CRT layer.
>   *   - 2D graphics acceleration partially supported : only fill rectangle.
>   *
> - * TODO:
> + * Status: 2016/12/04
> + *   - Misc fixes: endianness, hardware cursor
>   *   - Panel support
> + *
> + * TODO:
>   *   - Touch panel support
>   *   - USB support
>   *   - UART support
> @@ -1300,18 +1304,16 @@ static inline int get_depth_index(DisplaySurface *surface)
>      }
>  }
>
> -static void sm501_draw_crt(SM501State *s)
> +static void sm501_update_display(void *opaque)
>  {
> +    SM501State *s = (SM501State *)opaque;
>      DisplaySurface *surface = qemu_console_surface(s->con);
>      int y, c_x, c_y;
> -    uint8_t *hwc_src, *src = s->local_mem;
> -    int width = get_width(s, 1);
> -    int height = get_height(s, 1);
> -    int src_bpp = get_bpp(s, 1);
> +    int crt = (s->dc_crt_control & SM501_DC_CRT_CONTROL_SEL) ? 1 : 0;
> +    int width = get_width(s, crt);
> +    int height = get_height(s, crt);
> +    int src_bpp = get_bpp(s, crt);
>      int dst_bpp = surface_bytes_per_pixel(surface);
> -    uint32_t *palette = (uint32_t *)&s->dc_palette[SM501_DC_CRT_PALETTE -
> -                                                   SM501_DC_PANEL_PALETTE];
> -    uint8_t hwc_palette[3 * 3];
>      int dst_depth_index = get_depth_index(surface);
>      draw_line_func *draw_line = NULL;
>      draw_hwc_line_func *draw_hwc_line = NULL;
> @@ -1319,7 +1321,19 @@ static void sm501_draw_crt(SM501State *s)
>      int y_start = -1;
>      ram_addr_t page_min = ~0l;
>      ram_addr_t page_max = 0l;
> -    ram_addr_t offset = 0;
> +    ram_addr_t offset;
> +    uint32_t *palette;
> +    uint8_t hwc_palette[3 * 3];
> +    uint8_t *hwc_src;
> +
> +    if (!((crt ? s->dc_crt_control : s->dc_panel_control)
> +          & SM501_DC_CRT_CONTROL_ENABLE)) {
> +        return;
> +    }
> +
> +    palette = (uint32_t *)(crt ? &s->dc_palette[SM501_DC_CRT_PALETTE -
> +                                                SM501_DC_PANEL_PALETTE]
> +                               : &s->dc_palette[0]);
>
>      /* choose draw_line function */
>      switch (src_bpp) {
> @@ -1333,20 +1347,19 @@ static void sm501_draw_crt(SM501State *s)
>          draw_line = draw_line32_funcs[dst_depth_index];
>          break;
>      default:
> -        printf("sm501 draw crt : invalid DC_CRT_CONTROL=%x.\n",
> -               s->dc_crt_control);
> +        printf("sm501 update display : invalid control register value.\n");
>          abort();
>          break;
>      }
>
>      /* set up to draw hardware cursor */
> -    if (is_hwc_enabled(s, 1)) {
> +    if (is_hwc_enabled(s, crt)) {
>          /* choose cursor draw line function */
>          draw_hwc_line = draw_hwc_line_funcs[dst_depth_index];
> -        hwc_src = get_hwc_address(s, 1);
> -        c_x = get_hwc_x(s, 1);
> -        c_y = get_hwc_y(s, 1);
> -        get_hwc_palette(s, 1, hwc_palette);
> +        hwc_src = get_hwc_address(s, crt);
> +        c_x = get_hwc_x(s, crt);
> +        c_y = get_hwc_y(s, crt);
> +        get_hwc_palette(s, crt, hwc_palette);
>      }
>
>      /* adjust console size */
> @@ -1360,7 +1373,7 @@ static void sm501_draw_crt(SM501State *s)
>
>      /* draw each line according to conditions */
>      memory_region_sync_dirty_bitmap(&s->local_mem_region);
> -    for (y = 0; y < height; y++) {
> +    for (y = 0, offset = 0; y < height; y++, offset += width * src_bpp) {
>          int update, update_hwc;
>          ram_addr_t page0 = offset;
>          ram_addr_t page1 = offset + width * src_bpp - 1;
> @@ -1378,7 +1391,7 @@ static void sm501_draw_crt(SM501State *s)
>              d +=  y * width * dst_bpp;
>
>              /* draw graphics layer */
> -            draw_line(d, src, width, palette);
> +            draw_line(d, s->local_mem + offset, width, palette);
>
>              /* draw hardware cursor */
>              if (update_hwc) {
> @@ -1401,9 +1414,6 @@ static void sm501_draw_crt(SM501State *s)
>                  y_start = -1;
>              }
>          }
> -
> -        src += width * src_bpp;
> -        offset += width * src_bpp;
>      }

This is another refactoring that's unrelated to adding panel
layer support, right? (It's just changing from having src and
offset updated at the end of the loop to dropping src and having offset
be updated in the for()).

>      /* complete flush to display */
> @@ -1419,15 +1429,6 @@ static void sm501_draw_crt(SM501State *s)
>      }
>  }
>
> -static void sm501_update_display(void *opaque)
> -{
> -    SM501State *s = (SM501State *)opaque;
> -
> -    if (s->dc_crt_control & SM501_DC_CRT_CONTROL_ENABLE) {
> -        sm501_draw_crt(s);
> -    }
> -}
> -
>  static const GraphicHwOps sm501_ops = {
>      .gfx_update  = sm501_update_display,
>  };
> --
> 2.7.4
>
>

Reviewed-by: Peter Maydell <peter.maydell@linaro.org>

thanks
-- PMM
BALATON Zoltan March 2, 2017, 8:15 p.m. UTC | #2
On Thu, 2 Mar 2017, Peter Maydell wrote:
> On 25 February 2017 at 19:25, BALATON Zoltan <balaton@eik.bme.hu> wrote:
>> Signed-off-by: BALATON Zoltan <balaton@eik.bme.hu>
>> ---
>>
>> v2: Split off renaming a variable to separate clean up patch
>>
>>  hw/display/sm501.c | 63 +++++++++++++++++++++++++++---------------------------
>>  1 file changed, 32 insertions(+), 31 deletions(-)
>>
>> diff --git a/hw/display/sm501.c b/hw/display/sm501.c
>> index 9c5ded3..caa7e5c 100644
>> --- a/hw/display/sm501.c
>> +++ b/hw/display/sm501.c
>> @@ -2,6 +2,7 @@
>>   * QEMU SM501 Device
>>   *
>>   * Copyright (c) 2008 Shin-ichiro KAWASAKI
>> + * Copyright (c) 2016 BALATON Zoltan
>>   *
>>   * Permission is hereby granted, free of charge, to any person obtaining a copy
>>   * of this software and associated documentation files (the "Software"), to deal
>> @@ -41,8 +42,11 @@
>>   *   - Minimum implementation for Linux console : mmio regs and CRT layer.
>>   *   - 2D graphics acceleration partially supported : only fill rectangle.
>>   *
>> - * TODO:
>> + * Status: 2016/12/04
>> + *   - Misc fixes: endianness, hardware cursor
>>   *   - Panel support
>> + *
>> + * TODO:
>>   *   - Touch panel support
>>   *   - USB support
>>   *   - UART support
>> @@ -1300,18 +1304,16 @@ static inline int get_depth_index(DisplaySurface *surface)
>>      }
>>  }
>>
>> -static void sm501_draw_crt(SM501State *s)
>> +static void sm501_update_display(void *opaque)
>>  {
>> +    SM501State *s = (SM501State *)opaque;
>>      DisplaySurface *surface = qemu_console_surface(s->con);
>>      int y, c_x, c_y;
>> -    uint8_t *hwc_src, *src = s->local_mem;
>> -    int width = get_width(s, 1);
>> -    int height = get_height(s, 1);
>> -    int src_bpp = get_bpp(s, 1);
>> +    int crt = (s->dc_crt_control & SM501_DC_CRT_CONTROL_SEL) ? 1 : 0;
>> +    int width = get_width(s, crt);
>> +    int height = get_height(s, crt);
>> +    int src_bpp = get_bpp(s, crt);
>>      int dst_bpp = surface_bytes_per_pixel(surface);
>> -    uint32_t *palette = (uint32_t *)&s->dc_palette[SM501_DC_CRT_PALETTE -
>> -                                                   SM501_DC_PANEL_PALETTE];
>> -    uint8_t hwc_palette[3 * 3];
>>      int dst_depth_index = get_depth_index(surface);
>>      draw_line_func *draw_line = NULL;
>>      draw_hwc_line_func *draw_hwc_line = NULL;
>> @@ -1319,7 +1321,19 @@ static void sm501_draw_crt(SM501State *s)
>>      int y_start = -1;
>>      ram_addr_t page_min = ~0l;
>>      ram_addr_t page_max = 0l;
>> -    ram_addr_t offset = 0;
>> +    ram_addr_t offset;
>> +    uint32_t *palette;
>> +    uint8_t hwc_palette[3 * 3];
>> +    uint8_t *hwc_src;
>> +
>> +    if (!((crt ? s->dc_crt_control : s->dc_panel_control)
>> +          & SM501_DC_CRT_CONTROL_ENABLE)) {
>> +        return;
>> +    }
>> +
>> +    palette = (uint32_t *)(crt ? &s->dc_palette[SM501_DC_CRT_PALETTE -
>> +                                                SM501_DC_PANEL_PALETTE]
>> +                               : &s->dc_palette[0]);
>>
>>      /* choose draw_line function */
>>      switch (src_bpp) {
>> @@ -1333,20 +1347,19 @@ static void sm501_draw_crt(SM501State *s)
>>          draw_line = draw_line32_funcs[dst_depth_index];
>>          break;
>>      default:
>> -        printf("sm501 draw crt : invalid DC_CRT_CONTROL=%x.\n",
>> -               s->dc_crt_control);
>> +        printf("sm501 update display : invalid control register value.\n");
>>          abort();
>>          break;
>>      }
>>
>>      /* set up to draw hardware cursor */
>> -    if (is_hwc_enabled(s, 1)) {
>> +    if (is_hwc_enabled(s, crt)) {
>>          /* choose cursor draw line function */
>>          draw_hwc_line = draw_hwc_line_funcs[dst_depth_index];
>> -        hwc_src = get_hwc_address(s, 1);
>> -        c_x = get_hwc_x(s, 1);
>> -        c_y = get_hwc_y(s, 1);
>> -        get_hwc_palette(s, 1, hwc_palette);
>> +        hwc_src = get_hwc_address(s, crt);
>> +        c_x = get_hwc_x(s, crt);
>> +        c_y = get_hwc_y(s, crt);
>> +        get_hwc_palette(s, crt, hwc_palette);
>>      }
>>
>>      /* adjust console size */
>> @@ -1360,7 +1373,7 @@ static void sm501_draw_crt(SM501State *s)
>>
>>      /* draw each line according to conditions */
>>      memory_region_sync_dirty_bitmap(&s->local_mem_region);
>> -    for (y = 0; y < height; y++) {
>> +    for (y = 0, offset = 0; y < height; y++, offset += width * src_bpp) {
>>          int update, update_hwc;
>>          ram_addr_t page0 = offset;
>>          ram_addr_t page1 = offset + width * src_bpp - 1;
>> @@ -1378,7 +1391,7 @@ static void sm501_draw_crt(SM501State *s)
>>              d +=  y * width * dst_bpp;
>>
>>              /* draw graphics layer */
>> -            draw_line(d, src, width, palette);
>> +            draw_line(d, s->local_mem + offset, width, palette);
>>
>>              /* draw hardware cursor */
>>              if (update_hwc) {
>> @@ -1401,9 +1414,6 @@ static void sm501_draw_crt(SM501State *s)
>>                  y_start = -1;
>>              }
>>          }
>> -
>> -        src += width * src_bpp;
>> -        offset += width * src_bpp;
>>      }
>
> This is another refactoring that's unrelated to adding panel
> layer support, right? (It's just changing from having src and
> offset updated at the end of the loop to dropping src and having offset
> be updated in the for()).

It's a clean up getting rid of the unneded src pointer. Should I move it 
to the cleanup patch or is it OK to leave it here?

>>      /* complete flush to display */
>> @@ -1419,15 +1429,6 @@ static void sm501_draw_crt(SM501State *s)
>>      }
>>  }
>>
>> -static void sm501_update_display(void *opaque)
>> -{
>> -    SM501State *s = (SM501State *)opaque;
>> -
>> -    if (s->dc_crt_control & SM501_DC_CRT_CONTROL_ENABLE) {
>> -        sm501_draw_crt(s);
>> -    }
>> -}
>> -
>>  static const GraphicHwOps sm501_ops = {
>>      .gfx_update  = sm501_update_display,
>>  };
>> --
>> 2.7.4
>>
>>
>
> Reviewed-by: Peter Maydell <peter.maydell@linaro.org>
>
> thanks
> -- PMM
>
>
Peter Maydell March 2, 2017, 8:46 p.m. UTC | #3
On 2 March 2017 at 20:15, BALATON Zoltan <balaton@eik.bme.hu> wrote:
> On Thu, 2 Mar 2017, Peter Maydell wrote:
>>
>> This is another refactoring that's unrelated to adding panel
>> layer support, right? (It's just changing from having src and
>> offset updated at the end of the loop to dropping src and having offset
>> be updated in the for()).
>
>
> It's a clean up getting rid of the unneded src pointer. Should I move it to
> the cleanup patch or is it OK to leave it here?

I've reviewed it now, so you can leave it. It would have
been better in its own patch, though. (The general principle
is that each patch should do only one thing, and it should do
all of that one thing, and the one thing should be fairly
small and easy to understand.)

thanks
-- PMM
diff mbox

Patch

diff --git a/hw/display/sm501.c b/hw/display/sm501.c
index 9c5ded3..caa7e5c 100644
--- a/hw/display/sm501.c
+++ b/hw/display/sm501.c
@@ -2,6 +2,7 @@ 
  * QEMU SM501 Device
  *
  * Copyright (c) 2008 Shin-ichiro KAWASAKI
+ * Copyright (c) 2016 BALATON Zoltan
  *
  * Permission is hereby granted, free of charge, to any person obtaining a copy
  * of this software and associated documentation files (the "Software"), to deal
@@ -41,8 +42,11 @@ 
  *   - Minimum implementation for Linux console : mmio regs and CRT layer.
  *   - 2D graphics acceleration partially supported : only fill rectangle.
  *
- * TODO:
+ * Status: 2016/12/04
+ *   - Misc fixes: endianness, hardware cursor
  *   - Panel support
+ *
+ * TODO:
  *   - Touch panel support
  *   - USB support
  *   - UART support
@@ -1300,18 +1304,16 @@  static inline int get_depth_index(DisplaySurface *surface)
     }
 }
 
-static void sm501_draw_crt(SM501State *s)
+static void sm501_update_display(void *opaque)
 {
+    SM501State *s = (SM501State *)opaque;
     DisplaySurface *surface = qemu_console_surface(s->con);
     int y, c_x, c_y;
-    uint8_t *hwc_src, *src = s->local_mem;
-    int width = get_width(s, 1);
-    int height = get_height(s, 1);
-    int src_bpp = get_bpp(s, 1);
+    int crt = (s->dc_crt_control & SM501_DC_CRT_CONTROL_SEL) ? 1 : 0;
+    int width = get_width(s, crt);
+    int height = get_height(s, crt);
+    int src_bpp = get_bpp(s, crt);
     int dst_bpp = surface_bytes_per_pixel(surface);
-    uint32_t *palette = (uint32_t *)&s->dc_palette[SM501_DC_CRT_PALETTE -
-                                                   SM501_DC_PANEL_PALETTE];
-    uint8_t hwc_palette[3 * 3];
     int dst_depth_index = get_depth_index(surface);
     draw_line_func *draw_line = NULL;
     draw_hwc_line_func *draw_hwc_line = NULL;
@@ -1319,7 +1321,19 @@  static void sm501_draw_crt(SM501State *s)
     int y_start = -1;
     ram_addr_t page_min = ~0l;
     ram_addr_t page_max = 0l;
-    ram_addr_t offset = 0;
+    ram_addr_t offset;
+    uint32_t *palette;
+    uint8_t hwc_palette[3 * 3];
+    uint8_t *hwc_src;
+
+    if (!((crt ? s->dc_crt_control : s->dc_panel_control)
+          & SM501_DC_CRT_CONTROL_ENABLE)) {
+        return;
+    }
+
+    palette = (uint32_t *)(crt ? &s->dc_palette[SM501_DC_CRT_PALETTE -
+                                                SM501_DC_PANEL_PALETTE]
+                               : &s->dc_palette[0]);
 
     /* choose draw_line function */
     switch (src_bpp) {
@@ -1333,20 +1347,19 @@  static void sm501_draw_crt(SM501State *s)
         draw_line = draw_line32_funcs[dst_depth_index];
         break;
     default:
-        printf("sm501 draw crt : invalid DC_CRT_CONTROL=%x.\n",
-               s->dc_crt_control);
+        printf("sm501 update display : invalid control register value.\n");
         abort();
         break;
     }
 
     /* set up to draw hardware cursor */
-    if (is_hwc_enabled(s, 1)) {
+    if (is_hwc_enabled(s, crt)) {
         /* choose cursor draw line function */
         draw_hwc_line = draw_hwc_line_funcs[dst_depth_index];
-        hwc_src = get_hwc_address(s, 1);
-        c_x = get_hwc_x(s, 1);
-        c_y = get_hwc_y(s, 1);
-        get_hwc_palette(s, 1, hwc_palette);
+        hwc_src = get_hwc_address(s, crt);
+        c_x = get_hwc_x(s, crt);
+        c_y = get_hwc_y(s, crt);
+        get_hwc_palette(s, crt, hwc_palette);
     }
 
     /* adjust console size */
@@ -1360,7 +1373,7 @@  static void sm501_draw_crt(SM501State *s)
 
     /* draw each line according to conditions */
     memory_region_sync_dirty_bitmap(&s->local_mem_region);
-    for (y = 0; y < height; y++) {
+    for (y = 0, offset = 0; y < height; y++, offset += width * src_bpp) {
         int update, update_hwc;
         ram_addr_t page0 = offset;
         ram_addr_t page1 = offset + width * src_bpp - 1;
@@ -1378,7 +1391,7 @@  static void sm501_draw_crt(SM501State *s)
             d +=  y * width * dst_bpp;
 
             /* draw graphics layer */
-            draw_line(d, src, width, palette);
+            draw_line(d, s->local_mem + offset, width, palette);
 
             /* draw hardware cursor */
             if (update_hwc) {
@@ -1401,9 +1414,6 @@  static void sm501_draw_crt(SM501State *s)
                 y_start = -1;
             }
         }
-
-        src += width * src_bpp;
-        offset += width * src_bpp;
     }
 
     /* complete flush to display */
@@ -1419,15 +1429,6 @@  static void sm501_draw_crt(SM501State *s)
     }
 }
 
-static void sm501_update_display(void *opaque)
-{
-    SM501State *s = (SM501State *)opaque;
-
-    if (s->dc_crt_control & SM501_DC_CRT_CONTROL_ENABLE) {
-        sm501_draw_crt(s);
-    }
-}
-
 static const GraphicHwOps sm501_ops = {
     .gfx_update  = sm501_update_display,
 };