Fixed bug in SDL1 where bcm_deinit() and SDL_Quit() would be called twice, cleaned up and modernized code in amiberry_gfx

This commit is contained in:
Dimitris Panokostas 2017-12-20 22:51:30 +01:00
parent 148e6498b1
commit 293eb43b8d
2 changed files with 106 additions and 109 deletions

View file

@ -27,9 +27,9 @@
#define DISPLAY_SIGNAL_OPEN 3 #define DISPLAY_SIGNAL_OPEN 3
#define DISPLAY_SIGNAL_SHOW 4 #define DISPLAY_SIGNAL_SHOW 4
#define DISPLAY_SIGNAL_QUIT 5 #define DISPLAY_SIGNAL_QUIT 5
static uae_thread_id display_tid = 0; static uae_thread_id display_tid = nullptr;
static smp_comm_pipe *volatile display_pipe = 0; static smp_comm_pipe *volatile display_pipe = nullptr;
static uae_sem_t display_sem = 0; static uae_sem_t display_sem = nullptr;
static bool volatile display_thread_busy = false; static bool volatile display_thread_busy = false;
#endif #endif
@ -40,7 +40,7 @@ static bool volatile display_thread_busy = false;
static int display_width; static int display_width;
static int display_height; static int display_height;
/* SDL variable for output of emulation */ /* SDL Surface for output of emulation */
SDL_Surface* screen = nullptr; SDL_Surface* screen = nullptr;
#ifdef USE_SDL1 #ifdef USE_SDL1
@ -106,10 +106,10 @@ static void *display_thread(void *unused)
for (;;) { for (;;) {
display_thread_busy = false; display_thread_busy = false;
uae_u32 signal = read_comm_pipe_u32_blocking(display_pipe); auto signal = read_comm_pipe_u32_blocking(display_pipe);
display_thread_busy = true; display_thread_busy = true;
int width, height; int width, height;
SDL_Surface *Dummy_prSDLScreen; SDL_Surface *dummy_screen;
switch (signal) { switch (signal) {
case DISPLAY_SIGNAL_SETUP: case DISPLAY_SIGNAL_SETUP:
bcm_host_init(); bcm_host_init();
@ -146,10 +146,10 @@ static void *display_thread(void *unused)
width = display_width; width = display_width;
height = display_height; height = display_height;
Dummy_prSDLScreen = SDL_SetVideoMode(width, height, 16, SDL_SWSURFACE | SDL_FULLSCREEN); dummy_screen = SDL_SetVideoMode(width, height, 16, SDL_SWSURFACE | SDL_FULLSCREEN);
screen = SDL_CreateRGBSurface(SDL_HWSURFACE, width, height, 16, screen = SDL_CreateRGBSurface(SDL_HWSURFACE, width, height, 16,
Dummy_prSDLScreen->format->Rmask, Dummy_prSDLScreen->format->Gmask, Dummy_prSDLScreen->format->Bmask, Dummy_prSDLScreen->format->Amask); dummy_screen->format->Rmask, dummy_screen->format->Gmask, dummy_screen->format->Bmask, dummy_screen->format->Amask);
SDL_FreeSurface(Dummy_prSDLScreen); SDL_FreeSurface(dummy_screen);
vc_dispmanx_display_get_info(dispmanxdisplay, &dispmanxdinfo); vc_dispmanx_display_get_info(dispmanxdisplay, &dispmanxdinfo);
@ -164,16 +164,16 @@ static void *display_thread(void *unused)
if (currprefs.gfx_correct_aspect == 0) if (currprefs.gfx_correct_aspect == 0)
{ {
// Fullscreen. // Fullscreen.
int scaled_width = dispmanxdinfo.width * currprefs.gfx_fullscreen_ratio / 100; auto scaled_width = dispmanxdinfo.width * currprefs.gfx_fullscreen_ratio / 100;
int scaled_height = dispmanxdinfo.height * currprefs.gfx_fullscreen_ratio / 100; auto scaled_height = dispmanxdinfo.height * currprefs.gfx_fullscreen_ratio / 100;
vc_dispmanx_rect_set(&dst_rect, (dispmanxdinfo.width - scaled_width) / 2, (dispmanxdinfo.height - scaled_height) / 2, vc_dispmanx_rect_set(&dst_rect, (dispmanxdinfo.width - scaled_width) / 2, (dispmanxdinfo.height - scaled_height) / 2,
scaled_width, scaled_height); scaled_width, scaled_height);
} }
else else
{ {
// 4/3 shrink. // 4/3 shrink.
int scaled_width = dispmanxdinfo.width * currprefs.gfx_fullscreen_ratio / 100; auto scaled_width = dispmanxdinfo.width * currprefs.gfx_fullscreen_ratio / 100;
int scaled_height = dispmanxdinfo.height * currprefs.gfx_fullscreen_ratio / 100; auto scaled_height = dispmanxdinfo.height * currprefs.gfx_fullscreen_ratio / 100;
vc_dispmanx_rect_set(&dst_rect, (dispmanxdinfo.width - scaled_width / 16 * 12) / 2, (dispmanxdinfo.height - scaled_height) / 2, vc_dispmanx_rect_set(&dst_rect, (dispmanxdinfo.width - scaled_width / 16 * 12) / 2, (dispmanxdinfo.height - scaled_height) / 2,
scaled_width / 16 * 12, scaled_height); scaled_width / 16 * 12, scaled_height);
} }
@ -222,9 +222,10 @@ static void *display_thread(void *unused)
vc_dispmanx_vsync_callback(dispmanxdisplay, NULL, NULL); vc_dispmanx_vsync_callback(dispmanxdisplay, NULL, NULL);
vc_dispmanx_display_close(dispmanxdisplay); vc_dispmanx_display_close(dispmanxdisplay);
bcm_host_deinit(); bcm_host_deinit();
SDL_VideoQuit(); display_tid = nullptr;
display_tid = 0; return nullptr;
return 0; default:
break;
} }
} }
} }
@ -233,7 +234,7 @@ static void *display_thread(void *unused)
int graphics_setup(void) int graphics_setup(void)
{ {
#ifdef PICASSO96 #ifdef PICASSO96
picasso_InitResolutions(); picasso_init_resolutions();
InitPicasso96(); InitPicasso96();
#endif #endif
#ifdef USE_SDL1 #ifdef USE_SDL1
@ -250,7 +251,7 @@ int graphics_setup(void)
HDMI_PROPERTY_PARAM_T property; HDMI_PROPERTY_PARAM_T property;
property.property = HDMI_PROPERTY_PIXEL_CLOCK_TYPE; property.property = HDMI_PROPERTY_PIXEL_CLOCK_TYPE;
vc_tv_hdmi_get_property(&property); vc_tv_hdmi_get_property(&property);
float frame_rate = property.param1 == HDMI_PIXEL_CLOCK_TYPE_NTSC ? tvstate.display.hdmi.frame_rate * (1000.0f / 1001.0f) : tvstate.display.hdmi.frame_rate; const float frame_rate = property.param1 == HDMI_PIXEL_CLOCK_TYPE_NTSC ? tvstate.display.hdmi.frame_rate * (1000.0f / 1001.0f) : tvstate.display.hdmi.frame_rate;
host_hz = int(frame_rate); host_hz = int(frame_rate);
} }
vc_vchi_tv_stop(); vc_vchi_tv_stop();
@ -294,7 +295,7 @@ void InitAmigaVidMode(struct uae_prefs* p)
void graphics_subshutdown() void graphics_subshutdown()
{ {
#ifdef USE_SDL1 #ifdef USE_SDL1
if(display_tid != 0) { if(display_tid != nullptr) {
wait_for_display_thread(); wait_for_display_thread();
write_comm_pipe_u32(display_pipe, DISPLAY_SIGNAL_SUBSHUTDOWN, 1); write_comm_pipe_u32(display_pipe, DISPLAY_SIGNAL_SUBSHUTDOWN, 1);
uae_sem_wait (&display_sem); uae_sem_wait (&display_sem);
@ -365,7 +366,7 @@ void updatedisplayarea()
static void open_screen(struct uae_prefs* p) static void open_screen(struct uae_prefs* p)
{ {
int depth = 16; const auto depth = 16;
if (max_uae_width == 0 || max_uae_height == 0) if (max_uae_width == 0 || max_uae_height == 0)
{ {
max_uae_width = 1920; max_uae_width = 1920;
@ -443,7 +444,7 @@ void update_display(struct uae_prefs* p)
int check_prefs_changed_gfx() int check_prefs_changed_gfx()
{ {
int changed = 0; auto changed = 0;
if (currprefs.gfx_size.height != changed_prefs.gfx_size.height || if (currprefs.gfx_size.height != changed_prefs.gfx_size.height ||
currprefs.gfx_size.width != changed_prefs.gfx_size.width || currprefs.gfx_size.width != changed_prefs.gfx_size.width ||
@ -507,13 +508,13 @@ void unlockscr()
void wait_for_vsync(void) void wait_for_vsync(void)
{ {
#ifdef USE_SDL1 #ifdef USE_SDL1
unsigned long start = read_processor_time(); const auto start = read_processor_time();
int wait_till = current_vsync_frame; const auto wait_till = current_vsync_frame;
do do
{ {
usleep(10); usleep(10);
current_vsync_frame = vsync_counter; current_vsync_frame = vsync_counter;
} while (wait_till >= current_vsync_frame && read_processor_time() - start < 20000); } while (wait_till >= current_vsync_frame && read_processor_time() - start < 20000);
#endif #endif
} }
@ -537,9 +538,9 @@ bool render_screen(bool immediate)
void show_screen(int mode) void show_screen(int mode)
{ {
unsigned long start = read_processor_time(); const auto start = read_processor_time();
#ifdef USE_SDL1 #ifdef USE_SDL1
int wait_till = current_vsync_frame; const auto wait_till = current_vsync_frame;
if (vsync_modulo == 1) if (vsync_modulo == 1)
{ {
// Amiga framerate is equal to host framerate // Amiga framerate is equal to host framerate
@ -558,7 +559,7 @@ void show_screen(int mode)
else else
{ {
// Amiga framerate differs from host framerate // Amiga framerate differs from host framerate
unsigned long wait_till_time = (next_synctime != 0) ? next_synctime : last_synctime + time_per_frame; const auto wait_till_time = next_synctime != 0 ? next_synctime : last_synctime + time_per_frame;
if (current_vsync_frame % vsync_modulo == 0) if (current_vsync_frame % vsync_modulo == 0)
{ {
// Real vsync // Real vsync
@ -623,9 +624,9 @@ bool show_screen_maybe(bool show)
#ifdef USE_SDL1 #ifdef USE_SDL1
void black_screen_now(void) void black_screen_now(void)
{ {
if (screen != NULL) if (screen != nullptr)
{ {
SDL_FillRect(screen, NULL, 0); SDL_FillRect(screen, nullptr, 0);
render_screen(true); render_screen(true);
show_screen(0); show_screen(0);
} }
@ -650,7 +651,7 @@ static void graphics_subinit()
STATIC_INLINE int bitsInMask(unsigned long mask) STATIC_INLINE int bitsInMask(unsigned long mask)
{ {
/* count bits in mask */ /* count bits in mask */
int n = 0; auto n = 0;
while (mask) while (mask)
{ {
n += mask & 1; n += mask & 1;
@ -662,7 +663,7 @@ STATIC_INLINE int bitsInMask(unsigned long mask)
STATIC_INLINE int maskShift(unsigned long mask) STATIC_INLINE int maskShift(unsigned long mask)
{ {
/* determine how far mask is shifted */ /* determine how far mask is shifted */
int n = 0; auto n = 0;
while (!(mask & 1)) while (!(mask & 1))
{ {
n++; n++;
@ -693,7 +694,7 @@ static int get_display_depth()
{ {
#ifdef USE_SDL1 #ifdef USE_SDL1
const SDL_VideoInfo *vid_info; const SDL_VideoInfo *vid_info;
int depth = 0; auto depth = 0;
if ((vid_info = SDL_GetVideoInfo())) if ((vid_info = SDL_GetVideoInfo()))
{ {
@ -713,10 +714,10 @@ static int get_display_depth()
int GetSurfacePixelFormat() int GetSurfacePixelFormat()
{ {
int depth = get_display_depth(); const auto depth = get_display_depth();
int unit = depth + 1 & 0xF8; const auto unit = depth + 1 & 0xF8;
return (unit == 8 return unit == 8
? RGBFB_CHUNKY ? RGBFB_CHUNKY
: depth == 15 && unit == 16 : depth == 15 && unit == 16
? RGBFB_R5G5B5 ? RGBFB_R5G5B5
@ -726,7 +727,7 @@ int GetSurfacePixelFormat()
? RGBFB_B8G8R8 ? RGBFB_B8G8R8
: unit == 32 : unit == 32
? RGBFB_R8G8B8A8 ? RGBFB_R8G8B8A8
: RGBFB_NONE); : RGBFB_NONE;
} }
int graphics_init(bool mousecapture) int graphics_init(bool mousecapture)
@ -744,20 +745,18 @@ void graphics_leave()
graphics_subshutdown(); graphics_subshutdown();
#ifdef USE_SDL1 #ifdef USE_SDL1
if(display_tid != 0) { if (display_tid != nullptr) {
write_comm_pipe_u32 (display_pipe, DISPLAY_SIGNAL_QUIT, 1); write_comm_pipe_u32(display_pipe, DISPLAY_SIGNAL_QUIT, 1);
while(display_tid != 0) { while (display_tid != nullptr) {
sleep_millis(10); sleep_millis(10);
} }
destroy_comm_pipe(display_pipe); destroy_comm_pipe(display_pipe);
xfree(display_pipe); xfree(display_pipe);
display_pipe = 0; display_pipe = nullptr;
uae_sem_destroy(&display_sem); uae_sem_destroy(&display_sem);
display_sem = 0; display_sem = nullptr;
} }
vc_dispmanx_vsync_callback(dispmanxdisplay, NULL, NULL);
vc_dispmanx_display_close(dispmanxdisplay);
bcm_host_deinit();
#elif USE_SDL2 #elif USE_SDL2
SDL_DestroyRenderer(renderer); SDL_DestroyRenderer(renderer);
SDL_DestroyWindow(sdlWindow); SDL_DestroyWindow(sdlWindow);
@ -765,22 +764,22 @@ void graphics_leave()
SDL_VideoQuit(); SDL_VideoQuit();
} }
#define systemRedShift (screen->format->Rshift) #define SYSTEM_RED_SHIFT (screen->format->Rshift)
#define systemGreenShift (screen->format->Gshift) #define SYSTEM_GREEN_SHIFT (screen->format->Gshift)
#define systemBlueShift (screen->format->Bshift) #define SYSTEM_BLUE_SHIFT (screen->format->Bshift)
#define systemRedMask (screen->format->Rmask) #define SYSTEM_RED_MASK (screen->format->Rmask)
#define systemGreenMask (screen->format->Gmask) #define SYSTEM_GREEN_MASK (screen->format->Gmask)
#define systemBlueMask (screen->format->Bmask) #define SYSTEM_BLUE_MASK (screen->format->Bmask)
static int save_png(SDL_Surface* surface, char* path) static int save_png(SDL_Surface* surface, char* path)
{ {
int w = surface->w; const auto w = surface->w;
int h = surface->h; const auto h = surface->h;
unsigned char* pix = static_cast<unsigned char *>(surface->pixels); const auto pix = static_cast<unsigned char *>(surface->pixels);
unsigned char writeBuffer[1024 * 3]; unsigned char writeBuffer[1024 * 3];
FILE* f = fopen(path, "wb"); const auto f = fopen(path, "wbe");
if (!f) return 0; if (!f) return 0;
png_structp png_ptr = png_create_write_struct(PNG_LIBPNG_VER_STRING, auto png_ptr = png_create_write_struct(PNG_LIBPNG_VER_STRING,
nullptr, nullptr,
nullptr, nullptr,
nullptr); nullptr);
@ -790,7 +789,7 @@ static int save_png(SDL_Surface* surface, char* path)
return 0; return 0;
} }
png_infop info_ptr = png_create_info_struct(png_ptr); auto info_ptr = png_create_info_struct(png_ptr);
if (!info_ptr) if (!info_ptr)
{ {
@ -813,23 +812,21 @@ static int save_png(SDL_Surface* surface, char* path)
png_write_info(png_ptr, info_ptr); png_write_info(png_ptr, info_ptr);
unsigned char* b = writeBuffer; auto b = writeBuffer;
int sizeX = w; const auto sizeX = w;
int sizeY = h; const auto sizeY = h;
int y;
int x;
unsigned short* p = reinterpret_cast<unsigned short *>(pix); auto p = reinterpret_cast<unsigned short *>(pix);
for (y = 0; y < sizeY; y++) for (auto y = 0; y < sizeY; y++)
{ {
for (x = 0; x < sizeX; x++) for (auto x = 0; x < sizeX; x++)
{ {
unsigned short v = p[x]; auto v = p[x];
*b++ = ((v & systemRedMask) >> systemRedShift) << 3; // R *b++ = ((v & SYSTEM_RED_MASK) >> SYSTEM_RED_SHIFT) << 3; // R
*b++ = ((v & systemGreenMask) >> systemGreenShift) << 2; // G *b++ = ((v & SYSTEM_GREEN_MASK) >> SYSTEM_GREEN_SHIFT) << 2; // G
*b++ = ((v & systemBlueMask) >> systemBlueShift) << 3; // B *b++ = ((v & SYSTEM_BLUE_MASK) >> SYSTEM_BLUE_SHIFT) << 3; // B
} }
p += surface->pitch / 2; p += surface->pitch / 2;
png_write_row(png_ptr, writeBuffer); png_write_row(png_ptr, writeBuffer);
@ -852,8 +849,8 @@ static void CreateScreenshot()
current_screenshot = nullptr; current_screenshot = nullptr;
} }
int w = screen->w; const auto w = screen->w;
int h = screen->h; const auto h = screen->h;
current_screenshot = SDL_CreateRGBSurfaceFrom(screen->pixels, current_screenshot = SDL_CreateRGBSurfaceFrom(screen->pixels,
w, w,
h, h,
@ -867,7 +864,7 @@ static void CreateScreenshot()
static int save_thumb(char* path) static int save_thumb(char* path)
{ {
int ret = 0; auto ret = 0;
if (current_screenshot != nullptr) if (current_screenshot != nullptr)
{ {
ret = save_png(current_screenshot, path); ret = save_png(current_screenshot, path);
@ -880,7 +877,7 @@ static int save_thumb(char* path)
static int currVSyncRate = 0; static int currVSyncRate = 0;
bool vsync_switchmode(int hz) bool vsync_switchmode(int hz)
{ {
int changed_height = changed_prefs.gfx_size.height; auto changed_height = changed_prefs.gfx_size.height;
if (hz >= 55) if (hz >= 55)
hz = 60; hz = 60;
@ -898,6 +895,7 @@ bool vsync_switchmode(int hz)
case 256: changed_height = 270; break; case 256: changed_height = 270; break;
case 262: changed_height = 270; break; case 262: changed_height = 270; break;
case 270: changed_height = 270; break; case 270: changed_height = 270; break;
default: break;
} }
} }
else if (hz == 60 && currVSyncRate == 50) else if (hz == 60 && currVSyncRate == 50)
@ -911,6 +909,7 @@ bool vsync_switchmode(int hz)
case 256: changed_height = 216; break; case 256: changed_height = 216; break;
case 262: changed_height = 216; break; case 262: changed_height = 216; break;
case 270: changed_height = 240; break; case 270: changed_height = 240; break;
default: break;
} }
} }
@ -939,7 +938,7 @@ bool vsync_switchmode(int hz)
bool target_graphics_buffer_update() bool target_graphics_buffer_update()
{ {
bool rate_changed = false; auto rate_changed = false;
if (currprefs.gfx_size.height != changed_prefs.gfx_size.height) if (currprefs.gfx_size.height != changed_prefs.gfx_size.height)
{ {
@ -961,15 +960,15 @@ bool target_graphics_buffer_update()
#ifdef PICASSO96 #ifdef PICASSO96
int picasso_palette(struct MyCLUTEntry *CLUT) int picasso_palette(struct MyCLUTEntry *clut)
{ {
int changed = 0; auto changed = 0;
for (int i = 0; i < 256; i++) for (auto i = 0; i < 256; i++)
{ {
int r = CLUT[i].Red; const int r = clut[i].Red;
int g = CLUT[i].Green; const int g = clut[i].Green;
int b = CLUT[i].Blue; const int b = clut[i].Blue;
uae_u32 v = CONVERT_RGB(r << 16 | g << 8 | b); auto v = CONVERT_RGB(r << 16 | g << 8 | b);
if (v != picasso_vidinfo.clut[i]) if (v != picasso_vidinfo.clut[i])
{ {
picasso_vidinfo.clut[i] = v; picasso_vidinfo.clut[i] = v;
@ -981,8 +980,8 @@ int picasso_palette(struct MyCLUTEntry *CLUT)
static int resolution_compare(const void* a, const void* b) static int resolution_compare(const void* a, const void* b)
{ {
struct PicassoResolution* ma = (struct PicassoResolution *)a; auto ma = (struct PicassoResolution *)a;
struct PicassoResolution* mb = (struct PicassoResolution *)b; auto mb = (struct PicassoResolution *)b;
if (ma->res.width < mb->res.width) if (ma->res.width < mb->res.width)
return -1; return -1;
if (ma->res.width > mb->res.width) if (ma->res.width > mb->res.width)
@ -996,8 +995,8 @@ static int resolution_compare(const void* a, const void* b)
static void sortmodes() static void sortmodes()
{ {
int i = 0, idx = -1; auto i = 0, idx = -1;
int pw = -1, ph = -1; auto pw = -1, ph = -1;
while (DisplayModes[i].depth >= 0) while (DisplayModes[i].depth >= 0)
i++; i++;
qsort(DisplayModes, i, sizeof(struct PicassoResolution), resolution_compare); qsort(DisplayModes, i, sizeof(struct PicassoResolution), resolution_compare);
@ -1013,15 +1012,13 @@ static void sortmodes()
} }
} }
static void modesList() static void modes_list()
{ {
int i, j; auto i = 0;
i = 0;
while (DisplayModes[i].depth >= 0) while (DisplayModes[i].depth >= 0)
{ {
write_log("%d: %s (", i, DisplayModes[i].name); write_log("%d: %s (", i, DisplayModes[i].name);
j = 0; int j = 0;
while (DisplayModes[i].refresh[j] > 0) while (DisplayModes[i].refresh[j] > 0)
{ {
if (j > 0) if (j > 0)
@ -1034,9 +1031,9 @@ static void modesList()
} }
} }
void picasso_InitResolutions() void picasso_init_resolutions()
{ {
int count = 0; auto count = 0;
char tmp[200]; char tmp[200];
int bits[] = { 8, 16, 32 }; int bits[] = { 8, 16, 32 };
@ -1050,16 +1047,16 @@ void picasso_InitResolutions()
Displays[0].name = my_strdup(tmp); Displays[0].name = my_strdup(tmp);
Displays[0].name2 = my_strdup("Display"); Displays[0].name2 = my_strdup("Display");
struct MultiDisplay * md1 = Displays; const auto md1 = Displays;
DisplayModes = md1->DisplayModes = xmalloc(struct PicassoResolution, MAX_PICASSO_MODES); DisplayModes = md1->DisplayModes = xmalloc(struct PicassoResolution, MAX_PICASSO_MODES);
for (int i = 0; i < MAX_SCREEN_MODES && count < MAX_PICASSO_MODES; i++) for (auto i = 0; i < MAX_SCREEN_MODES && count < MAX_PICASSO_MODES; i++)
{ {
for (int bit_idx = 0; bit_idx < 3; ++bit_idx) for (auto bit_idx = 0; bit_idx < 3; ++bit_idx)
{ {
int bitdepth = bits[bit_idx]; const auto bitdepth = bits[bit_idx];
int bit_unit = (bitdepth + 1) & 0xF8; const auto bit_unit = bitdepth + 1 & 0xF8;
int rgbFormat = (bitdepth == 8 ? RGBFB_CLUT : (bitdepth == 16 ? RGBFB_R5G6B5 : RGBFB_R8G8B8A8)); const auto rgbFormat = bitdepth == 8 ? RGBFB_CLUT : bitdepth == 16 ? RGBFB_R5G6B5 : RGBFB_R8G8B8A8;
int pixelFormat = 1 << rgbFormat; auto pixelFormat = 1 << rgbFormat;
pixelFormat |= RGBFF_CHUNKY; pixelFormat |= RGBFF_CHUNKY;
DisplayModes[count].res.width = x_size_table[i]; DisplayModes[count].res.width = x_size_table[i];
@ -1077,7 +1074,7 @@ void picasso_InitResolutions()
} }
DisplayModes[count].depth = -1; DisplayModes[count].depth = -1;
sortmodes(); sortmodes();
modesList(); modes_list();
DisplayModes = Displays[0].DisplayModes; DisplayModes = Displays[0].DisplayModes;
} }
#endif #endif

View file

@ -54,7 +54,7 @@ struct MultiDisplay {
extern struct MultiDisplay Displays[MAX_DISPLAYS]; extern struct MultiDisplay Displays[MAX_DISPLAYS];
extern int GetSurfacePixelFormat(void); extern int GetSurfacePixelFormat(void);
extern void picasso_InitResolutions (void); extern void picasso_init_resolutions (void);
#ifdef PICASSO96 #ifdef PICASSO96