From 30d554e3d6a258f0e17cec41f34fc301634d1875 Mon Sep 17 00:00:00 2001 From: Sam Lantinga Date: Sat, 19 Aug 2017 03:07:44 -0700 Subject: [PATCH] Fixed building SDL applications with Visual Studio and the clang toolset Also fixed building 64-bit SDL with clang. 32-bit doesn't build because of the inline assembly for C runtime support. --- include/SDL_atomic.h | 2 +- include/SDL_config_windows.h | 2 +- include/SDL_cpuinfo.h | 7 +++++++ src/render/direct3d/SDL_render_d3d.c | 3 ++- 4 files changed, 11 insertions(+), 3 deletions(-) diff --git a/include/SDL_atomic.h b/include/SDL_atomic.h index b7c9de237a766..36e37f3b78684 100644 --- a/include/SDL_atomic.h +++ b/include/SDL_atomic.h @@ -118,7 +118,7 @@ extern DECLSPEC void SDLCALL SDL_AtomicUnlock(SDL_SpinLock *lock); * The compiler barrier prevents the compiler from reordering * reads and writes to globally visible variables across the call. */ -#if defined(_MSC_VER) && (_MSC_VER > 1200) +#if defined(_MSC_VER) && (_MSC_VER > 1200) && !defined(__clang__) void _ReadWriteBarrier(void); #pragma intrinsic(_ReadWriteBarrier) #define SDL_CompilerBarrier() _ReadWriteBarrier() diff --git a/include/SDL_config_windows.h b/include/SDL_config_windows.h index 007e11cbabb90..e29a2efb58901 100644 --- a/include/SDL_config_windows.h +++ b/include/SDL_config_windows.h @@ -157,7 +157,7 @@ typedef unsigned int uintptr_t; /* Enable various audio drivers */ #define SDL_AUDIO_DRIVER_WASAPI 1 #define SDL_AUDIO_DRIVER_DSOUND 1 -#define SDL_AUDIO_DRIVER_XAUDIO2 1 +#define SDL_AUDIO_DRIVER_XAUDIO2 0 #define SDL_AUDIO_DRIVER_WINMM 1 #define SDL_AUDIO_DRIVER_DISK 1 #define SDL_AUDIO_DRIVER_DUMMY 1 diff --git a/include/SDL_cpuinfo.h b/include/SDL_cpuinfo.h index 25e2ff4f61902..94b64b03bc5dd 100644 --- a/include/SDL_cpuinfo.h +++ b/include/SDL_cpuinfo.h @@ -33,6 +33,12 @@ /* Need to do this here because intrin.h has C++ code in it */ /* Visual Studio 2005 has a bug where intrin.h conflicts with winnt.h */ #if defined(_MSC_VER) && (_MSC_VER >= 1500) && (defined(_M_IX86) || defined(_M_X64)) +#ifdef __clang__ +/* Many of the intrinsics SDL uses are not implemented by clang with Visual Studio */ +#undef __MMX__ +#undef __SSE__ +#undef __SSE2__ +#else #include #ifndef _WIN64 #define __MMX__ @@ -40,6 +46,7 @@ #endif #define __SSE__ #define __SSE2__ +#endif /* __clang__ */ #elif defined(__MINGW64_VERSION_MAJOR) #include #else diff --git a/src/render/direct3d/SDL_render_d3d.c b/src/render/direct3d/SDL_render_d3d.c index ec0786e023ac8..c40f699bb8eb0 100644 --- a/src/render/direct3d/SDL_render_d3d.c +++ b/src/render/direct3d/SDL_render_d3d.c @@ -761,6 +761,7 @@ D3D_CreateRenderer(SDL_Window * window, Uint32 flags) const char *error = (const char *)pErrorMsgs->lpVtbl->GetBufferPointer(pErrorMsgs); SDL_SetError("Couldn't assemble shader: %s", error); } + if (shader_data != NULL) #else const DWORD shader_data[] = { 0xffff0200, 0x05000051, 0xa00f0000, 0xbd808081, 0xbf008081, 0xbf008081, @@ -780,7 +781,7 @@ D3D_CreateRenderer(SDL_Window * window, Uint32 flags) 0x80e40000, 0x0000ffff }; #endif - if (shader_data != NULL) { + { result = IDirect3DDevice9_CreatePixelShader(data->device, shader_data, &data->ps_yuv); if (!FAILED(result)) { renderer->info.texture_formats[renderer->info.num_texture_formats++] = SDL_PIXELFORMAT_YV12;