diff --git a/libxenia-base.vcxproj b/libxenia-base.vcxproj
index 2478743c4..b78d7b4d9 100644
--- a/libxenia-base.vcxproj
+++ b/libxenia-base.vcxproj
@@ -17,6 +17,7 @@
+
@@ -45,6 +46,7 @@
+
@@ -141,4 +143,4 @@
-
+
\ No newline at end of file
diff --git a/libxenia-base.vcxproj.filters b/libxenia-base.vcxproj.filters
index 56e89f7a2..54bd9ed4a 100644
--- a/libxenia-base.vcxproj.filters
+++ b/libxenia-base.vcxproj.filters
@@ -54,6 +54,9 @@
src\xenia\base
+
+ src\xenia\base
+
@@ -119,5 +122,8 @@
src\xenia\base
+
+ src\xenia\base
+
-
+
\ No newline at end of file
diff --git a/src/xenia/apu/audio_system.h b/src/xenia/apu/audio_system.h
index 91a6b7f8f..47e248e1f 100644
--- a/src/xenia/apu/audio_system.h
+++ b/src/xenia/apu/audio_system.h
@@ -17,6 +17,8 @@
#include "xenia/emulator.h"
#include "xenia/xbox.h"
+typedef void* HANDLE;
+
namespace xe {
namespace kernel {
class XHostThread;
diff --git a/src/xenia/apu/xaudio2/xaudio2_audio_driver.cc b/src/xenia/apu/xaudio2/xaudio2_audio_driver.cc
index 7ed03bd1f..8d37a03a2 100644
--- a/src/xenia/apu/xaudio2/xaudio2_audio_driver.cc
+++ b/src/xenia/apu/xaudio2/xaudio2_audio_driver.cc
@@ -9,6 +9,8 @@
#include "xenia/apu/xaudio2/xaudio2_audio_driver.h"
+// Must be included before xaudio2.h so we get the right windows.h include.
+#include "xenia/base/platform_win.h"
#include
#include "xenia/apu/apu_flags.h"
diff --git a/src/xenia/base/atomic.h b/src/xenia/base/atomic.h
index c9878d3c2..d122cbf80 100644
--- a/src/xenia/base/atomic.h
+++ b/src/xenia/base/atomic.h
@@ -60,39 +60,40 @@ inline bool atomic_cas(int64_t old_value, int64_t new_value,
#elif XE_PLATFORM_WIN32
inline int32_t atomic_inc(volatile int32_t* value) {
- return InterlockedIncrement(reinterpret_cast(value));
+ return _InterlockedIncrement(reinterpret_cast(value));
}
inline int32_t atomic_dec(volatile int32_t* value) {
- return InterlockedDecrement(reinterpret_cast(value));
+ return _InterlockedDecrement(reinterpret_cast(value));
}
inline int32_t atomic_exchange(int32_t new_value, volatile int32_t* value) {
- return InterlockedExchange(reinterpret_cast(value),
- new_value);
+ return _InterlockedExchange(reinterpret_cast(value),
+ new_value);
}
inline int64_t atomic_exchange(int64_t new_value, volatile int64_t* value) {
- return InterlockedExchange64(reinterpret_cast(value),
- new_value);
+ return _InterlockedExchange64(reinterpret_cast(value),
+ new_value);
}
inline int32_t atomic_exchange_add(int32_t amount, volatile int32_t* value) {
- return InterlockedExchangeAdd(reinterpret_cast(value),
- amount);
+ return _InterlockedExchangeAdd(reinterpret_cast(value),
+ amount);
}
inline int64_t atomic_exchange_add(int64_t amount, volatile int64_t* value) {
- return InterlockedExchangeAdd64(reinterpret_cast(value),
- amount);
+ return _InterlockedExchangeAdd64(reinterpret_cast(value),
+ amount);
}
inline bool atomic_cas(int32_t old_value, int32_t new_value,
volatile int32_t* value) {
- return InterlockedCompareExchange(reinterpret_cast(value),
- new_value, old_value) == old_value;
+ return _InterlockedCompareExchange(reinterpret_cast(value),
+ new_value, old_value) == old_value;
}
inline bool atomic_cas(int64_t old_value, int64_t new_value,
volatile int64_t* value) {
- return InterlockedCompareExchange64(reinterpret_cast(value),
- new_value, old_value) == old_value;
+ return _InterlockedCompareExchange64(
+ reinterpret_cast(value), new_value,
+ old_value) == old_value;
}
#elif XE_PLATFORM_LINUX
diff --git a/src/xenia/base/clock.cc b/src/xenia/base/clock.cc
index d2c079795..cf60aa9ea 100644
--- a/src/xenia/base/clock.cc
+++ b/src/xenia/base/clock.cc
@@ -13,7 +13,6 @@
#include
#include "xenia/base/assert.h"
-#include "xenia/base/platform.h"
namespace xe {
@@ -48,31 +47,6 @@ void UpdateGuestClock() {
guest_time_filetime_ += (guest_tick_delta * 10000000) / guest_tick_frequency_;
}
-uint64_t Clock::host_tick_frequency() {
- static LARGE_INTEGER frequency = {0};
- if (!frequency.QuadPart) {
- QueryPerformanceFrequency(&frequency);
- }
- return frequency.QuadPart;
-}
-
-uint64_t Clock::QueryHostTickCount() {
- LARGE_INTEGER counter;
- uint64_t time = 0;
- if (QueryPerformanceCounter(&counter)) {
- time = counter.QuadPart;
- }
- return time;
-}
-
-uint64_t Clock::QueryHostSystemTime() {
- FILETIME t;
- GetSystemTimeAsFileTime(&t);
- return (uint64_t(t.dwHighDateTime) << 32) | t.dwLowDateTime;
-}
-
-uint32_t Clock::QueryHostUptimeMillis() { return ::GetTickCount(); }
-
double Clock::guest_time_scalar() { return guest_time_scalar_; }
void Clock::set_guest_time_scalar(double scalar) {
diff --git a/src/xenia/base/clock_win.cc b/src/xenia/base/clock_win.cc
new file mode 100644
index 000000000..a9bf53eb5
--- /dev/null
+++ b/src/xenia/base/clock_win.cc
@@ -0,0 +1,41 @@
+/**
+ ******************************************************************************
+ * Xenia : Xbox 360 Emulator Research Project *
+ ******************************************************************************
+ * Copyright 2015 Ben Vanik. All rights reserved. *
+ * Released under the BSD license - see LICENSE in the root for more details. *
+ ******************************************************************************
+ */
+
+#include "xenia/base/clock.h"
+
+#include "xenia/base/platform_win.h"
+
+namespace xe {
+
+uint64_t Clock::host_tick_frequency() {
+ static LARGE_INTEGER frequency = {0};
+ if (!frequency.QuadPart) {
+ QueryPerformanceFrequency(&frequency);
+ }
+ return frequency.QuadPart;
+}
+
+uint64_t Clock::QueryHostTickCount() {
+ LARGE_INTEGER counter;
+ uint64_t time = 0;
+ if (QueryPerformanceCounter(&counter)) {
+ time = counter.QuadPart;
+ }
+ return time;
+}
+
+uint64_t Clock::QueryHostSystemTime() {
+ FILETIME t;
+ GetSystemTimeAsFileTime(&t);
+ return (uint64_t(t.dwHighDateTime) << 32) | t.dwLowDateTime;
+}
+
+uint32_t Clock::QueryHostUptimeMillis() { return ::GetTickCount(); }
+
+} // namespace xe
diff --git a/src/xenia/base/debugging_win.cc b/src/xenia/base/debugging_win.cc
index ab0aaff05..d6b468772 100644
--- a/src/xenia/base/debugging_win.cc
+++ b/src/xenia/base/debugging_win.cc
@@ -9,7 +9,7 @@
#include "xenia/base/debugging.h"
-#include "xenia/base/platform.h"
+#include "xenia/base/platform_win.h"
#include "xenia/base/string_buffer.h"
namespace xe {
diff --git a/src/xenia/base/filesystem_win.cc b/src/xenia/base/filesystem_win.cc
index cbf0c4dbf..afa010bc2 100644
--- a/src/xenia/base/filesystem_win.cc
+++ b/src/xenia/base/filesystem_win.cc
@@ -11,7 +11,7 @@
#include
-#include "xenia/base/platform.h"
+#include "xenia/base/platform_win.h"
namespace xe {
namespace filesystem {
diff --git a/src/xenia/base/logging.cc b/src/xenia/base/logging.cc
index 728ba282a..f3630be38 100644
--- a/src/xenia/base/logging.cc
+++ b/src/xenia/base/logging.cc
@@ -11,12 +11,19 @@
#include
+#include
#include
#include "xenia/base/main.h"
#include "xenia/base/math.h"
#include "xenia/base/threading.h"
+// For MessageBox:
+// TODO(benvanik): generic API? logging_win.cc?
+#if XE_PLATFORM_WIN32
+#include "xenia/base/platform_win.h"
+#endif // XE_PLATFORM_WIN32
+
DEFINE_bool(fast_stdout, false,
"Don't lock around stdout/stderr. May introduce weirdness.");
DEFINE_bool(flush_stdout, true, "Flush stdout after each log line.");
diff --git a/src/xenia/base/main_win.cc b/src/xenia/base/main_win.cc
index 43595a76e..9227f2152 100644
--- a/src/xenia/base/main_win.cc
+++ b/src/xenia/base/main_win.cc
@@ -13,6 +13,7 @@
#include
#include
+#include "xenia/base/platform_win.h"
#include "xenia/base/string.h"
namespace xe {
diff --git a/src/xenia/base/mapped_memory_win.cc b/src/xenia/base/mapped_memory_win.cc
index 52c1e2b6e..d568ae6eb 100644
--- a/src/xenia/base/mapped_memory_win.cc
+++ b/src/xenia/base/mapped_memory_win.cc
@@ -15,7 +15,7 @@
#include "xenia/base/logging.h"
#include "xenia/base/math.h"
-#include "xenia/base/platform.h"
+#include "xenia/base/platform_win.h"
namespace xe {
diff --git a/src/xenia/base/math.h b/src/xenia/base/math.h
index ceda84708..0bf11e7af 100644
--- a/src/xenia/base/math.h
+++ b/src/xenia/base/math.h
@@ -72,27 +72,27 @@ inline uint8_t lzcnt(uint32_t v) { return static_cast(__lzcnt(v)); }
inline uint8_t lzcnt(uint64_t v) { return static_cast(__lzcnt64(v)); }
#else
inline uint8_t lzcnt(uint8_t v) {
- DWORD index;
- DWORD mask = v;
- BOOLEAN is_nonzero = _BitScanReverse(&index, mask);
+ unsigned long index;
+ unsigned long mask = v;
+ unsigned char is_nonzero = _BitScanReverse(&index, mask);
return static_cast(is_nonzero ? int8_t(index) ^ 0x7 : 8);
}
inline uint8_t lzcnt(uint16_t v) {
- DWORD index;
- DWORD mask = v;
- BOOLEAN is_nonzero = _BitScanReverse(&index, mask);
+ unsigned long index;
+ unsigned long mask = v;
+ unsigned char is_nonzero = _BitScanReverse(&index, mask);
return static_cast(is_nonzero ? int8_t(index) ^ 0xF : 16);
}
inline uint8_t lzcnt(uint32_t v) {
- DWORD index;
- DWORD mask = v;
- BOOLEAN is_nonzero = _BitScanReverse(&index, mask);
+ unsigned long index;
+ unsigned long mask = v;
+ unsigned char is_nonzero = _BitScanReverse(&index, mask);
return static_cast(is_nonzero ? int8_t(index) ^ 0x1F : 32);
}
inline uint8_t lzcnt(uint64_t v) {
- DWORD index;
- DWORD64 mask = v;
- BOOLEAN is_nonzero = _BitScanReverse64(&index, mask);
+ unsigned long index;
+ unsigned long long mask = v;
+ unsigned char is_nonzero = _BitScanReverse64(&index, mask);
return static_cast(is_nonzero ? int8_t(index) ^ 0x3F : 64);
}
#endif // LZCNT supported
diff --git a/src/xenia/base/memory.h b/src/xenia/base/memory.h
index 210a9c069..45f6b3422 100644
--- a/src/xenia/base/memory.h
+++ b/src/xenia/base/memory.h
@@ -28,8 +28,6 @@ size_t hash_combine(size_t seed, const T& v, const Ts&... vs) {
return hash_combine(seed, vs...);
}
-size_t page_size();
-
constexpr void* low_address(void* address) {
return (void*)(uint64_t(address) & 0xFFFFFFFF);
}
diff --git a/src/xenia/base/memory_generic.cc b/src/xenia/base/memory_generic.cc
index 2e4d28a80..4be51adb0 100644
--- a/src/xenia/base/memory_generic.cc
+++ b/src/xenia/base/memory_generic.cc
@@ -11,26 +11,8 @@
#include
-#if !XE_PLATFORM_WIN32
-#include
-#endif // !XE_PLATFORM_WIN32
-
namespace xe {
-size_t page_size() {
- static size_t value = 0;
- if (!value) {
-#if XE_PLATFORM_WIN32
- SYSTEM_INFO si;
- GetSystemInfo(&si);
- value = si.dwAllocationGranularity;
-#else
- value = getpagesize();
-#endif // XE_PLATFORM_WIN32
- }
- return value;
-}
-
// TODO(benvanik): fancy AVX versions.
// http://gnuradio.org/redmine/projects/gnuradio/repository/revisions/cb32b70b79f430456208a2cd521d028e0ece5d5b/entry/volk/kernels/volk/volk_16u_byteswap.h
// http://gnuradio.org/redmine/projects/gnuradio/repository/revisions/f2bc76cc65ffba51a141950f98e75364e49df874/entry/volk/kernels/volk/volk_32u_byteswap.h
diff --git a/src/xenia/base/mutex.h b/src/xenia/base/mutex.h
index 0368e6a46..61d7eca74 100644
--- a/src/xenia/base/mutex.h
+++ b/src/xenia/base/mutex.h
@@ -14,7 +14,7 @@
#include
#include
-#include "xenia/base/platform.h"
+#include "xenia/base/platform_win.h"
namespace xe {
diff --git a/src/xenia/base/platform.h b/src/xenia/base/platform.h
index a2960bd47..9c4fcbba8 100644
--- a/src/xenia/base/platform.h
+++ b/src/xenia/base/platform.h
@@ -10,9 +10,15 @@
#ifndef XENIA_BASE_PLATFORM_H_
#define XENIA_BASE_PLATFORM_H_
+// This file contains the main platform switches used by xenia as well as any
+// fixups required to normalize the environment. Everything in here should be
+// largely portable.
+// Platform-specific headers, like platform_win.h, are used to house any
+// super platform-specific stuff that implies code is not platform-agnostic.
+//
// NOTE: ordering matters here as sometimes multiple flags are defined on
// certain platforms.
-
+//
// Great resource on predefined macros: http://predef.sourceforge.net/preos.html
#if defined(__APPLE__)
@@ -42,25 +48,12 @@
#endif
#if XE_PLATFORM_WIN32
-#ifndef WIN32_LEAN_AND_MEAN
-#define WIN32_LEAN_AND_MEAN
-#endif
-#define NOMINMAX
-#include
-#include
-#include
-#include
-#include
-#include
-#include
-#include
-#include
#define strdup _strdup
#define strcasecmp _stricmp
#define strncasecmp _strnicmp
-#undef DeleteBitmap
-#undef GetFirstChild
-#endif // XE_PLATFORM_WIN32
+#define WIN32_LEAN_AND_MEAN
+#define NOMINMAX // Don't want windows.h including min/max macros.
+#endif // XE_PLATFORM_WIN32
#if XE_COMPILER_MSVC
#include
@@ -73,15 +66,19 @@ namespace xe {
#if XE_PLATFORM_WIN32
const char path_separator = '\\';
const wchar_t wpath_separator = L'\\';
-const size_t max_path = _MAX_PATH;
+const size_t max_path = 260; // _MAX_PATH
#else
const char path_separator = '/';
const wchar_t wpath_separator = L'/';
const size_t max_path = 1024; // PATH_MAX
#endif // XE_PLATFORM_WIN32
+// Launches a web browser to the given URL.
void LaunchBrowser(const char* url);
+// Returns the native page size of the system, in bytes.
+size_t page_size();
+
} // namespace xe
#endif // XENIA_BASE_PLATFORM_H_
diff --git a/src/xenia/base/platform_win.cc b/src/xenia/base/platform_win.cc
index 566a96193..b363edd61 100644
--- a/src/xenia/base/platform_win.cc
+++ b/src/xenia/base/platform_win.cc
@@ -7,10 +7,20 @@
******************************************************************************
*/
-#include "xenia/base/platform.h"
+#include "xenia/base/platform_win.h"
namespace xe {
+size_t page_size() {
+ static size_t value = 0;
+ if (!value) {
+ SYSTEM_INFO si;
+ GetSystemInfo(&si);
+ value = si.dwAllocationGranularity;
+ }
+ return value;
+}
+
void LaunchBrowser(const char* url) {
ShellExecuteA(NULL, "open", url, NULL, NULL, SW_SHOWNORMAL);
}
diff --git a/src/xenia/base/platform_win.h b/src/xenia/base/platform_win.h
new file mode 100644
index 000000000..ff423e5af
--- /dev/null
+++ b/src/xenia/base/platform_win.h
@@ -0,0 +1,36 @@
+/**
+ ******************************************************************************
+ * Xenia : Xbox 360 Emulator Research Project *
+ ******************************************************************************
+ * Copyright 2015 Ben Vanik. All rights reserved. *
+ * Released under the BSD license - see LICENSE in the root for more details. *
+ ******************************************************************************
+ */
+
+#ifndef XENIA_BASE_PLATFORM_WIN_H_
+#define XENIA_BASE_PLATFORM_WIN_H_
+
+// NOTE: if you're including this file it means you are explicitly depending
+// on Windows-specific headers. This is bad for portability and should be
+// avoided!
+
+#include "xenia/base/platform.h"
+
+#ifndef WIN32_LEAN_AND_MEAN
+#define WIN32_LEAN_AND_MEAN
+#endif
+#define NOMINMAX
+#include
+#include
+#include
+#include
+#include
+#include
+#include
+#include
+#include
+#undef DeleteBitmap
+#undef DeleteFile
+#undef GetFirstChild
+
+#endif // XENIA_BASE_PLATFORM_WIN_H_
diff --git a/src/xenia/base/threading_win.cc b/src/xenia/base/threading_win.cc
index f8546f099..1a7019e28 100644
--- a/src/xenia/base/threading_win.cc
+++ b/src/xenia/base/threading_win.cc
@@ -9,7 +9,7 @@
#include "xenia/base/threading.h"
-#include "xenia/base/platform.h"
+#include "xenia/base/platform_win.h"
namespace xe {
namespace threading {
diff --git a/src/xenia/cpu/backend/x64/x64_code_cache.h b/src/xenia/cpu/backend/x64/x64_code_cache.h
index e351d3f79..5074efb14 100644
--- a/src/xenia/cpu/backend/x64/x64_code_cache.h
+++ b/src/xenia/cpu/backend/x64/x64_code_cache.h
@@ -16,7 +16,7 @@
#include
#include "xenia/base/mutex.h"
-#include "xenia/base/platform.h"
+#include "xenia/base/platform_win.h"
#include "xenia/cpu/backend/code_cache.h"
namespace xe {
diff --git a/src/xenia/hid/winkey/winkey_input_driver.cc b/src/xenia/hid/winkey/winkey_input_driver.cc
index 7c8e2412a..fddb77b9e 100644
--- a/src/xenia/hid/winkey/winkey_input_driver.cc
+++ b/src/xenia/hid/winkey/winkey_input_driver.cc
@@ -9,6 +9,7 @@
#include "xenia/hid/winkey/winkey_input_driver.h"
+#include "xenia/base/platform_win.h"
#include "xenia/hid/hid_flags.h"
namespace xe {
diff --git a/src/xenia/hid/xinput/xinput_input_driver.cc b/src/xenia/hid/xinput/xinput_input_driver.cc
index be0d31069..483569253 100644
--- a/src/xenia/hid/xinput/xinput_input_driver.cc
+++ b/src/xenia/hid/xinput/xinput_input_driver.cc
@@ -9,6 +9,8 @@
#include "xenia/hid/xinput/xinput_input_driver.h"
+// Must be included before xinput.h to avoid windows.h conflicts:
+#include "xenia/base/platform_win.h"
#include
#include "xenia/hid/hid_flags.h"
diff --git a/src/xenia/kernel/objects/xevent.h b/src/xenia/kernel/objects/xevent.h
index 9def93869..2071851d2 100644
--- a/src/xenia/kernel/objects/xevent.h
+++ b/src/xenia/kernel/objects/xevent.h
@@ -10,6 +10,7 @@
#ifndef XENIA_KERNEL_XBOXKRNL_XEVENT_H_
#define XENIA_KERNEL_XBOXKRNL_XEVENT_H_
+#include "xenia/base/platform_win.h"
#include "xenia/kernel/xobject.h"
#include "xenia/xbox.h"
diff --git a/src/xenia/kernel/objects/xmutant.h b/src/xenia/kernel/objects/xmutant.h
index 359970209..f72752b8d 100644
--- a/src/xenia/kernel/objects/xmutant.h
+++ b/src/xenia/kernel/objects/xmutant.h
@@ -10,6 +10,7 @@
#ifndef XENIA_KERNEL_XBOXKRNL_XMUTANT_H_
#define XENIA_KERNEL_XBOXKRNL_XMUTANT_H_
+#include "xenia/base/platform_win.h"
#include "xenia/kernel/xobject.h"
#include "xenia/xbox.h"
diff --git a/src/xenia/kernel/objects/xsemaphore.h b/src/xenia/kernel/objects/xsemaphore.h
index 97dbc7942..ae3eff029 100644
--- a/src/xenia/kernel/objects/xsemaphore.h
+++ b/src/xenia/kernel/objects/xsemaphore.h
@@ -10,6 +10,7 @@
#ifndef XENIA_KERNEL_XBOXKRNL_XSEMAPHORE_H_
#define XENIA_KERNEL_XBOXKRNL_XSEMAPHORE_H_
+#include "xenia/base/platform_win.h"
#include "xenia/kernel/xobject.h"
#include "xenia/xbox.h"
diff --git a/src/xenia/kernel/objects/xtimer.h b/src/xenia/kernel/objects/xtimer.h
index c949f020d..4203d7dc0 100644
--- a/src/xenia/kernel/objects/xtimer.h
+++ b/src/xenia/kernel/objects/xtimer.h
@@ -10,6 +10,7 @@
#ifndef XENIA_KERNEL_XBOXKRNL_XTIMER_H_
#define XENIA_KERNEL_XBOXKRNL_XTIMER_H_
+#include "xenia/base/platform_win.h"
#include "xenia/kernel/xobject.h"
#include "xenia/xbox.h"
diff --git a/src/xenia/memory.h b/src/xenia/memory.h
index da6cf340c..7fcc697ff 100644
--- a/src/xenia/memory.h
+++ b/src/xenia/memory.h
@@ -17,7 +17,7 @@
#include
#include "xenia/base/mutex.h"
-#include "xenia/base/platform.h"
+#include "xenia/base/platform_win.h"
#include "xenia/cpu/mmio_handler.h"
namespace xe {
diff --git a/src/xenia/ui/file_picker_win.cc b/src/xenia/ui/file_picker_win.cc
index eab1c0e92..d66c22469 100644
--- a/src/xenia/ui/file_picker_win.cc
+++ b/src/xenia/ui/file_picker_win.cc
@@ -9,8 +9,8 @@
#include "xenia/ui/file_picker.h"
-#include "xenia/base/platform.h"
#include "xenia/base/assert.h"
+#include "xenia/base/platform_win.h"
namespace xe {
namespace ui {
diff --git a/src/xenia/ui/gl/gl.h b/src/xenia/ui/gl/gl.h
index 4352ca8b3..549582153 100644
--- a/src/xenia/ui/gl/gl.h
+++ b/src/xenia/ui/gl/gl.h
@@ -13,9 +13,15 @@
#include "xenia/base/platform.h"
#include "third_party/GL/glew.h"
-#include "third_party/GL/wglew.h"
extern "C" GLEWContext* glewGetContext();
+
+#if XE_PLATFORM_WIN32
+// We avoid including wglew.h here as it includes windows.h and pollutes the
+// global namespace. As we don't need wglew most places we only do that as
+// required.
+typedef struct WGLEWContextStruct WGLEWContext;
extern "C" WGLEWContext* wglewGetContext();
+#endif // XE_PLATFORM_WIN32
#endif // XENIA_UI_GL_GL_H_
diff --git a/src/xenia/ui/gl/gl_context.cc b/src/xenia/ui/gl/gl_context.cc
index 88a7f4d29..0ba7fb2c4 100644
--- a/src/xenia/ui/gl/gl_context.cc
+++ b/src/xenia/ui/gl/gl_context.cc
@@ -20,6 +20,10 @@
#include "xenia/ui/gl/gl4_elemental_renderer.h"
#include "xenia/ui/window.h"
+// TODO(benvanik): move win32 code to _win?
+#include "xenia/base/platform_win.h"
+#include "third_party/GL/wglew.h"
+
DEFINE_bool(thread_safe_gl, false,
"Only allow one GL context to be active at a time.");
@@ -52,11 +56,16 @@ std::unique_ptr GLContext::Create(Window* target_window) {
return context;
}
-GLContext::GLContext(Window* target_window) : GraphicsContext(target_window) {}
+GLContext::GLContext(Window* target_window) : GraphicsContext(target_window) {
+ glew_context_.reset(new GLEWContext());
+ wglew_context_.reset(new WGLEWContext());
+}
GLContext::GLContext(Window* target_window, HGLRC glrc)
: GraphicsContext(target_window), glrc_(glrc) {
dc_ = GetDC(HWND(target_window_->native_handle()));
+ glew_context_.reset(new GLEWContext());
+ wglew_context_.reset(new WGLEWContext());
}
GLContext::~GLContext() {
@@ -100,8 +109,8 @@ bool GLContext::Initialize(Window* target_window) {
}
wglMakeCurrent(dc_, temp_context);
- tls_glew_context_ = &glew_context_;
- tls_wglew_context_ = &wglew_context_;
+ tls_glew_context_ = glew_context_.get();
+ tls_wglew_context_ = wglew_context_.get();
glewExperimental = GL_TRUE;
if (glewInit() != GLEW_OK) {
XELOGE("Unable to initialize GLEW");
@@ -403,8 +412,8 @@ bool GLContext::MakeCurrent() {
XELOGE("Unable to make GL context current");
return false;
}
- tls_glew_context_ = &glew_context_;
- tls_wglew_context_ = &wglew_context_;
+ tls_glew_context_ = glew_context_.get();
+ tls_wglew_context_ = wglew_context_.get();
return true;
}
diff --git a/src/xenia/ui/gl/gl_context.h b/src/xenia/ui/gl/gl_context.h
index 17b3b275b..1c140def5 100644
--- a/src/xenia/ui/gl/gl_context.h
+++ b/src/xenia/ui/gl/gl_context.h
@@ -20,6 +20,10 @@
DECLARE_bool(thread_safe_gl);
+// TODO(benvanik): hide Win32 stuff.
+typedef struct HDC__* HDC;
+typedef struct HGLRC__* HGLRC;
+
namespace xe {
namespace ui {
namespace gl {
@@ -61,8 +65,8 @@ class GLContext : public GraphicsContext {
HDC dc_ = nullptr;
HGLRC glrc_ = nullptr;
- GLEWContext glew_context_;
- WGLEWContext wglew_context_;
+ std::unique_ptr glew_context_;
+ std::unique_ptr wglew_context_;
Blitter blitter_;
};
diff --git a/src/xenia/ui/window_win.cc b/src/xenia/ui/window_win.cc
index e99ef2303..44832b1b2 100644
--- a/src/xenia/ui/window_win.cc
+++ b/src/xenia/ui/window_win.cc
@@ -11,6 +11,7 @@
#include "xenia/base/assert.h"
#include "xenia/base/logging.h"
+#include "xenia/base/platform_win.h"
#include "xenia/ui/window_win.h"
namespace xe {