|
@@ -1558,89 +1558,9 @@ typedef void draw_hwc_line_func(uint8_t *d, const uint8_t *s,
|
|
|
int width, const uint8_t *palette,
|
|
|
int c_x, int c_y);
|
|
|
|
|
|
-#define DEPTH 8
|
|
|
-#include "sm501_template.h"
|
|
|
-
|
|
|
-#define DEPTH 15
|
|
|
-#include "sm501_template.h"
|
|
|
-
|
|
|
-#define BGR_FORMAT
|
|
|
-#define DEPTH 15
|
|
|
-#include "sm501_template.h"
|
|
|
-
|
|
|
-#define DEPTH 16
|
|
|
-#include "sm501_template.h"
|
|
|
-
|
|
|
-#define BGR_FORMAT
|
|
|
-#define DEPTH 16
|
|
|
-#include "sm501_template.h"
|
|
|
-
|
|
|
#define DEPTH 32
|
|
|
#include "sm501_template.h"
|
|
|
|
|
|
-#define BGR_FORMAT
|
|
|
-#define DEPTH 32
|
|
|
-#include "sm501_template.h"
|
|
|
-
|
|
|
-static draw_line_func *draw_line8_funcs[] = {
|
|
|
- draw_line8_8,
|
|
|
- draw_line8_15,
|
|
|
- draw_line8_16,
|
|
|
- draw_line8_32,
|
|
|
- draw_line8_32bgr,
|
|
|
- draw_line8_15bgr,
|
|
|
- draw_line8_16bgr,
|
|
|
-};
|
|
|
-
|
|
|
-static draw_line_func *draw_line16_funcs[] = {
|
|
|
- draw_line16_8,
|
|
|
- draw_line16_15,
|
|
|
- draw_line16_16,
|
|
|
- draw_line16_32,
|
|
|
- draw_line16_32bgr,
|
|
|
- draw_line16_15bgr,
|
|
|
- draw_line16_16bgr,
|
|
|
-};
|
|
|
-
|
|
|
-static draw_line_func *draw_line32_funcs[] = {
|
|
|
- draw_line32_8,
|
|
|
- draw_line32_15,
|
|
|
- draw_line32_16,
|
|
|
- draw_line32_32,
|
|
|
- draw_line32_32bgr,
|
|
|
- draw_line32_15bgr,
|
|
|
- draw_line32_16bgr,
|
|
|
-};
|
|
|
-
|
|
|
-static draw_hwc_line_func *draw_hwc_line_funcs[] = {
|
|
|
- draw_hwc_line_8,
|
|
|
- draw_hwc_line_15,
|
|
|
- draw_hwc_line_16,
|
|
|
- draw_hwc_line_32,
|
|
|
- draw_hwc_line_32bgr,
|
|
|
- draw_hwc_line_15bgr,
|
|
|
- draw_hwc_line_16bgr,
|
|
|
-};
|
|
|
-
|
|
|
-static inline int get_depth_index(DisplaySurface *surface)
|
|
|
-{
|
|
|
- switch (surface_bits_per_pixel(surface)) {
|
|
|
- default:
|
|
|
- case 8:
|
|
|
- return 0;
|
|
|
- case 15:
|
|
|
- return 1;
|
|
|
- case 16:
|
|
|
- return 2;
|
|
|
- case 32:
|
|
|
- if (is_surface_bgr(surface)) {
|
|
|
- return 4;
|
|
|
- } else {
|
|
|
- return 3;
|
|
|
- }
|
|
|
- }
|
|
|
-}
|
|
|
-
|
|
|
static void sm501_update_display(void *opaque)
|
|
|
{
|
|
|
SM501State *s = (SM501State *)opaque;
|
|
@@ -1652,7 +1572,6 @@ static void sm501_update_display(void *opaque)
|
|
|
int height = get_height(s, crt);
|
|
|
int src_bpp = get_bpp(s, crt);
|
|
|
int dst_bpp = surface_bytes_per_pixel(surface);
|
|
|
- int dst_depth_index = get_depth_index(surface);
|
|
|
draw_line_func *draw_line = NULL;
|
|
|
draw_hwc_line_func *draw_hwc_line = NULL;
|
|
|
int full_update = 0;
|
|
@@ -1662,6 +1581,8 @@ static void sm501_update_display(void *opaque)
|
|
|
uint8_t hwc_palette[3 * 3];
|
|
|
uint8_t *hwc_src = NULL;
|
|
|
|
|
|
+ assert(dst_bpp == 4); /* Output is always 32-bit RGB */
|
|
|
+
|
|
|
if (!((crt ? s->dc_crt_control : s->dc_panel_control)
|
|
|
& SM501_DC_CRT_CONTROL_ENABLE)) {
|
|
|
return;
|
|
@@ -1674,13 +1595,13 @@ static void sm501_update_display(void *opaque)
|
|
|
/* choose draw_line function */
|
|
|
switch (src_bpp) {
|
|
|
case 1:
|
|
|
- draw_line = draw_line8_funcs[dst_depth_index];
|
|
|
+ draw_line = draw_line8_32;
|
|
|
break;
|
|
|
case 2:
|
|
|
- draw_line = draw_line16_funcs[dst_depth_index];
|
|
|
+ draw_line = draw_line16_32;
|
|
|
break;
|
|
|
case 4:
|
|
|
- draw_line = draw_line32_funcs[dst_depth_index];
|
|
|
+ draw_line = draw_line32_32;
|
|
|
break;
|
|
|
default:
|
|
|
qemu_log_mask(LOG_GUEST_ERROR, "sm501: update display"
|
|
@@ -1691,7 +1612,7 @@ static void sm501_update_display(void *opaque)
|
|
|
/* set up to draw hardware cursor */
|
|
|
if (is_hwc_enabled(s, crt)) {
|
|
|
/* choose cursor draw line function */
|
|
|
- draw_hwc_line = draw_hwc_line_funcs[dst_depth_index];
|
|
|
+ draw_hwc_line = draw_hwc_line_32;
|
|
|
hwc_src = get_hwc_address(s, crt);
|
|
|
c_x = get_hwc_x(s, crt);
|
|
|
c_y = get_hwc_y(s, crt);
|