460 lines
15 KiB
C++
460 lines
15 KiB
C++
|
#include <kinc/graphics4/graphics.h>
|
||
|
#include <kinc/input/gamepad.h>
|
||
|
#include <kinc/input/keyboard.h>
|
||
|
#include <kinc/input/mouse.h>
|
||
|
#include <kinc/system.h>
|
||
|
#include <kinc/threads/thread.h>
|
||
|
#include <kinc/video.h>
|
||
|
#include <kinc/window.h>
|
||
|
|
||
|
#define WIN32_LEAN_AND_MEAN
|
||
|
#define NOMINMAX
|
||
|
#include <windows.h>
|
||
|
#ifndef XINPUT
|
||
|
#ifdef KINC_WINDOWS
|
||
|
#define XINPUT 1
|
||
|
#endif
|
||
|
|
||
|
#ifdef KINC_WINDOWSAPP
|
||
|
#define XINPUT !(WINAPI_PARTITION_PHONE_APP)
|
||
|
#endif
|
||
|
#endif
|
||
|
#if XINPUT
|
||
|
#include <Xinput.h>
|
||
|
#endif
|
||
|
|
||
|
#include <d3d11_1.h>
|
||
|
#include <d3d11_4.h>
|
||
|
#include <dxgi1_5.h>
|
||
|
#include <wrl.h>
|
||
|
|
||
|
#ifdef KINC_WINDOWSAPP
|
||
|
using namespace ::Microsoft::WRL;
|
||
|
using namespace Windows::UI::Core;
|
||
|
using namespace Windows::Foundation;
|
||
|
#ifdef KINC_HOLOLENS
|
||
|
using namespace Windows::Graphics::Holographic;
|
||
|
using namespace Windows::Graphics::DirectX::Direct3D11;
|
||
|
#endif
|
||
|
#endif
|
||
|
|
||
|
extern "C" IUnknown *kinc_winapp_internal_get_window(void) {
|
||
|
return reinterpret_cast<IUnknown *>(CoreWindow::GetForCurrentThread());
|
||
|
}
|
||
|
|
||
|
extern "C" void kinc_internal_uwp_installed_location_path(char *path) {
|
||
|
Platform::String ^ locationString = Windows::ApplicationModel::Package::Current->InstalledLocation->Path;
|
||
|
WideCharToMultiByte(CP_UTF8, 0, locationString->Begin(), -1, path, 1000, nullptr, nullptr);
|
||
|
}
|
||
|
|
||
|
ref class Win8Application sealed : public Windows::ApplicationModel::Core::IFrameworkView {
|
||
|
public:
|
||
|
Win8Application();
|
||
|
virtual void Initialize(Windows::ApplicationModel::Core::CoreApplicationView ^ applicationView);
|
||
|
virtual void SetWindow(Windows::UI::Core::CoreWindow ^ window);
|
||
|
virtual void Load(Platform::String ^ entryPoint);
|
||
|
virtual void Run();
|
||
|
virtual void Uninitialize();
|
||
|
|
||
|
protected:
|
||
|
void OnWindowSizeChanged(Windows::UI::Core::CoreWindow ^ sender, Windows::UI::Core::WindowSizeChangedEventArgs ^ args);
|
||
|
// void OnLogicalDpiChanged(Platform::Object^ sender);
|
||
|
void OnActivated(Windows::ApplicationModel::Core::CoreApplicationView ^ applicationView, Windows::ApplicationModel::Activation::IActivatedEventArgs ^ args);
|
||
|
void OnSuspending(Platform::Object ^ sender, Windows::ApplicationModel::SuspendingEventArgs ^ args);
|
||
|
void OnResuming(Platform::Object ^ sender, Platform::Object ^ args);
|
||
|
void OnWindowClosed(Windows::UI::Core::CoreWindow ^ sender, Windows::UI::Core::CoreWindowEventArgs ^ args);
|
||
|
void OnPointerPressed(Windows::UI::Core::CoreWindow ^ sender, Windows::UI::Core::PointerEventArgs ^ args);
|
||
|
void OnPointerReleased(Windows::UI::Core::CoreWindow ^ sender, Windows::UI::Core::PointerEventArgs ^ args);
|
||
|
void OnPointerMoved(Windows::UI::Core::CoreWindow ^ sender, Windows::UI::Core::PointerEventArgs ^ args);
|
||
|
|
||
|
private:
|
||
|
// CubeRenderer^ m_renderer;
|
||
|
// Windows::ApplicationModel::Core::CoreApplicationView^ view;
|
||
|
bool closed;
|
||
|
void OnKeyDown(Windows::UI::Core::CoreWindow ^ sender, Windows::UI::Core::KeyEventArgs ^ args);
|
||
|
void OnKeyUp(Windows::UI::Core::CoreWindow ^ sender, Windows::UI::Core::KeyEventArgs ^ args);
|
||
|
};
|
||
|
|
||
|
ref class Win8ApplicationSource : Windows::ApplicationModel::Core::IFrameworkViewSource {
|
||
|
public:
|
||
|
virtual Windows::ApplicationModel::Core::IFrameworkView ^ CreateView();
|
||
|
};
|
||
|
|
||
|
namespace {
|
||
|
int mouseX, mouseY;
|
||
|
float axes[12 * 6];
|
||
|
float buttons[12 * 16];
|
||
|
}
|
||
|
|
||
|
using namespace Windows::ApplicationModel;
|
||
|
using namespace Windows::ApplicationModel::Core;
|
||
|
using namespace Windows::ApplicationModel::Activation;
|
||
|
using namespace Windows::UI::Core;
|
||
|
using namespace Windows::System;
|
||
|
using namespace Windows::Foundation;
|
||
|
using namespace Windows::Graphics::Display;
|
||
|
|
||
|
const char *kinc_gamepad_vendor(int gamepad) {
|
||
|
return "Microsoft";
|
||
|
}
|
||
|
|
||
|
const char *kinc_gamepad_product_name(int gamepad) {
|
||
|
return "Xbox 360 Controller";
|
||
|
}
|
||
|
|
||
|
bool kinc_internal_handle_messages(void) {
|
||
|
CoreWindow::GetForCurrentThread()->Dispatcher->ProcessEvents(CoreProcessEventsOption::ProcessAllIfPresent);
|
||
|
|
||
|
#if XINPUT
|
||
|
DWORD dwResult;
|
||
|
for (DWORD i = 0; i < XUSER_MAX_COUNT; ++i) {
|
||
|
XINPUT_STATE state;
|
||
|
ZeroMemory(&state, sizeof(XINPUT_STATE));
|
||
|
dwResult = XInputGetState(i, &state);
|
||
|
|
||
|
if (dwResult == ERROR_SUCCESS) {
|
||
|
float newaxes[6];
|
||
|
newaxes[0] = state.Gamepad.sThumbLX / 32768.0f;
|
||
|
newaxes[1] = state.Gamepad.sThumbLY / 32768.0f;
|
||
|
newaxes[2] = state.Gamepad.sThumbRX / 32768.0f;
|
||
|
newaxes[3] = state.Gamepad.sThumbRY / 32768.0f;
|
||
|
newaxes[4] = state.Gamepad.bLeftTrigger / 255.0f;
|
||
|
newaxes[5] = state.Gamepad.bRightTrigger / 255.0f;
|
||
|
for (int i2 = 0; i2 < 6; ++i2) {
|
||
|
if (axes[i * 6 + i2] != newaxes[i2]) {
|
||
|
kinc_internal_gamepad_trigger_axis(i, i2, newaxes[i2]);
|
||
|
axes[i * 6 + i2] = newaxes[i2];
|
||
|
}
|
||
|
}
|
||
|
float newbuttons[16];
|
||
|
newbuttons[0] = (state.Gamepad.wButtons & XINPUT_GAMEPAD_A) ? 1.0f : 0.0f;
|
||
|
newbuttons[1] = (state.Gamepad.wButtons & XINPUT_GAMEPAD_B) ? 1.0f : 0.0f;
|
||
|
newbuttons[2] = (state.Gamepad.wButtons & XINPUT_GAMEPAD_X) ? 1.0f : 0.0f;
|
||
|
newbuttons[3] = (state.Gamepad.wButtons & XINPUT_GAMEPAD_Y) ? 1.0f : 0.0f;
|
||
|
newbuttons[4] = (state.Gamepad.wButtons & XINPUT_GAMEPAD_LEFT_SHOULDER) ? 1.0f : 0.0f;
|
||
|
newbuttons[5] = (state.Gamepad.wButtons & XINPUT_GAMEPAD_RIGHT_SHOULDER) ? 1.0f : 0.0f;
|
||
|
newbuttons[6] = state.Gamepad.bLeftTrigger / 255.0f;
|
||
|
newbuttons[7] = state.Gamepad.bRightTrigger / 255.0f;
|
||
|
newbuttons[8] = (state.Gamepad.wButtons & XINPUT_GAMEPAD_BACK) ? 1.0f : 0.0f;
|
||
|
newbuttons[9] = (state.Gamepad.wButtons & XINPUT_GAMEPAD_START) ? 1.0f : 0.0f;
|
||
|
newbuttons[10] = (state.Gamepad.wButtons & XINPUT_GAMEPAD_LEFT_THUMB) ? 1.0f : 0.0f;
|
||
|
newbuttons[11] = (state.Gamepad.wButtons & XINPUT_GAMEPAD_RIGHT_THUMB) ? 1.0f : 0.0f;
|
||
|
newbuttons[12] = (state.Gamepad.wButtons & XINPUT_GAMEPAD_DPAD_UP) ? 1.0f : 0.0f;
|
||
|
newbuttons[13] = (state.Gamepad.wButtons & XINPUT_GAMEPAD_DPAD_DOWN) ? 1.0f : 0.0f;
|
||
|
newbuttons[14] = (state.Gamepad.wButtons & XINPUT_GAMEPAD_DPAD_LEFT) ? 1.0f : 0.0f;
|
||
|
newbuttons[15] = (state.Gamepad.wButtons & XINPUT_GAMEPAD_DPAD_RIGHT) ? 1.0f : 0.0f;
|
||
|
for (int i2 = 0; i2 < 16; ++i2) {
|
||
|
if (buttons[i * 16 + i2] != newbuttons[i2]) {
|
||
|
kinc_internal_gamepad_trigger_button(i, i2, newbuttons[i2]);
|
||
|
buttons[i * 16 + i2] = newbuttons[i2];
|
||
|
}
|
||
|
}
|
||
|
}
|
||
|
}
|
||
|
#endif
|
||
|
|
||
|
return true;
|
||
|
}
|
||
|
|
||
|
// Kore::vec2i Kore::System::mousePos() {
|
||
|
// return vec2i(mouseX, mouseY);
|
||
|
//}
|
||
|
|
||
|
#ifdef KINC_KONG
|
||
|
extern "C" void kong_init(void);
|
||
|
#endif
|
||
|
|
||
|
#undef CreateWindow
|
||
|
|
||
|
int kinc_init(const char *name, int width, int height, struct kinc_window_options *win, struct kinc_framebuffer_options *frame) {
|
||
|
kinc_window_options_t defaultWin;
|
||
|
if (win == NULL) {
|
||
|
kinc_window_options_set_defaults(&defaultWin);
|
||
|
win = &defaultWin;
|
||
|
}
|
||
|
win->width = width;
|
||
|
win->height = height;
|
||
|
|
||
|
kinc_framebuffer_options_t defaultFrame;
|
||
|
if (frame == NULL) {
|
||
|
kinc_framebuffer_options_set_defaults(&defaultFrame);
|
||
|
frame = &defaultFrame;
|
||
|
}
|
||
|
|
||
|
kinc_g4_internal_init();
|
||
|
kinc_g4_internal_init_window(0, frame->depth_bits, frame->stencil_bits, true);
|
||
|
|
||
|
#ifdef KINC_KONG
|
||
|
kong_init();
|
||
|
#endif
|
||
|
|
||
|
return 0;
|
||
|
}
|
||
|
|
||
|
void kinc_set_keep_screen_on(bool on) {}
|
||
|
|
||
|
namespace {
|
||
|
bool keyboardshown = false;
|
||
|
char language[3] = {0};
|
||
|
}
|
||
|
|
||
|
void kinc_keyboard_show() {
|
||
|
keyboardshown = true;
|
||
|
}
|
||
|
|
||
|
void kinc_keyboard_hide() {
|
||
|
keyboardshown = false;
|
||
|
}
|
||
|
|
||
|
bool kinc_keyboard_active() {
|
||
|
return keyboardshown;
|
||
|
}
|
||
|
|
||
|
void kinc_load_url(const char *url) {}
|
||
|
|
||
|
void kinc_vibrate(int ms) {}
|
||
|
|
||
|
const char *kinc_language() {
|
||
|
wchar_t wlanguage[3] = {0};
|
||
|
|
||
|
if (GetLocaleInfoEx(LOCALE_NAME_USER_DEFAULT, LOCALE_SISO639LANGNAME, wlanguage, 3)) {
|
||
|
WideCharToMultiByte(CP_UTF8, 0, wlanguage, -1, language, 3, nullptr, nullptr);
|
||
|
return language;
|
||
|
}
|
||
|
return "en";
|
||
|
}
|
||
|
|
||
|
Win8Application::Win8Application() : closed(false) {}
|
||
|
|
||
|
void Win8Application::Initialize(CoreApplicationView ^ applicationView) {
|
||
|
applicationView->Activated += ref new TypedEventHandler<CoreApplicationView ^, IActivatedEventArgs ^>(this, &Win8Application::OnActivated);
|
||
|
CoreApplication::Suspending += ref new EventHandler<SuspendingEventArgs ^>(this, &Win8Application::OnSuspending);
|
||
|
CoreApplication::Resuming += ref new EventHandler<Platform::Object ^>(this, &Win8Application::OnResuming);
|
||
|
// m_renderer = ref new CubeRenderer();
|
||
|
}
|
||
|
|
||
|
void Win8Application::SetWindow(CoreWindow ^ window) {
|
||
|
window->SizeChanged += ref new TypedEventHandler<CoreWindow ^, WindowSizeChangedEventArgs ^>(this, &Win8Application::OnWindowSizeChanged);
|
||
|
window->Closed += ref new TypedEventHandler<CoreWindow ^, CoreWindowEventArgs ^>(this, &Win8Application::OnWindowClosed);
|
||
|
window->PointerPressed += ref new TypedEventHandler<CoreWindow ^, PointerEventArgs ^>(this, &Win8Application::OnPointerPressed);
|
||
|
window->PointerReleased += ref new TypedEventHandler<CoreWindow ^, PointerEventArgs ^>(this, &Win8Application::OnPointerReleased);
|
||
|
window->PointerMoved += ref new TypedEventHandler<CoreWindow ^, PointerEventArgs ^>(this, &Win8Application::OnPointerMoved);
|
||
|
window->KeyDown +=
|
||
|
ref new Windows::Foundation::TypedEventHandler<Windows::UI::Core::CoreWindow ^, Windows::UI::Core::KeyEventArgs ^>(this, &Win8Application::OnKeyDown);
|
||
|
window->KeyUp +=
|
||
|
ref new Windows::Foundation::TypedEventHandler<Windows::UI::Core::CoreWindow ^, Windows::UI::Core::KeyEventArgs ^>(this, &Win8Application::OnKeyUp);
|
||
|
// m_renderer->Initialize(CoreWindow::GetForCurrentThread());
|
||
|
|
||
|
#ifdef KINC_HOLOLENS
|
||
|
// Create holographics space - needs to be created before window is activated
|
||
|
holographicFrameController = std::make_unique<HolographicFrameController>(window);
|
||
|
|
||
|
// create video frame processor
|
||
|
VideoFrameProcessor::createAsync().then([this](std::shared_ptr<VideoFrameProcessor> videoProcessor) { videoFrameProcessor = std::move(videoProcessor); });
|
||
|
#endif
|
||
|
}
|
||
|
|
||
|
void Win8Application::Load(Platform::String ^ entryPoint) {}
|
||
|
|
||
|
void Win8Application::Run() {
|
||
|
// BasicTimer^ timer = ref new BasicTimer();
|
||
|
kickstart(0, nullptr);
|
||
|
// while (!closed) {
|
||
|
// timer->Update();
|
||
|
|
||
|
// m_renderer->Update(timer->Total, timer->Delta);
|
||
|
// m_renderer->Render();
|
||
|
// m_renderer->Present(); // This call is synchronized to the display frame rate.
|
||
|
//}
|
||
|
}
|
||
|
|
||
|
void Win8Application::Uninitialize() {}
|
||
|
|
||
|
int kinc_uwp_window_width;
|
||
|
int kinc_uwp_window_height;
|
||
|
|
||
|
extern "C" void kinc_internal_resize(int window, int width, int height);
|
||
|
|
||
|
void Win8Application::OnWindowSizeChanged(CoreWindow ^ sender, WindowSizeChangedEventArgs ^ args) {
|
||
|
kinc_uwp_window_width = (int)args->Size.Width;
|
||
|
kinc_uwp_window_height = (int)args->Size.Height;
|
||
|
kinc_internal_resize(0, (int)args->Size.Width, (int)args->Size.Height);
|
||
|
}
|
||
|
|
||
|
void Win8Application::OnWindowClosed(CoreWindow ^ sender, CoreWindowEventArgs ^ args) {
|
||
|
closed = true;
|
||
|
}
|
||
|
|
||
|
void Win8Application::OnActivated(CoreApplicationView ^ applicationView, IActivatedEventArgs ^ args) {
|
||
|
CoreWindow::GetForCurrentThread()->Activate();
|
||
|
}
|
||
|
|
||
|
void Win8Application::OnSuspending(Platform::Object ^ sender, SuspendingEventArgs ^ args) {
|
||
|
// SuspendingDeferral^ deferral = args->SuspendingOperation->GetDeferral();
|
||
|
// deferral->Complete();
|
||
|
}
|
||
|
|
||
|
void Win8Application::OnResuming(Platform::Object ^ sender, Platform::Object ^ args) {}
|
||
|
|
||
|
void Win8Application::OnPointerPressed(Windows::UI::Core::CoreWindow ^ sender, Windows::UI::Core::PointerEventArgs ^ args) {
|
||
|
mouseX = static_cast<int>(args->CurrentPoint->Position.X);
|
||
|
mouseY = static_cast<int>(args->CurrentPoint->Position.Y);
|
||
|
kinc_internal_mouse_trigger_press(0, 0, mouseX, mouseY);
|
||
|
}
|
||
|
|
||
|
void Win8Application::OnPointerReleased(Windows::UI::Core::CoreWindow ^ sender, Windows::UI::Core::PointerEventArgs ^ args) {
|
||
|
mouseX = static_cast<int>(args->CurrentPoint->Position.X);
|
||
|
mouseY = static_cast<int>(args->CurrentPoint->Position.Y);
|
||
|
kinc_internal_mouse_trigger_release(0, 0, mouseX, mouseY);
|
||
|
}
|
||
|
|
||
|
void Win8Application::OnPointerMoved(Windows::UI::Core::CoreWindow ^ sender, Windows::UI::Core::PointerEventArgs ^ args) {
|
||
|
mouseX = static_cast<int>(args->CurrentPoint->Position.X);
|
||
|
mouseY = static_cast<int>(args->CurrentPoint->Position.Y);
|
||
|
kinc_internal_mouse_trigger_move(0, mouseX, mouseY);
|
||
|
}
|
||
|
|
||
|
void Win8Application::OnKeyDown(Windows::UI::Core::CoreWindow ^ sender, Windows::UI::Core::KeyEventArgs ^ args) {
|
||
|
switch (args->VirtualKey) {
|
||
|
case Windows::System::VirtualKey::Left:
|
||
|
kinc_internal_keyboard_trigger_key_down(KINC_KEY_LEFT);
|
||
|
break;
|
||
|
case Windows::System::VirtualKey::Right:
|
||
|
kinc_internal_keyboard_trigger_key_down(KINC_KEY_RIGHT);
|
||
|
break;
|
||
|
case Windows::System::VirtualKey::Up:
|
||
|
kinc_internal_keyboard_trigger_key_down(KINC_KEY_UP);
|
||
|
break;
|
||
|
case Windows::System::VirtualKey::Down:
|
||
|
kinc_internal_keyboard_trigger_key_down(KINC_KEY_DOWN);
|
||
|
break;
|
||
|
default:
|
||
|
if (args->VirtualKey >= Windows::System::VirtualKey::A && args->VirtualKey <= Windows::System::VirtualKey::Z) {
|
||
|
kinc_internal_keyboard_trigger_key_down((int)args->VirtualKey);
|
||
|
}
|
||
|
else if (args->VirtualKey >= Windows::System::VirtualKey::Number0 && args->VirtualKey <= Windows::System::VirtualKey::Number9) {
|
||
|
kinc_internal_keyboard_trigger_key_down((int)args->VirtualKey);
|
||
|
}
|
||
|
break;
|
||
|
}
|
||
|
}
|
||
|
|
||
|
void Win8Application::OnKeyUp(Windows::UI::Core::CoreWindow ^ sender, Windows::UI::Core::KeyEventArgs ^ args) {
|
||
|
switch (args->VirtualKey) {
|
||
|
case Windows::System::VirtualKey::Left:
|
||
|
kinc_internal_keyboard_trigger_key_up(KINC_KEY_LEFT);
|
||
|
break;
|
||
|
case Windows::System::VirtualKey::Right:
|
||
|
kinc_internal_keyboard_trigger_key_up(KINC_KEY_RIGHT);
|
||
|
break;
|
||
|
case Windows::System::VirtualKey::Up:
|
||
|
kinc_internal_keyboard_trigger_key_up(KINC_KEY_UP);
|
||
|
break;
|
||
|
case Windows::System::VirtualKey::Down:
|
||
|
kinc_internal_keyboard_trigger_key_up(KINC_KEY_DOWN);
|
||
|
break;
|
||
|
default:
|
||
|
if (args->VirtualKey >= Windows::System::VirtualKey::A && args->VirtualKey <= Windows::System::VirtualKey::Z) {
|
||
|
kinc_internal_keyboard_trigger_key_up((int)args->VirtualKey);
|
||
|
}
|
||
|
else if (args->VirtualKey >= Windows::System::VirtualKey::Number0 && args->VirtualKey <= Windows::System::VirtualKey::Number9) {
|
||
|
kinc_internal_keyboard_trigger_key_up((int)args->VirtualKey);
|
||
|
}
|
||
|
break;
|
||
|
}
|
||
|
}
|
||
|
|
||
|
IFrameworkView ^ Win8ApplicationSource::CreateView() {
|
||
|
return ref new Win8Application;
|
||
|
}
|
||
|
|
||
|
const char *kinc_internal_save_path() {
|
||
|
return "\\";
|
||
|
}
|
||
|
|
||
|
const char *kinc_system_id() {
|
||
|
return "WindowsApp";
|
||
|
}
|
||
|
|
||
|
namespace {
|
||
|
const char *videoFormats[] = {"ogv", nullptr};
|
||
|
}
|
||
|
|
||
|
const char **kinc_video_formats() {
|
||
|
return ::videoFormats;
|
||
|
}
|
||
|
|
||
|
int kinc_window_width(int window_index) {
|
||
|
return kinc_uwp_window_width;
|
||
|
}
|
||
|
|
||
|
int kinc_window_height(int window_index) {
|
||
|
return kinc_uwp_window_height;
|
||
|
}
|
||
|
|
||
|
double kinc_frequency() {
|
||
|
kinc_ticks_t rate;
|
||
|
QueryPerformanceFrequency(reinterpret_cast<LARGE_INTEGER *>(&rate));
|
||
|
return (double)rate;
|
||
|
}
|
||
|
|
||
|
void kinc_internal_shutdown() {}
|
||
|
|
||
|
static kinc_ticks_t start_stamp;
|
||
|
|
||
|
kinc_ticks_t kinc_timestamp() {
|
||
|
kinc_ticks_t stamp;
|
||
|
QueryPerformanceCounter(reinterpret_cast<LARGE_INTEGER *>(&stamp));
|
||
|
return stamp - start_stamp;
|
||
|
}
|
||
|
|
||
|
void kinc_login() {}
|
||
|
|
||
|
void kinc_unlock_achievement(int id) {}
|
||
|
|
||
|
bool kinc_gamepad_connected(int num) {
|
||
|
return true;
|
||
|
}
|
||
|
|
||
|
void kinc_gamepad_rumble(int gamepad, float left, float right){
|
||
|
|
||
|
}
|
||
|
|
||
|
[Platform::MTAThread] int main(Platform::Array<Platform::String ^> ^) {
|
||
|
QueryPerformanceCounter(reinterpret_cast<LARGE_INTEGER *>(&start_stamp));
|
||
|
CoreApplication::Run(ref new Win8ApplicationSource);
|
||
|
return 0;
|
||
|
}
|
||
|
|
||
|
int kinc_cpu_cores(void) {
|
||
|
SYSTEM_LOGICAL_PROCESSOR_INFORMATION info[1024];
|
||
|
DWORD returnLength = sizeof(SYSTEM_LOGICAL_PROCESSOR_INFORMATION) * 1024;
|
||
|
BOOL success = GetLogicalProcessorInformation(&info[0], &returnLength);
|
||
|
|
||
|
int proper_cpu_count = 0;
|
||
|
|
||
|
if (success) {
|
||
|
DWORD byteOffset = 0;
|
||
|
PSYSTEM_LOGICAL_PROCESSOR_INFORMATION ptr = &info[0];
|
||
|
while (byteOffset + sizeof(SYSTEM_LOGICAL_PROCESSOR_INFORMATION) <= returnLength) {
|
||
|
if (ptr->Relationship == RelationProcessorCore) {
|
||
|
++proper_cpu_count;
|
||
|
}
|
||
|
|
||
|
byteOffset += sizeof(SYSTEM_LOGICAL_PROCESSOR_INFORMATION);
|
||
|
++ptr;
|
||
|
}
|
||
|
}
|
||
|
else {
|
||
|
proper_cpu_count = 1;
|
||
|
}
|
||
|
|
||
|
return proper_cpu_count;
|
||
|
}
|
||
|
|
||
|
int kinc_hardware_threads(void) {
|
||
|
SYSTEM_INFO sysinfo;
|
||
|
GetSystemInfo(&sysinfo);
|
||
|
return sysinfo.dwNumberOfProcessors;
|
||
|
}
|