Update for SDL3

This commit is contained in:
kanjitalk755 2024-08-22 20:43:38 +09:00
parent b63490dadb
commit e517d73f0c
10 changed files with 70 additions and 65 deletions

View File

@ -46,7 +46,11 @@ extern void update_sdl_video(SDL_Surface *screen, int numrects, SDL_Rect *rects)
#define VIDEO_DRV_DGA_INIT driver_base *drv #define VIDEO_DRV_DGA_INIT driver_base *drv
#define VIDEO_DRV_LOCK_PIXELS SDL_VIDEO_LOCK_SURFACE(drv->s) #define VIDEO_DRV_LOCK_PIXELS SDL_VIDEO_LOCK_SURFACE(drv->s)
#define VIDEO_DRV_UNLOCK_PIXELS SDL_VIDEO_UNLOCK_SURFACE(drv->s) #define VIDEO_DRV_UNLOCK_PIXELS SDL_VIDEO_UNLOCK_SURFACE(drv->s)
#if SDL_VERSION_ATLEAST(3, 0, 0)
#define VIDEO_DRV_DEPTH SDL_GetPixelFormatDetails(drv->s->format)->bits_per_pixel
#else
#define VIDEO_DRV_DEPTH drv->s->format->BitsPerPixel #define VIDEO_DRV_DEPTH drv->s->format->BitsPerPixel
#endif
#define VIDEO_DRV_WIDTH drv->s->w #define VIDEO_DRV_WIDTH drv->s->w
#define VIDEO_DRV_HEIGHT drv->s->h #define VIDEO_DRV_HEIGHT drv->s->h
#define VIDEO_DRV_ROW_BYTES drv->s->pitch #define VIDEO_DRV_ROW_BYTES drv->s->pitch

View File

@ -50,7 +50,7 @@ void disable_SDL2_macosx_menu_bar_keyboard_shortcuts() {
static NSWindow *get_nswindow(SDL_Window *window) { static NSWindow *get_nswindow(SDL_Window *window) {
#if SDL_VERSION_ATLEAST(3, 0, 0) #if SDL_VERSION_ATLEAST(3, 0, 0)
SDL_PropertiesID props = SDL_GetWindowProperties(window); SDL_PropertiesID props = SDL_GetWindowProperties(window);
return (NSWindow *)SDL_GetProperty(props, "SDL.window.cocoa.window", NULL); return (NSWindow *)SDL_GetPointerProperty(props, "SDL.window.cocoa.window", NULL);
#else #else
SDL_SysWMinfo wmInfo; SDL_SysWMinfo wmInfo;
SDL_VERSION(&wmInfo.version); SDL_VERSION(&wmInfo.version);

View File

@ -17,7 +17,7 @@
#endif #endif
#endif #endif
#if (SDL_COMPILEDVERSION < SDL_VERSIONNUM(2, 0, 0)) // SDLMain.m is not needed in SDL 2.x #if SDL_COMPILEDVERSION >= SDL_VERSIONNUM(1, 0, 0) && SDL_COMPILEDVERSION < SDL_VERSIONNUM(2, 0, 0) // SDLMain.m is not needed in SDL 2.x
#include "SDLMain.h" #include "SDLMain.h"
#include <sys/param.h> /* for MAXPATHLEN */ #include <sys/param.h> /* for MAXPATHLEN */

View File

@ -19,6 +19,10 @@
*/ */
#include "sysdeps.h" #include "sysdeps.h"
#include <SDL.h>
#if SDL_VERSION_ATLEAST(3, 0, 0)
#include "cpu_emulation.h" #include "cpu_emulation.h"
#include "main.h" #include "main.h"
#include "prefs.h" #include "prefs.h"
@ -26,13 +30,6 @@
#include "audio.h" #include "audio.h"
#include "audio_defs.h" #include "audio_defs.h"
#include <SDL_mutex.h>
#include <SDL_audio.h>
#include <SDL_version.h>
#include <SDL_timer.h>
#if SDL_VERSION_ATLEAST(3, 0, 0)
#include <SDL_init.h>
#include <queue> #include <queue>
#define DEBUG 0 #define DEBUG 0
@ -269,7 +266,7 @@ void AudioInterrupt(void)
WriteMacInt32(audio_data + adatStreamInfo, 0); WriteMacInt32(audio_data + adatStreamInfo, 0);
// Signal stream function // Signal stream function
SDL_PostSemaphore(audio_irq_done_sem); SDL_SignalSemaphore(audio_irq_done_sem);
D(bug("AudioInterrupt done\n")); D(bug("AudioInterrupt done\n"));
} }

View File

@ -43,7 +43,7 @@
#include "sysdeps.h" #include "sysdeps.h"
#include <SDL.h> #include <SDL.h>
#if (SDL_COMPILEDVERSION < SDL_VERSIONNUM(2, 0, 0)) #if SDL_COMPILEDVERSION >= SDL_VERSIONNUM(1, 0, 0) && SDL_COMPILEDVERSION < SDL_VERSIONNUM(2, 0, 0)
#include <SDL_mutex.h> #include <SDL_mutex.h>
#include <SDL_thread.h> #include <SDL_thread.h>

View File

@ -44,8 +44,6 @@
#include <SDL.h> #include <SDL.h>
#if SDL_VERSION_ATLEAST(3, 0, 0) #if SDL_VERSION_ATLEAST(3, 0, 0)
#include <SDL_mutex.h>
#include <SDL_thread.h>
#include <errno.h> #include <errno.h>
#include <vector> #include <vector>
#include <string> #include <string>
@ -809,9 +807,9 @@ static SDL_Surface *init_sdl_video(int width, int height, int depth, Uint32 flag
SDL_assert(sdl_texture == NULL); SDL_assert(sdl_texture == NULL);
#ifdef ENABLE_VOSF #ifdef ENABLE_VOSF
sdl_texture = SDL_CreateTexture(sdl_renderer, SDL_PIXELFORMAT_ARGB8888, SDL_TEXTUREACCESS_STREAMING, width, height); sdl_texture = SDL_CreateTexture(sdl_renderer, SDL_PIXELFORMAT_XRGB8888, SDL_TEXTUREACCESS_STREAMING, width, height);
#else #else
sdl_texture = SDL_CreateTexture(sdl_renderer, SDL_PIXELFORMAT_BGRA8888, SDL_TEXTUREACCESS_STREAMING, width, height); sdl_texture = SDL_CreateTexture(sdl_renderer, SDL_PIXELFORMAT_BGRX8888, SDL_TEXTUREACCESS_STREAMING, width, height);
#endif #endif
if (!sdl_texture) { if (!sdl_texture) {
shutdown_sdl_video(); shutdown_sdl_video();
@ -828,23 +826,23 @@ static SDL_Surface *init_sdl_video(int width, int height, int depth, Uint32 flag
case VIDEO_DEPTH_1BIT: case VIDEO_DEPTH_1BIT:
case VIDEO_DEPTH_2BIT: case VIDEO_DEPTH_2BIT:
case VIDEO_DEPTH_4BIT: case VIDEO_DEPTH_4BIT:
guest_surface = SDL_CreateSurface(width, height, SDL_GetPixelFormatEnumForMasks(8, 0, 0, 0, 0)); guest_surface = SDL_CreateSurface(width, height, SDL_GetPixelFormatForMasks(8, 0, 0, 0, 0));
break; break;
case VIDEO_DEPTH_8BIT: case VIDEO_DEPTH_8BIT:
#ifdef ENABLE_VOSF #ifdef ENABLE_VOSF
guest_surface = SDL_CreateSurface(width, height, SDL_GetPixelFormatEnumForMasks(8, 0, 0, 0, 0)); guest_surface = SDL_CreateSurface(width, height, SDL_GetPixelFormatForMasks(8, 0, 0, 0, 0));
#else #else
guest_surface = SDL_CreateSurfaceFrom(the_buffer, width, height, pitch, SDL_GetPixelFormatEnumForMasks(8, 0, 0, 0, 0)); guest_surface = SDL_CreateSurfaceFrom(width, height, SDL_GetPixelFormatForMasks(8, 0, 0, 0, 0), the_buffer, pitch);
#endif #endif
break; break;
case VIDEO_DEPTH_16BIT: case VIDEO_DEPTH_16BIT:
guest_surface = SDL_CreateSurface(width, height, SDL_GetPixelFormatEnumForMasks(16, 0xf800, 0x07e0, 0x001f, 0)); guest_surface = SDL_CreateSurface(width, height, SDL_GetPixelFormatForMasks(16, 0xf800, 0x07e0, 0x001f, 0));
break; break;
case VIDEO_DEPTH_32BIT: case VIDEO_DEPTH_32BIT:
#ifdef ENABLE_VOSF #ifdef ENABLE_VOSF
guest_surface = SDL_CreateSurface(width, height, SDL_GetPixelFormatEnumForMasks(32, 0x00ff0000, 0x0000ff00, 0x000000ff, 0xff000000)); guest_surface = SDL_CreateSurface(width, height, SDL_GetPixelFormatForMasks(32, 0x00ff0000, 0x0000ff00, 0x000000ff, 0xff000000));
#else #else
guest_surface = SDL_CreateSurfaceFrom(the_buffer, width, height, pitch, SDL_GetPixelFormatEnumForMasks(32, 0xff000000, 0x00ff0000, 0x0000ff00, 0x000000ff)); guest_surface = SDL_CreateSurfaceFrom(width, height, SDL_GetPixelFormatForMasks(32, 0xff000000, 0x00ff0000, 0x0000ff00, 0x000000ff), the_buffer, pitch);
#endif #endif
host_surface = guest_surface; host_surface = guest_surface;
break; break;
@ -859,16 +857,15 @@ static SDL_Surface *init_sdl_video(int width, int height, int depth, Uint32 flag
if (!host_surface) { if (!host_surface) {
SDL_PropertiesID props = SDL_GetTextureProperties(sdl_texture); SDL_PropertiesID props = SDL_GetTextureProperties(sdl_texture);
SDL_PixelFormatEnum texture_format = (SDL_PixelFormatEnum)SDL_GetNumberProperty(props, SDL_PROP_TEXTURE_FORMAT_NUMBER, 0); SDL_PixelFormat texture_format = (SDL_PixelFormat)SDL_GetNumberProperty(props, SDL_PROP_TEXTURE_FORMAT_NUMBER, 0);
int bpp; int bpp;
Uint32 Rmask, Gmask, Bmask, Amask; Uint32 Rmask, Gmask, Bmask, Amask;
if (!SDL_GetMasksForPixelFormatEnum(texture_format, &bpp, &Rmask, &Gmask, &Bmask, &Amask)) { if (SDL_GetMasksForPixelFormat(texture_format, &bpp, &Rmask, &Gmask, &Bmask, &Amask)) {
printf("ERROR: Unable to determine format for host SDL_surface: %s\n", SDL_GetError()); printf("ERROR: Unable to determine format for host SDL_surface: %s\n", SDL_GetError());
shutdown_sdl_video(); shutdown_sdl_video();
return NULL; return NULL;
} }
host_surface = SDL_CreateSurface(width, height, SDL_GetPixelFormatForMasks(bpp, Rmask, Gmask, Bmask, Amask));
host_surface = SDL_CreateSurface(width, height, SDL_GetPixelFormatEnumForMasks(bpp, Rmask, Gmask, Bmask, Amask));
if (!host_surface) { if (!host_surface) {
printf("ERROR: Unable to create host SDL_surface: %s\n", SDL_GetError()); printf("ERROR: Unable to create host SDL_surface: %s\n", SDL_GetError());
shutdown_sdl_video(); shutdown_sdl_video();
@ -934,7 +931,7 @@ static int present_sdl_video()
// Update the host OS' texture // Update the host OS' texture
uint8_t *srcPixels = (uint8_t *)host_surface->pixels + uint8_t *srcPixels = (uint8_t *)host_surface->pixels +
sdl_update_video_rect.y * host_surface->pitch + sdl_update_video_rect.y * host_surface->pitch +
sdl_update_video_rect.x * host_surface->format->bytes_per_pixel; sdl_update_video_rect.x * SDL_GetPixelFormatDetails(host_surface->format)->bytes_per_pixel;
uint8_t *dstPixels; uint8_t *dstPixels;
int dstPitch; int dstPitch;
@ -1099,7 +1096,7 @@ void driver_base::adapt_to_video_mode() {
ADBSetRelMouseMode(mouse_grabbed); ADBSetRelMouseMode(mouse_grabbed);
// Init blitting routines // Init blitting routines
SDL_PixelFormat *f = s->format; const SDL_PixelFormatDetails *f = SDL_GetPixelFormatDetails(s->format);
VisualFormat visualFormat; VisualFormat visualFormat;
visualFormat.depth = sdl_depth_of_video_depth(VIDEO_MODE_DEPTH); visualFormat.depth = sdl_depth_of_video_depth(VIDEO_MODE_DEPTH);
visualFormat.Rmask = f->Rmask; visualFormat.Rmask = f->Rmask;
@ -1110,7 +1107,7 @@ void driver_base::adapt_to_video_mode() {
// Load gray ramp to 8->16/32 expand map // Load gray ramp to 8->16/32 expand map
if (!IsDirectMode(mode)) if (!IsDirectMode(mode))
for (int i=0; i<256; i++) for (int i=0; i<256; i++)
ExpandMap[i] = SDL_MapRGB(f, i, i, i); ExpandMap[i] = SDL_MapRGB(f, NULL, i, i, i);
bool hardware_cursor = false; bool hardware_cursor = false;
@ -1219,11 +1216,7 @@ void driver_base::toggle_mouse_grab(void)
static void update_mouse_grab() static void update_mouse_grab()
{ {
if (mouse_grabbed) { SDL_SetWindowRelativeMouseMode(sdl_window, mouse_grabbed ? SDL_TRUE : SDL_FALSE);
SDL_SetRelativeMouseMode(SDL_TRUE);
} else {
SDL_SetRelativeMouseMode(SDL_FALSE);
}
} }
// Grab mouse, switch to relative mouse mode // Grab mouse, switch to relative mouse mode
@ -1860,7 +1853,7 @@ void SDL_monitor_desc::set_palette(uint8 *pal, int num_in)
if (!IsDirectMode(mode)) { if (!IsDirectMode(mode)) {
for (int i=0; i<256; i++) { for (int i=0; i<256; i++) {
int c = i & (num_in-1); // If there are less than 256 colors, we repeat the first entries (this makes color expansion easier) int c = i & (num_in-1); // If there are less than 256 colors, we repeat the first entries (this makes color expansion easier)
ExpandMap[i] = SDL_MapRGB(drv->s->format, pal[c*3+0], pal[c*3+1], pal[c*3+2]); ExpandMap[i] = SDL_MapRGB(SDL_GetPixelFormatDetails(drv->s->format), NULL, pal[c*3+0], pal[c*3+1], pal[c*3+2]);
} }
#ifdef ENABLE_VOSF #ifdef ENABLE_VOSF
@ -2107,32 +2100,32 @@ static int modify_opt_cmd(int code) {
static int event2keycode(SDL_KeyboardEvent const &key, bool key_down) static int event2keycode(SDL_KeyboardEvent const &key, bool key_down)
{ {
switch (key.key) { switch (key.key) {
case SDLK_a: return 0x00; case SDLK_A: return 0x00;
case SDLK_b: return 0x0b; case SDLK_B: return 0x0b;
case SDLK_c: return 0x08; case SDLK_C: return 0x08;
case SDLK_d: return 0x02; case SDLK_D: return 0x02;
case SDLK_e: return 0x0e; case SDLK_E: return 0x0e;
case SDLK_f: return 0x03; case SDLK_F: return 0x03;
case SDLK_g: return 0x05; case SDLK_G: return 0x05;
case SDLK_h: return 0x04; case SDLK_H: return 0x04;
case SDLK_i: return 0x22; case SDLK_I: return 0x22;
case SDLK_j: return 0x26; case SDLK_J: return 0x26;
case SDLK_k: return 0x28; case SDLK_K: return 0x28;
case SDLK_l: return 0x25; case SDLK_L: return 0x25;
case SDLK_m: return 0x2e; case SDLK_M: return 0x2e;
case SDLK_n: return 0x2d; case SDLK_N: return 0x2d;
case SDLK_o: return 0x1f; case SDLK_O: return 0x1f;
case SDLK_p: return 0x23; case SDLK_P: return 0x23;
case SDLK_q: return 0x0c; case SDLK_Q: return 0x0c;
case SDLK_r: return 0x0f; case SDLK_R: return 0x0f;
case SDLK_s: return 0x01; case SDLK_S: return 0x01;
case SDLK_t: return 0x11; case SDLK_T: return 0x11;
case SDLK_u: return 0x20; case SDLK_U: return 0x20;
case SDLK_v: return 0x09; case SDLK_V: return 0x09;
case SDLK_w: return 0x0d; case SDLK_W: return 0x0d;
case SDLK_x: return 0x07; case SDLK_X: return 0x07;
case SDLK_y: return 0x10; case SDLK_Y: return 0x10;
case SDLK_z: return 0x06; case SDLK_Z: return 0x06;
case SDLK_1: case SDLK_EXCLAIM: return 0x12; case SDLK_1: case SDLK_EXCLAIM: return 0x12;
case SDLK_2: case SDLK_AT: return 0x13; case SDLK_2: case SDLK_AT: return 0x13;
@ -2336,7 +2329,7 @@ static void handle_events(void)
ADBGetPosition(xl, yl); ADBGetPosition(xl, yl);
uint8 *p = (uint8 *)host_surface->pixels; uint8 *p = (uint8 *)host_surface->pixels;
const int OFS = 2; const int OFS = 2;
if (xl >= OFS) p += (xl - OFS) * host_surface->format->bytes_per_pixel; if (xl >= OFS) p += (xl - OFS) * SDL_GetPixelFormatDetails(host_surface->format)->bytes_per_pixel;
if (yl >= OFS) p += (yl - OFS) * host_surface->pitch; if (yl >= OFS) p += (yl - OFS) * host_surface->pitch;
set_mouse_ignore(sdl_window, *(uint32 *)p == VIDEO_CHROMAKEY); set_mouse_ignore(sdl_window, *(uint32 *)p == VIDEO_CHROMAKEY);
} }

View File

@ -47,7 +47,7 @@
#endif #endif
#if SDL_PLATFORM_MACOS #if SDL_PLATFORM_MACOS
#include "utils_macosx.h" # include "utils_macosx.h"
#endif #endif
#if !EMULATED_68K && defined(__NetBSD__) #if !EMULATED_68K && defined(__NetBSD__)

View File

@ -664,7 +664,7 @@ HWND GetMainWindowHandle(void)
} }
#if SDL_VERSION_ATLEAST(3, 0, 0) #if SDL_VERSION_ATLEAST(3, 0, 0)
SDL_PropertiesID props = SDL_GetWindowProperties(sdl_window); SDL_PropertiesID props = SDL_GetWindowProperties(sdl_window);
return (HWND)SDL_GetProperty(props, "SDL.window.cocoa.window", NULL); return (HWND)SDL_GetPointerProperty(props, "SDL.window.cocoa.window", NULL);
#else #else
SDL_SysWMinfo wmInfo; SDL_SysWMinfo wmInfo;
SDL_VERSION(&wmInfo.version); SDL_VERSION(&wmInfo.version);
@ -769,8 +769,13 @@ static LRESULT CALLBACK low_level_keyboard_hook(int nCode, WPARAM wParam, LPARAM
SDL_Event e; SDL_Event e;
memset(&e, 0, sizeof(e)); memset(&e, 0, sizeof(e));
e.type = (wParam == WM_KEYDOWN) ? SDL_EVENT_KEY_DOWN : SDL_EVENT_KEY_UP; e.type = (wParam == WM_KEYDOWN) ? SDL_EVENT_KEY_DOWN : SDL_EVENT_KEY_UP;
#if SDL_VERSION_ATLEAST(3, 0, 0)
e.key.key = (p->vkCode == VK_LWIN) ? SDLK_LGUI : SDLK_RGUI;
e.key.scancode = (p->vkCode == VK_LWIN) ? SDL_SCANCODE_LGUI : SDL_SCANCODE_RGUI;
#else
e.key.keysym.sym = (p->vkCode == VK_LWIN) ? SDLK_LGUI : SDLK_RGUI; e.key.keysym.sym = (p->vkCode == VK_LWIN) ? SDLK_LGUI : SDLK_RGUI;
e.key.keysym.scancode = (p->vkCode == VK_LWIN) ? SDL_SCANCODE_LGUI : SDL_SCANCODE_RGUI; e.key.keysym.scancode = (p->vkCode == VK_LWIN) ? SDL_SCANCODE_LGUI : SDL_SCANCODE_RGUI;
#endif
SDL_PushEvent(&e); SDL_PushEvent(&e);
return 1; return 1;
} }

View File

@ -814,7 +814,7 @@ HWND GetMainWindowHandle(void)
} }
#if SDL_VERSION_ATLEAST(3, 0, 0) #if SDL_VERSION_ATLEAST(3, 0, 0)
SDL_PropertiesID props = SDL_GetWindowProperties(sdl_window); SDL_PropertiesID props = SDL_GetWindowProperties(sdl_window);
return (HWND)SDL_GetProperty(props, "SDL.window.cocoa.window", NULL); return (HWND)SDL_GetPointerProperty(props, "SDL.window.cocoa.window", NULL);
#else #else
SDL_SysWMinfo wmInfo; SDL_SysWMinfo wmInfo;
SDL_VERSION(&wmInfo.version); SDL_VERSION(&wmInfo.version);
@ -899,8 +899,13 @@ static LRESULT CALLBACK low_level_keyboard_hook(int nCode, WPARAM wParam, LPARAM
SDL_Event e; SDL_Event e;
memset(&e, 0, sizeof(e)); memset(&e, 0, sizeof(e));
e.type = (wParam == WM_KEYDOWN) ? SDL_EVENT_KEY_DOWN : SDL_EVENT_KEY_UP; e.type = (wParam == WM_KEYDOWN) ? SDL_EVENT_KEY_DOWN : SDL_EVENT_KEY_UP;
#if SDL_VERSION_ATLEAST(3, 0, 0)
e.key.key = (p->vkCode == VK_LWIN) ? SDLK_LGUI : SDLK_RGUI;
e.key.scancode = (p->vkCode == VK_LWIN) ? SDL_SCANCODE_LGUI : SDL_SCANCODE_RGUI;
#else
e.key.keysym.sym = (p->vkCode == VK_LWIN) ? SDLK_LGUI : SDLK_RGUI; e.key.keysym.sym = (p->vkCode == VK_LWIN) ? SDLK_LGUI : SDLK_RGUI;
e.key.keysym.scancode = (p->vkCode == VK_LWIN) ? SDL_SCANCODE_LGUI : SDL_SCANCODE_RGUI; e.key.keysym.scancode = (p->vkCode == VK_LWIN) ? SDL_SCANCODE_LGUI : SDL_SCANCODE_RGUI;
#endif
SDL_PushEvent(&e); SDL_PushEvent(&e);
return 1; return 1;
} }

View File

@ -98,7 +98,8 @@ enum { // viAppleID
enum { // Display type enum { // Display type
DIS_INVALID, DIS_INVALID,
DIS_SCREEN, DIS_SCREEN,
DIS_WINDOW DIS_WINDOW,
DIS_CHROMAKEY
}; };
extern bool video_activated; // Flag: video display activated, mouse and keyboard data valid extern bool video_activated; // Flag: video display activated, mouse and keyboard data valid