diff --git a/CMakeLists.txt b/CMakeLists.txt index f22d7dc6..86d70025 100644 --- a/CMakeLists.txt +++ b/CMakeLists.txt @@ -7,6 +7,7 @@ project(FNA3D C) option(BUILD_SHARED_LIBS "Build shared library" ON) option(TRACING_SUPPORT "Build with tracing enabled" OFF) option(BUILD_DXVK_NATIVE "Enable support for dxvk-native" OFF) +option(BUILD_SDL3 "Build against SDL 3.0" OFF) # Version SET(LIB_MAJOR_VERSION "0") @@ -59,6 +60,9 @@ add_definitions( if(TRACING_SUPPORT) add_definitions(-DFNA3D_TRACING) endif() +if(BUILD_SDL3) + add_definitions(-DUSE_SDL3) +endif() if(WIN32 OR BUILD_DXVK_NATIVE) add_definitions( @@ -170,27 +174,53 @@ set_target_properties(FNA3D PROPERTIES OUTPUT_NAME "FNA3D" # Internal Dependencies target_link_libraries(FNA3D PRIVATE mojoshader ${LOBJC}) -# SDL2 Dependency -if (DEFINED SDL2_INCLUDE_DIRS AND DEFINED SDL2_LIBRARIES) - message(STATUS "using pre-defined SDL2 variables SDL2_INCLUDE_DIRS and SDL2_LIBRARIES") - target_include_directories(FNA3D PUBLIC "$") - target_include_directories(mojoshader PUBLIC "$") - target_link_libraries(FNA3D PUBLIC ${SDL2_LIBRARIES}) -else() - # Only try to autodetect if both SDL2 variables aren't explicitly set - find_package(SDL2 CONFIG) - if (TARGET SDL2::SDL2) - message(STATUS "using TARGET SDL2::SDL2") - target_link_libraries(FNA3D PUBLIC SDL2::SDL2) - target_link_libraries(mojoshader PUBLIC SDL2::SDL2) - elseif (TARGET SDL2) - message(STATUS "using TARGET SDL2") - target_link_libraries(FNA3D PUBLIC SDL2) - target_link_libraries(mojoshader PUBLIC SDL2) +# SDL Dependency +if (BUILD_SDL3) + if (DEFINED SDL3_INCLUDE_DIRS AND DEFINED SDL3_LIBRARIES) + message(STATUS "using pre-defined SDL3 variables SDL3_INCLUDE_DIRS and SDL3_LIBRARIES") + target_include_directories(FNA3D PUBLIC "$") + target_include_directories(mojoshader PUBLIC "$") + target_link_libraries(FNA3D PUBLIC ${SDL3_LIBRARIES}) else() - message(STATUS "no TARGET SDL2::SDL2, or SDL2, using variables") + # Only try to autodetect if both SDL3 variables aren't explicitly set + find_package(SDL3 CONFIG) + if (TARGET SDL3::SDL3) + message(STATUS "using TARGET SDL3::SDL3") + target_link_libraries(FNA3D PUBLIC SDL3::SDL3) + target_link_libraries(mojoshader PUBLIC SDL3::SDL3) + elseif (TARGET SDL3) + message(STATUS "using TARGET SDL3") + target_link_libraries(FNA3D PUBLIC SDL3) + target_link_libraries(mojoshader PUBLIC SDL3) + else() + message(STATUS "no TARGET SDL3::SDL3, or SDL3, using variables") + target_include_directories(FNA3D PUBLIC "$") + target_include_directories(mojoshader PUBLIC "$") + target_link_libraries(FNA3D PUBLIC ${SDL3_LIBRARIES}) + endif() + endif() +else() + if (DEFINED SDL2_INCLUDE_DIRS AND DEFINED SDL2_LIBRARIES) + message(STATUS "using pre-defined SDL2 variables SDL2_INCLUDE_DIRS and SDL2_LIBRARIES") target_include_directories(FNA3D PUBLIC "$") target_include_directories(mojoshader PUBLIC "$") target_link_libraries(FNA3D PUBLIC ${SDL2_LIBRARIES}) + else() + # Only try to autodetect if both SDL2 variables aren't explicitly set + find_package(SDL2 CONFIG) + if (TARGET SDL2::SDL2) + message(STATUS "using TARGET SDL2::SDL2") + target_link_libraries(FNA3D PUBLIC SDL2::SDL2) + target_link_libraries(mojoshader PUBLIC SDL2::SDL2) + elseif (TARGET SDL2) + message(STATUS "using TARGET SDL2") + target_link_libraries(FNA3D PUBLIC SDL2) + target_link_libraries(mojoshader PUBLIC SDL2) + else() + message(STATUS "no TARGET SDL2::SDL2, or SDL2, using variables") + target_include_directories(FNA3D PUBLIC "$") + target_include_directories(mojoshader PUBLIC "$") + target_link_libraries(FNA3D PUBLIC ${SDL2_LIBRARIES}) + endif() endif() endif() diff --git a/MojoShader b/MojoShader index dbc721c1..aaba69d0 160000 --- a/MojoShader +++ b/MojoShader @@ -1 +1 @@ -Subproject commit dbc721c1436657b1c5e8e7e7fd17e6a0b99bf28f +Subproject commit aaba69d0023e121d8ec5f1f0e3b090cabae1b6d2 diff --git a/src/FNA3D.c b/src/FNA3D.c index 3dc31e7c..00eb437d 100644 --- a/src/FNA3D.c +++ b/src/FNA3D.c @@ -27,7 +27,11 @@ #include "FNA3D_Driver.h" #include "FNA3D_Tracing.h" +#ifdef USE_SDL3 +#include +#else #include +#endif #if !SDL_VERSION_ATLEAST(2, 26, 0) #error "SDL version older than 2.26.0" diff --git a/src/FNA3D_CommandBuffer.c b/src/FNA3D_CommandBuffer.c index 0a3a29c2..9bd35586 100644 --- a/src/FNA3D_CommandBuffer.c +++ b/src/FNA3D_CommandBuffer.c @@ -26,7 +26,12 @@ #include "FNA3D_CommandBuffer.h" +#ifdef USE_SDL3 +#include +#else #include +#define SDL_Mutex SDL_mutex +#endif #define STARTING_TRANSFER_BUFFER_SIZE 8000000 /* 8MB */ #define FAST_TRANSFER_SIZE 64000000 /* 64MB */ @@ -93,8 +98,8 @@ struct FNA3D_CommandBufferManager FNA3D_TransferBufferPool transferBufferPool; - SDL_mutex *commandLock; - SDL_mutex *transferLock; + SDL_Mutex *commandLock; + SDL_Mutex *transferLock; }; static FNA3D_CommandBufferContainer* FNA3D_INTERNAL_CreateCommandBufferContainer( diff --git a/src/FNA3D_Driver_D3D11.c b/src/FNA3D_Driver_D3D11.c index 54e78ad5..4acb0b4f 100644 --- a/src/FNA3D_Driver_D3D11.c +++ b/src/FNA3D_Driver_D3D11.c @@ -31,10 +31,15 @@ #include "FNA3D_Driver_D3D11.h" #include "FNA3D_Driver_D3D11_shaders.h" +#ifdef USE_SDL3 +#include +#else #include #ifndef FNA3D_DXVK_NATIVE #include #endif /* !FNA3D_DXVK_NATIVE */ +#define SDL_Mutex SDL_mutex +#endif /* D3D11 Libraries */ @@ -213,7 +218,7 @@ typedef struct D3D11Renderer /* Cast FNA3D_Renderer* to this! */ IDXGIAdapter1 *adapter; ID3DUserDefinedAnnotation *annotation; BOOL supportsTearing; - SDL_mutex *ctxLock; + SDL_Mutex *ctxLock; SDL_iconv_t iconv; /* Window surfaces */ @@ -1067,11 +1072,7 @@ static void D3D11_DestroyDevice(FNA3D_Device *device) swapchainData = renderer->swapchainDatas[i]; ID3D11RenderTargetView_Release(swapchainData->swapchainRTView); IDXGISwapChain_Release(swapchainData->swapchain); - SDL_SetWindowData( - (SDL_Window*) swapchainData->windowHandle, - WINDOW_SWAPCHAIN_DATA, - NULL - ); + SDL_ClearProperty(SDL_GetWindowProperties(swapchainData->windowHandle), WINDOW_SWAPCHAIN_DATA); SDL_free(renderer->swapchainDatas[i]); } SDL_free(renderer->swapchainDatas); @@ -1532,9 +1533,10 @@ static void D3D11_SwapBuffers( } } - swapchainData = (D3D11SwapchainData*) SDL_GetWindowData( - (SDL_Window*) overrideWindowHandle, - WINDOW_SWAPCHAIN_DATA + swapchainData = (D3D11SwapchainData*) SDL_GetProperty( + SDL_GetWindowProperties(overrideWindowHandle), + WINDOW_SWAPCHAIN_DATA, + NULL ); if (swapchainData == NULL) { @@ -1544,9 +1546,10 @@ static void D3D11_SwapBuffers( (SDL_Window*) overrideWindowHandle, NULL ); - swapchainData = (D3D11SwapchainData*) SDL_GetWindowData( - (SDL_Window*) overrideWindowHandle, - WINDOW_SWAPCHAIN_DATA + swapchainData = (D3D11SwapchainData*) SDL_GetProperty( + SDL_GetWindowProperties(overrideWindowHandle), + WINDOW_SWAPCHAIN_DATA, + NULL ); D3D11_INTERNAL_UpdateSwapchainRT( renderer, @@ -2545,10 +2548,7 @@ static void D3D11_INTERNAL_CreateSwapChain( #ifdef FNA3D_DXVK_NATIVE dxgiHandle = (HWND) windowHandle; #else - SDL_SysWMinfo info; - SDL_VERSION(&info.version); - SDL_GetWindowWMInfo((SDL_Window*) windowHandle, &info); - dxgiHandle = info.info.win.window; + dxgiHandle = (HWND) SDL_GetProperty(SDL_GetWindowProperties(windowHandle), SDL_PROP_WINDOW_WIN32_HWND_POINTER, NULL); #endif /* FNA3D_DXVK_NATIVE */ /* Initialize swapchain buffer descriptor */ @@ -2676,7 +2676,7 @@ static void D3D11_INTERNAL_CreateSwapChain( swapchainData->windowHandle = windowHandle; swapchainData->swapchainRTView = NULL; swapchainData->format = backBufferFormat; - SDL_SetWindowData((SDL_Window*) windowHandle, WINDOW_SWAPCHAIN_DATA, swapchainData); + SDL_SetProperty(SDL_GetWindowProperties(windowHandle), WINDOW_SWAPCHAIN_DATA, swapchainData); if (growSwapchains) { if (renderer->swapchainDataCount >= renderer->swapchainDataCapacity) @@ -2771,9 +2771,10 @@ static void D3D11_INTERNAL_CreateBackbuffer( /* Create or update the swapchain */ if (parameters->deviceWindowHandle != NULL) { - swapchainData = (D3D11SwapchainData*) SDL_GetWindowData( - (SDL_Window*) parameters->deviceWindowHandle, - WINDOW_SWAPCHAIN_DATA + swapchainData = (D3D11SwapchainData*) SDL_GetProperty( + SDL_GetWindowProperties(parameters->deviceWindowHandle), + WINDOW_SWAPCHAIN_DATA, + NULL ); if (swapchainData == NULL) { @@ -2783,9 +2784,10 @@ static void D3D11_INTERNAL_CreateBackbuffer( parameters->deviceWindowHandle, NULL ); - swapchainData = (D3D11SwapchainData*) SDL_GetWindowData( - (SDL_Window*) parameters->deviceWindowHandle, - WINDOW_SWAPCHAIN_DATA + swapchainData = (D3D11SwapchainData*) SDL_GetProperty( + SDL_GetWindowProperties(parameters->deviceWindowHandle), + WINDOW_SWAPCHAIN_DATA, + NULL ); } else @@ -2796,7 +2798,7 @@ static void D3D11_INTERNAL_CreateBackbuffer( /* Surface format changed, recreate entirely */ IDXGISwapChain_Release(swapchainData->swapchain); - /* + /* * DXGI will crash in some cases if we don't flush deferred swapchain destruction: * * DXGI ERROR: IDXGIFactory::CreateSwapChain: Only one flip model swap chain can be @@ -5212,7 +5214,6 @@ static uint8_t D3D11_PrepareWindowAttributes(uint32_t *flags) } /* No window flags required */ - SDL_SetHint(SDL_HINT_VIDEO_EXTERNAL_CONTEXT, "1"); #ifdef FNA3D_DXVK_NATIVE /* ... unless this is DXVK */ *flags = SDL_WINDOW_VULKAN; @@ -5544,7 +5545,7 @@ static FNA3D_Device* D3D11_CreateDevice( { res = D3D11CreateDeviceFunc( (driverType == D3D_DRIVER_TYPE_WARP) ? NULL : (IDXGIAdapter*) renderer->adapter, - driverType, + driverType, NULL, flags, &levels[i], diff --git a/src/FNA3D_Driver_OpenGL.c b/src/FNA3D_Driver_OpenGL.c index 5fec6299..96066daf 100644 --- a/src/FNA3D_Driver_OpenGL.c +++ b/src/FNA3D_Driver_OpenGL.c @@ -29,7 +29,20 @@ #include "FNA3D_Driver.h" #include "FNA3D_Driver_OpenGL.h" +#ifdef USE_SDL3 +#include +#else #include +static inline SDL_threadID SDL_GetCurrentThreadID() +{ + return SDL_ThreadID(); +} +#define SDL_ThreadID SDL_threadID +#define SDL_Mutex SDL_mutex +#define SDL_Semaphore SDL_sem +#define SDL_PostSemaphore SDL_SemPost +#define SDL_WaitSemaphore SDL_SemWait +#endif /* We only use this to detect UIKit, for backbuffer creation */ #ifdef SDL_VIDEO_DRIVER_UIKIT @@ -287,21 +300,21 @@ typedef struct OpenGLRenderer /* Cast from FNA3D_Renderer* */ uint8_t togglePointSprite; /* Threading */ - SDL_threadID threadID; + SDL_ThreadID threadID; FNA3D_Command *commands; - SDL_mutex *commandsLock; + SDL_Mutex *commandsLock; OpenGLTexture *disposeTextures; - SDL_mutex *disposeTexturesLock; + SDL_Mutex *disposeTexturesLock; OpenGLRenderbuffer *disposeRenderbuffers; - SDL_mutex *disposeRenderbuffersLock; + SDL_Mutex *disposeRenderbuffersLock; OpenGLBuffer *disposeVertexBuffers; - SDL_mutex *disposeVertexBuffersLock; + SDL_Mutex *disposeVertexBuffersLock; OpenGLBuffer *disposeIndexBuffers; - SDL_mutex *disposeIndexBuffersLock; + SDL_Mutex *disposeIndexBuffersLock; OpenGLEffect *disposeEffects; - SDL_mutex *disposeEffectsLock; + SDL_Mutex *disposeEffectsLock; OpenGLQuery *disposeQueries; - SDL_mutex *disposeQueriesLock; + SDL_Mutex *disposeQueriesLock; /* GL entry points */ glfntype_glGetString glGetString; /* Loaded early! */ @@ -814,7 +827,7 @@ struct FNA3D_Command FNA3D_Renderbuffer *retval; } genDepthStencilRenderbuffer; }; - SDL_sem *semaphore; + SDL_Semaphore *semaphore; FNA3D_Command *next; }; @@ -1149,7 +1162,7 @@ static inline void ForceToMainThread( LinkedList_Add(renderer->commands, command, curr); SDL_UnlockMutex(renderer->commandsLock); - SDL_SemWait(command->semaphore); + SDL_WaitSemaphore(command->semaphore); SDL_DestroySemaphore(command->semaphore); } @@ -1250,7 +1263,7 @@ static inline void ExecuteCommands(OpenGLRenderer *renderer) cmd ); next = cmd->next; - SDL_SemPost(cmd->semaphore); + SDL_PostSemaphore(cmd->semaphore); cmd = next; } renderer->commands = NULL; /* No heap memory to free! -caleb */ @@ -3580,7 +3593,7 @@ static FNA3D_Texture* OPENGL_CreateTexture2D( uint32_t requiredBytes; FNA3D_Command cmd; - if (renderer->threadID != SDL_ThreadID()) + if (renderer->threadID != SDL_GetCurrentThreadID()) { cmd.type = FNA3D_COMMAND_CREATETEXTURE2D; cmd.createTexture2D.format = format; @@ -3666,7 +3679,7 @@ static FNA3D_Texture* OPENGL_CreateTexture3D( SDL_assert(renderer->supports_3DTexture); - if (renderer->threadID != SDL_ThreadID()) + if (renderer->threadID != SDL_GetCurrentThreadID()) { cmd.type = FNA3D_COMMAND_CREATETEXTURE3D; cmd.createTexture3D.format = format; @@ -3720,7 +3733,7 @@ static FNA3D_Texture* OPENGL_CreateTextureCube( uint32_t requiredBytes; FNA3D_Command cmd; - if (renderer->threadID != SDL_ThreadID()) + if (renderer->threadID != SDL_GetCurrentThreadID()) { cmd.type = FNA3D_COMMAND_CREATETEXTURECUBE; cmd.createTextureCube.format = format; @@ -3830,7 +3843,7 @@ static void OPENGL_AddDisposeTexture( OpenGLTexture *glTexture = (OpenGLTexture*) texture; OpenGLTexture *curr; - if (renderer->threadID == SDL_ThreadID()) + if (renderer->threadID == SDL_GetCurrentThreadID()) { OPENGL_INTERNAL_DestroyTexture(renderer, glTexture); } @@ -3859,7 +3872,7 @@ static void OPENGL_SetTextureData2D( int32_t packSize; FNA3D_Command cmd; - if (renderer->threadID != SDL_ThreadID()) + if (renderer->threadID != SDL_GetCurrentThreadID()) { cmd.type = FNA3D_COMMAND_SETTEXTUREDATA2D; cmd.setTextureData2D.texture = texture; @@ -3951,7 +3964,7 @@ static void OPENGL_SetTextureData3D( SDL_assert(renderer->supports_3DTexture); - if (renderer->threadID != SDL_ThreadID()) + if (renderer->threadID != SDL_GetCurrentThreadID()) { cmd.type = FNA3D_COMMAND_SETTEXTUREDATA3D; cmd.setTextureData3D.texture = texture; @@ -4002,7 +4015,7 @@ static void OPENGL_SetTextureDataCube( GLenum glFormat; FNA3D_Command cmd; - if (renderer->threadID != SDL_ThreadID()) + if (renderer->threadID != SDL_GetCurrentThreadID()) { cmd.type = FNA3D_COMMAND_SETTEXTUREDATACUBE; cmd.setTextureDataCube.texture = texture; @@ -4137,7 +4150,7 @@ static void OPENGL_GetTextureData2D( SDL_assert(renderer->supports_NonES3); - if (renderer->threadID != SDL_ThreadID()) + if (renderer->threadID != SDL_GetCurrentThreadID()) { cmd.type = FNA3D_COMMAND_GETTEXTUREDATA2D; cmd.getTextureData2D.texture = texture; @@ -4269,7 +4282,7 @@ static void OPENGL_GetTextureDataCube( SDL_assert(renderer->supports_NonES3); - if (renderer->threadID != SDL_ThreadID()) + if (renderer->threadID != SDL_GetCurrentThreadID()) { cmd.type = FNA3D_COMMAND_GETTEXTUREDATACUBE; cmd.getTextureDataCube.texture = texture; @@ -4357,7 +4370,7 @@ static FNA3D_Renderbuffer* OPENGL_GenColorRenderbuffer( OpenGLRenderbuffer *renderbuffer; FNA3D_Command cmd; - if (renderer->threadID != SDL_ThreadID()) + if (renderer->threadID != SDL_GetCurrentThreadID()) { cmd.type = FNA3D_COMMAND_GENCOLORRENDERBUFFER; cmd.genColorRenderbuffer.width = width; @@ -4412,7 +4425,7 @@ static FNA3D_Renderbuffer* OPENGL_GenDepthStencilRenderbuffer( OpenGLRenderbuffer *renderbuffer; FNA3D_Command cmd; - if (renderer->threadID != SDL_ThreadID()) + if (renderer->threadID != SDL_GetCurrentThreadID()) { cmd.type = FNA3D_COMMAND_GENDEPTHRENDERBUFFER; cmd.genDepthStencilRenderbuffer.width = width; @@ -4489,7 +4502,7 @@ static void OPENGL_AddDisposeRenderbuffer( OpenGLRenderbuffer *buffer = (OpenGLRenderbuffer*) renderbuffer; OpenGLRenderbuffer *curr; - if (renderer->threadID == SDL_ThreadID()) + if (renderer->threadID == SDL_GetCurrentThreadID()) { OPENGL_INTERNAL_DestroyRenderbuffer(renderer, buffer); } @@ -4514,7 +4527,7 @@ static FNA3D_Buffer* OPENGL_GenVertexBuffer( GLuint handle; FNA3D_Command cmd; - if (renderer->threadID != SDL_ThreadID()) + if (renderer->threadID != SDL_GetCurrentThreadID()) { cmd.type = FNA3D_COMMAND_GENVERTEXBUFFER; cmd.genVertexBuffer.dynamic = dynamic; @@ -4575,7 +4588,7 @@ static void OPENGL_AddDisposeVertexBuffer( OpenGLBuffer *glBuffer = (OpenGLBuffer*) buffer; OpenGLBuffer *curr; - if (renderer->threadID == SDL_ThreadID()) + if (renderer->threadID == SDL_GetCurrentThreadID()) { OPENGL_INTERNAL_DestroyVertexBuffer(renderer, glBuffer); } @@ -4601,7 +4614,7 @@ static void OPENGL_SetVertexBufferData( OpenGLBuffer *glBuffer = (OpenGLBuffer*) buffer; FNA3D_Command cmd; - if (renderer->threadID != SDL_ThreadID()) + if (renderer->threadID != SDL_GetCurrentThreadID()) { cmd.type = FNA3D_COMMAND_SETVERTEXBUFFERDATA; cmd.setVertexBufferData.buffer = buffer; @@ -4655,7 +4668,7 @@ static void OPENGL_GetVertexBufferData( SDL_assert(renderer->supports_NonES3); - if (renderer->threadID != SDL_ThreadID()) + if (renderer->threadID != SDL_GetCurrentThreadID()) { cmd.type = FNA3D_COMMAND_GETVERTEXBUFFERDATA; cmd.getVertexBufferData.buffer = buffer; @@ -4715,7 +4728,7 @@ static FNA3D_Buffer* OPENGL_GenIndexBuffer( GLuint handle; FNA3D_Command cmd; - if (renderer->threadID != SDL_ThreadID()) + if (renderer->threadID != SDL_GetCurrentThreadID()) { cmd.type = FNA3D_COMMAND_GENINDEXBUFFER; cmd.genIndexBuffer.dynamic = dynamic; @@ -4765,7 +4778,7 @@ static void OPENGL_AddDisposeIndexBuffer( OpenGLBuffer *glBuffer = (OpenGLBuffer*) buffer; OpenGLBuffer *curr; - if (renderer->threadID == SDL_ThreadID()) + if (renderer->threadID == SDL_GetCurrentThreadID()) { OPENGL_INTERNAL_DestroyIndexBuffer(renderer, glBuffer); } @@ -4789,7 +4802,7 @@ static void OPENGL_SetIndexBufferData( OpenGLBuffer *glBuffer = (OpenGLBuffer*) buffer; FNA3D_Command cmd; - if (renderer->threadID != SDL_ThreadID()) + if (renderer->threadID != SDL_GetCurrentThreadID()) { cmd.type = FNA3D_COMMAND_SETINDEXBUFFERDATA; cmd.setIndexBufferData.buffer = buffer; @@ -4834,7 +4847,7 @@ static void OPENGL_GetIndexBufferData( SDL_assert(renderer->supports_NonES3); - if (renderer->threadID != SDL_ThreadID()) + if (renderer->threadID != SDL_GetCurrentThreadID()) { cmd.type = FNA3D_COMMAND_GETINDEXBUFFERDATA; cmd.getIndexBufferData.buffer = buffer; @@ -4938,7 +4951,7 @@ static void OPENGL_CreateEffect( FNA3D_Command cmd; MOJOSHADER_effectShaderContext shaderBackend; - if (renderer->threadID != SDL_ThreadID()) + if (renderer->threadID != SDL_GetCurrentThreadID()) { cmd.type = FNA3D_COMMAND_CREATEEFFECT; cmd.createEffect.effectCode = effectCode; @@ -4998,7 +5011,7 @@ static void OPENGL_CloneEffect( OpenGLEffect *result; FNA3D_Command cmd; - if (renderer->threadID != SDL_ThreadID()) + if (renderer->threadID != SDL_GetCurrentThreadID()) { cmd.type = FNA3D_COMMAND_CLONEEFFECT; cmd.cloneEffect.cloneSource = cloneSource; @@ -5048,7 +5061,7 @@ static void OPENGL_AddDisposeEffect( OpenGLEffect *fnaEffect = (OpenGLEffect*) effect; OpenGLEffect *curr; - if (renderer->threadID == SDL_ThreadID()) + if (renderer->threadID == SDL_GetCurrentThreadID()) { OPENGL_INTERNAL_DestroyEffect(renderer, fnaEffect); } @@ -5183,7 +5196,7 @@ static void OPENGL_AddDisposeQuery( SDL_assert(renderer->supports_ARB_occlusion_query); - if (renderer->threadID == SDL_ThreadID()) + if (renderer->threadID == SDL_GetCurrentThreadID()) { OPENGL_INTERNAL_DestroyQuery(renderer, glQuery); } @@ -5669,7 +5682,10 @@ static inline void LoadEntryPoints( static void* MOJOSHADERCALL GLGetProcAddress(const char *ep, void* d) { +#pragma GCC diagnostic push +#pragma GCC diagnostic ignored "-Wpedantic" return SDL_GL_GetProcAddress(ep); +#pragma GCC diagnostic pop } static inline void CheckExtensions( @@ -6172,7 +6188,7 @@ FNA3D_Device* OPENGL_CreateDevice( renderer->currentClearDepth = 1.0f; /* The creation thread will be the "main" thread */ - renderer->threadID = SDL_ThreadID(); + renderer->threadID = SDL_GetCurrentThreadID(); renderer->commandsLock = SDL_CreateMutex(); renderer->disposeTexturesLock = SDL_CreateMutex(); renderer->disposeRenderbuffersLock = SDL_CreateMutex(); diff --git a/src/FNA3D_Driver_Vulkan.c b/src/FNA3D_Driver_Vulkan.c index 8e0e8282..6e75a02c 100644 --- a/src/FNA3D_Driver_Vulkan.c +++ b/src/FNA3D_Driver_Vulkan.c @@ -37,8 +37,15 @@ #include "FNA3D_CommandBuffer.h" #include "FNA3D_PipelineCache.h" +#ifdef USE_SDL3 +#include +#include +#else #include #include +#define SDL_AtomicInt SDL_atomic_t +#define SDL_Mutex SDL_mutex +#endif #define VULKAN_INTERNAL_clamp(val, min, max) SDL_max(min, SDL_min(val, max)) @@ -1038,7 +1045,7 @@ struct VulkanBuffer VkBufferUsageFlags usage; uint8_t preferDeviceLocal; uint8_t isTransferBuffer; - SDL_atomic_t refcount; + SDL_AtomicInt refcount; }; typedef struct VulkanColorBuffer @@ -1280,8 +1287,8 @@ typedef struct VulkanRenderer uint8_t submitCounter; /* used so we don't clobber data being used by GPU */ /* Threading */ - SDL_mutex *passLock; - SDL_mutex *disposeLock; + SDL_Mutex *passLock; + SDL_Mutex *disposeLock; #define VULKAN_INSTANCE_FUNCTION(name) \ PFN_##name name; @@ -2276,6 +2283,7 @@ static uint8_t VULKAN_INTERNAL_CreateInstance( ) { VkResult vulkanResult; VkApplicationInfo appInfo; + char const* const* inferredExtensionNames; const char **instanceExtensionNames; uint32_t instanceExtensionCount; VkInstanceCreateInfo createInfo; @@ -2290,17 +2298,15 @@ static uint8_t VULKAN_INTERNAL_CreateInstance( appInfo.engineVersion = FNA3D_COMPILED_VERSION; appInfo.apiVersion = VK_MAKE_VERSION(1, 0, 0); - if (!SDL_Vulkan_GetInstanceExtensions( - (SDL_Window*) presentationParameters->deviceWindowHandle, - &instanceExtensionCount, - NULL - )) { + inferredExtensionNames = SDL_Vulkan_GetInstanceExtensions(&instanceExtensionCount); + + if (inferredExtensionNames == NULL) + { FNA3D_LogWarn( - "SDL_Vulkan_GetInstanceExtensions(): getExtensionCount: %s", + "SDL_Vulkan_GetInstanceExtensions(): %s", SDL_GetError() ); - - return 0; + goto create_instance_fail; } /* Extra space for the following extensions: @@ -2312,16 +2318,9 @@ static uint8_t VULKAN_INTERNAL_CreateInstance( instanceExtensionCount + 2 ); - if (!SDL_Vulkan_GetInstanceExtensions( - (SDL_Window*) presentationParameters->deviceWindowHandle, - &instanceExtensionCount, - instanceExtensionNames - )) { - FNA3D_LogWarn( - "SDL_Vulkan_GetInstanceExtensions(): %s", - SDL_GetError() - ); - goto create_instance_fail; + for (uint32_t i = 0; i < instanceExtensionCount; i += 1) + { + instanceExtensionNames[i] = inferredExtensionNames[i]; } if (!VULKAN_INTERNAL_CheckInstanceExtensions( @@ -4284,7 +4283,7 @@ static void VULKAN_INTERNAL_SubmitCommands( uint32_t swapchainImageIndex; VulkanCommandBuffer *commandBufferToSubmit; - SDL_DisplayMode mode; + const SDL_DisplayMode *mode; VkPipelineStageFlags waitStages = VK_PIPELINE_STAGE_COLOR_ATTACHMENT_OUTPUT_BIT; VkPresentInfoKHR presentInfo; struct @@ -4299,19 +4298,13 @@ static void VULKAN_INTERNAL_SubmitCommands( if (present) { - SDL_GetCurrentDisplayMode( - SDL_GetWindowDisplayIndex( + mode = SDL_GetCurrentDisplayMode( + SDL_GetDisplayForWindow( (SDL_Window*) windowHandle - ), - &mode + ) ); - if (mode.refresh_rate == 0) - { - /* Needs to be _something_ */ - mode.refresh_rate = 60; - } - swapchainData = (VulkanSwapchainData*) SDL_GetWindowData(windowHandle, WINDOW_SWAPCHAIN_DATA); + swapchainData = (VulkanSwapchainData *)SDL_GetProperty(SDL_GetWindowProperties(windowHandle), WINDOW_SWAPCHAIN_DATA, NULL); if (swapchainData == NULL) { @@ -4327,7 +4320,7 @@ static void VULKAN_INTERNAL_SubmitCommands( } else { - swapchainData = (VulkanSwapchainData*) SDL_GetWindowData(windowHandle, WINDOW_SWAPCHAIN_DATA); + swapchainData = (VulkanSwapchainData *)SDL_GetProperty(SDL_GetWindowProperties(windowHandle), WINDOW_SWAPCHAIN_DATA, NULL); validSwapchainExists = 1; } } @@ -4342,7 +4335,7 @@ static void VULKAN_INTERNAL_SubmitCommands( acquireResult = renderer->vkAcquireNextImageKHR( renderer->logicalDevice, swapchainData->swapchain, - 10000000000 / mode.refresh_rate, /* ~10 frames, so we'll progress even if throttled to zero. */ + 10000000000 / mode->refresh_rate, /* ~10 frames, so we'll progress even if throttled to zero. */ swapchainData->imageAvailableSemaphore, VK_NULL_HANDLE, &swapchainImageIndex @@ -4498,10 +4491,7 @@ static void VULKAN_INTERNAL_SubmitCommands( { if (renderer->supports.GGP_frame_token) { - const void* token = SDL_GetWindowData( - (SDL_Window*) windowHandle, - "GgpFrameToken" - ); + const void *token = SDL_GetProperty(SDL_GetWindowProperties(windowHandle), "GgpFrameToken", NULL); presentInfoGGP.sType = VK_STRUCTURE_TYPE_PRESENT_FRAME_TOKEN_GGP; presentInfoGGP.pNext = NULL; presentInfoGGP.frameToken = (uint64_t) (size_t) token; @@ -4634,6 +4624,7 @@ static CreateSwapchainResult VULKAN_INTERNAL_CreateSwapchain( if (!SDL_Vulkan_CreateSurface( (SDL_Window*) windowHandle, renderer->instance, + NULL, /* FIXME: VAllocationCallbacks */ &swapchainData->surface )) { SDL_free(swapchainData); @@ -5020,7 +5011,7 @@ static CreateSwapchainResult VULKAN_INTERNAL_CreateSwapchain( swapchainData->fence = VK_NULL_HANDLE; - SDL_SetWindowData(windowHandle, WINDOW_SWAPCHAIN_DATA, swapchainData); + SDL_SetProperty(SDL_GetWindowProperties(windowHandle), WINDOW_SWAPCHAIN_DATA, swapchainData); if (renderer->swapchainDataCount >= renderer->swapchainDataCapacity) { @@ -5052,7 +5043,7 @@ static void VULKAN_INTERNAL_DestroySwapchain( uint32_t i; VulkanSwapchainData *swapchainData; - swapchainData = (VulkanSwapchainData*) SDL_GetWindowData(windowHandle, WINDOW_SWAPCHAIN_DATA); + swapchainData = (VulkanSwapchainData*) SDL_GetProperty(SDL_GetWindowProperties(windowHandle), WINDOW_SWAPCHAIN_DATA, NULL); if (swapchainData == NULL) { @@ -5119,7 +5110,7 @@ static void VULKAN_INTERNAL_DestroySwapchain( } } - SDL_SetWindowData(windowHandle, WINDOW_SWAPCHAIN_DATA, NULL); + SDL_ClearProperty(SDL_GetWindowProperties(windowHandle), WINDOW_SWAPCHAIN_DATA); SDL_free(swapchainData); } @@ -7291,7 +7282,7 @@ static void VULKAN_DestroyDevice(FNA3D_Device *device) VkResult pipelineCacheResult; size_t pipelineCacheSize; uint8_t *pipelineCacheData; - SDL_RWops *pipelineCacheFile; + SDL_IOStream *pipelineCacheFile; const char *pipelineCacheFileName; VULKAN_INTERNAL_FlushCommands(renderer, 1); @@ -7321,7 +7312,7 @@ static void VULKAN_DestroyDevice(FNA3D_Device *device) } else { - pipelineCacheFile = SDL_RWFromFile(pipelineCacheFileName, "wb"); + pipelineCacheFile = SDL_IOFromFile(pipelineCacheFileName, "wb"); } if (pipelineCacheFile != NULL) @@ -7335,14 +7326,13 @@ static void VULKAN_DestroyDevice(FNA3D_Device *device) pipelineCacheData ); - pipelineCacheFile->write( + SDL_WriteIO( pipelineCacheFile, pipelineCacheData, - sizeof(uint8_t), pipelineCacheSize ); - pipelineCacheFile->close(pipelineCacheFile); + SDL_CloseIO(pipelineCacheFile); SDL_free(pipelineCacheData); } else @@ -11052,8 +11042,8 @@ static uint8_t VULKAN_PrepareWindowAttributes(uint32_t *flags) /* Create a dummy window, otherwise we cannot query swapchain support */ dummyWindowHandle = SDL_CreateWindow( "FNA3D Vulkan", - 0, 0, - 128, 128, + 128, + 128, SDL_WINDOW_VULKAN | SDL_WINDOW_HIDDEN ); @@ -11080,6 +11070,7 @@ static uint8_t VULKAN_PrepareWindowAttributes(uint32_t *flags) if (!SDL_Vulkan_CreateSurface( (SDL_Window*) presentationParameters.deviceWindowHandle, renderer->instance, + NULL, /* FIXME: VAllocationCallbacks */ &surface )) { SDL_DestroyWindow(dummyWindowHandle); @@ -11216,6 +11207,7 @@ static FNA3D_Device* VULKAN_CreateDevice( if (!SDL_Vulkan_CreateSurface( (SDL_Window*) presentationParameters->deviceWindowHandle, renderer->instance, + NULL, /* FIXME: VAllocationCallbacks */ &surface )) { FNA3D_LogError( diff --git a/src/FNA3D_Image.c b/src/FNA3D_Image.c index 328fe0ce..e38893d0 100644 --- a/src/FNA3D_Image.c +++ b/src/FNA3D_Image.c @@ -26,7 +26,36 @@ #include "FNA3D_Image.h" +#ifdef USE_SDL3 +#include +#else #include +#define SDL_CreateSurface(a, b, c) \ + SDL_CreateRGBSurface( \ + 0, \ + a, \ + b, \ + 8 * (c == SDL_PIXELFORMAT_RGBA32) ? 4 : 3, \ + 0x000000FF, \ + 0x0000FF00, \ + 0x00FF0000, \ + (c == SDL_PIXELFORMAT_RGBA32) ? 0xFF000000 : 0 \ + ) +#define SDL_CreateSurfaceFrom(a, b, c, d, e) \ + SDL_CreateRGBSurfaceFrom( \ + a, \ + b, \ + c, \ + 8 * (e == SDL_PIXELFORMAT_RGBA32) ? 4 : 3, \ + d, \ + 0x000000FF, \ + 0x0000FF00, \ + 0x00FF0000, \ + (e == SDL_PIXELFORMAT_RGBA32) ? 0xFF000000 : 0 \ + ) +#define SDL_BlitSurfaceScaled(a, b, c, d, e) SDL_BlitScaled(a, b, c, d) +#define SDL_DestroySurface SDL_FreeSurface +#endif extern void FNA3D_LogWarn(const char *fmt, ...); @@ -92,9 +121,15 @@ extern void FNA3D_LogWarn(const char *fmt, ...); #define STBI_NO_STDIO #define STB_IMAGE_STATIC #define STBI_ASSERT SDL_assert +#ifdef USE_SDL3 +#define STBI_MALLOC SDL_malloc +#define STBI_REALLOC SDL_realloc +#define STBI_FREE SDL_free +#else #define STBI_MALLOC SDL_SIMDAlloc #define STBI_REALLOC SDL_SIMDRealloc #define STBI_FREE SDL_SIMDFree +#endif #define STB_IMAGE_IMPLEMENTATION #ifdef __MINGW32__ #define STBI_NO_THREAD_LOCALS /* FIXME: Port to SDL_TLS -flibit */ @@ -182,18 +217,16 @@ uint8_t* FNA3D_Image_Load( if (forceW != -1 && forceH != -1) { - surface = SDL_CreateRGBSurfaceFrom( + surface = SDL_CreateSurfaceFrom( result, *w, *h, - 8 * 4, (*w) * 4, - 0x000000FF, - 0x0000FF00, - 0x00FF0000, - 0xFF000000 + SDL_PIXELFORMAT_RGBA32 ); +#if SDL_MAJOR_VERSION < 3 surface->flags |= SDL_SIMD_ALIGNED; +#endif if (zoom) { @@ -239,42 +272,39 @@ uint8_t* FNA3D_Image_Load( } /* Alloc surface, blit! */ - newSurface = SDL_CreateRGBSurface( - 0, + newSurface = SDL_CreateSurface( *w, *h, - 32, - 0x000000FF, - 0x0000FF00, - 0x00FF0000, - 0xFF000000 + SDL_PIXELFORMAT_RGBA32 ); SDL_SetSurfaceBlendMode(surface, SDL_BLENDMODE_NONE); if (zoom) { - SDL_BlitScaled( + SDL_BlitSurfaceScaled( surface, &crop, newSurface, - NULL + NULL, + SDL_SCALEMODE_LINEAR /* FIXME: is this correct */ ); } else { - SDL_BlitScaled( + SDL_BlitSurfaceScaled( surface, NULL, newSurface, - NULL + NULL, + SDL_SCALEMODE_LINEAR /* FIXME: is this correct */ ); } - SDL_FreeSurface(surface); + SDL_DestroySurface(surface); SDL_free(result); /* We're going to cheat and let the client take the memory! */ result = (uint8_t*) newSurface->pixels; newSurface->flags |= SDL_PREALLOC; - SDL_FreeSurface(newSurface); + SDL_DestroySurface(newSurface); } /* Ensure that the alpha pixels are... well, actual alpha. @@ -299,7 +329,7 @@ uint8_t* FNA3D_Image_Load( void FNA3D_Image_Free(uint8_t *mem) { - SDL_SIMDFree(mem); + STBI_FREE(mem); } /* Image Write API */ @@ -320,30 +350,21 @@ void FNA3D_Image_SavePNG( /* Only blit to scale, the format is already correct */ if (scale) { - surface = SDL_CreateRGBSurfaceFrom( + surface = SDL_CreateSurfaceFrom( data, srcW, srcH, - 8 * 4, srcW * 4, - 0x000000FF, - 0x0000FF00, - 0x00FF0000, - 0xFF000000 + SDL_PIXELFORMAT_RGBA32 ); - scaledSurface = SDL_CreateRGBSurface( - 0, + scaledSurface = SDL_CreateSurface( dstW, dstH, - 32, - 0x000000FF, - 0x0000FF00, - 0x00FF0000, - 0xFF000000 + SDL_PIXELFORMAT_RGBA32 ); SDL_SetSurfaceBlendMode(surface, SDL_BLENDMODE_NONE); - SDL_BlitScaled(surface, NULL, scaledSurface, NULL); - SDL_FreeSurface(surface); + SDL_BlitSurfaceScaled(surface, NULL, scaledSurface, NULL, SDL_SCALEMODE_LINEAR); + SDL_DestroySurface(surface); pixels = (uint8_t*) scaledSurface->pixels; } else @@ -365,7 +386,7 @@ void FNA3D_Image_SavePNG( /* Clean up. We out. */ if (scale) { - SDL_FreeSurface(scaledSurface); + SDL_DestroySurface(scaledSurface); } } @@ -380,30 +401,21 @@ void FNA3D_Image_SaveJPG( int32_t quality ) { /* Get an RGB24 surface at the specified width/height */ - SDL_Surface *surface = SDL_CreateRGBSurfaceFrom( + SDL_Surface *surface = SDL_CreateSurfaceFrom( data, srcW, srcH, - 8 * 4, srcW * 4, - 0x000000FF, - 0x0000FF00, - 0x00FF0000, - 0xFF000000 + SDL_PIXELFORMAT_RGBA32 ); - SDL_Surface *convertSurface = SDL_CreateRGBSurface( - 0, + SDL_Surface *convertSurface = SDL_CreateSurface( dstW, dstH, - 24, - 0x000000FF, - 0x0000FF00, - 0x00FF0000, - 0x00000000 + SDL_PIXELFORMAT_RGB24 ); SDL_SetSurfaceBlendMode(surface, SDL_BLENDMODE_NONE); - SDL_BlitScaled(surface, NULL, convertSurface, NULL); - SDL_FreeSurface(surface); + SDL_BlitSurfaceScaled(surface, NULL, convertSurface, NULL, SDL_SCALEMODE_LINEAR); + SDL_DestroySurface(surface); surface = convertSurface; /* Write the image, finally. */ @@ -418,7 +430,7 @@ void FNA3D_Image_SaveJPG( ); /* Clean up. We out. */ - SDL_FreeSurface(surface); + SDL_DestroySurface(surface); } /* vim: set noexpandtab shiftwidth=8 tabstop=8: */ diff --git a/src/FNA3D_Memory.c b/src/FNA3D_Memory.c index 8fb8969e..8488f2c5 100644 --- a/src/FNA3D_Memory.c +++ b/src/FNA3D_Memory.c @@ -26,7 +26,12 @@ #include "FNA3D_Memory.h" +#ifdef USE_SDL3 +#include +#else #include +#define SDL_Mutex SDL_mutex +#endif /* * Memory Allocator @@ -85,7 +90,7 @@ struct FNA3D_MemoryAllocation uint8_t available; uint8_t *mapPointer; - SDL_mutex *mapLock; + SDL_Mutex *mapLock; }; struct FNA3D_SubAllocator @@ -112,7 +117,7 @@ struct FNA3D_MemoryAllocator size_t usedRegionsToDestroyCount; size_t usedRegionsToDestroyCapacity; - SDL_mutex *lock; + SDL_Mutex *lock; }; static void FNA3D_INTERNAL_RemoveMemoryFreeRegion( diff --git a/src/FNA3D_PipelineCache.c b/src/FNA3D_PipelineCache.c index 2140c366..fcde44d0 100644 --- a/src/FNA3D_PipelineCache.c +++ b/src/FNA3D_PipelineCache.c @@ -26,7 +26,11 @@ #include "FNA3D_PipelineCache.h" +#ifdef USE_SDL3 +#include +#else #include +#endif /* Packed Pipeline States */ diff --git a/src/FNA3D_Tracing.c b/src/FNA3D_Tracing.c index 7af9ba7a..f15c17ea 100644 --- a/src/FNA3D_Tracing.c +++ b/src/FNA3D_Tracing.c @@ -29,7 +29,11 @@ #include "mojoshader.h" #include "FNA3D_Tracing.h" +#ifdef USE_SDL3 +#include +#else #include +#endif static const uint8_t MARK_CREATEDEVICE = 0; static const uint8_t MARK_DESTROYDEVICE = 1;