// dllmain.cpp : Defines the entry point for the DLL application.
#include "dllmain.h"

#include "windows.h"
#include "opencl.h"
#include "Thread.hpp"
#include "debug.h"

#include <windows.h>
#include <intrin.h>
#include <WinUser.h>

static sw::Thread::LocalStorageKey currentTLS = TLS_OUT_OF_INDEXES;

#if defined(_WIN32)
#define IDD_DIALOG1                     101

static void clAttachThread()
{
	TRACE("()");

	cl::Current *current = new cl::Current();
	{
		TlsSetValue(currentTLS, current);
		current->context = 0;
	}
}

static void clDetachThread()
{
	TRACE("()");
	cl::Current *current = (cl::Current*)TlsGetValue(currentTLS);

	if(current)
	{
		delete current;
	}
}

static bool clAttachProcess()
{
	TRACE("()");

	currentTLS = TlsAlloc();

	if(currentTLS == TLS_OUT_OF_INDEXES)
	{
		return false;
	}

	clAttachThread();

	return true;
}

static void clDetachProcess()
{
	TRACE("()");

	clDetachThread();
	TlsFree(currentTLS);
}

extern "C" BOOL APIENTRY DllMain(HINSTANCE instance, DWORD ul_reason_for_call, LPVOID lpReserved)
{
	switch (ul_reason_for_call)
	{
	case DLL_PROCESS_ATTACH:
		return clAttachProcess();
		break;
	case DLL_THREAD_ATTACH:
		clAttachThread();
		break;
	case DLL_THREAD_DETACH:
		clDetachThread();
		break;
	case DLL_PROCESS_DETACH:
		clDetachProcess();
		break;
	default:
		break;
	}

	return TRUE;
}
#endif
namespace cl
{
	static Current *getCurrent(void)
	{
		Current *current = (Current*)TlsGetValue(currentTLS);

		if(!current)
		{
			clAttachThread();
		}

		return (Current*)TlsGetValue(currentTLS);
	}

	void makeCurrent(cl_platform_id platformId, Devices::Context *context)
	{
		Current *current = getCurrent();

		current->context = context;
		current->platform = platformId;
	}

	Devices::Context *getContext()
	{
		Current *current = getCurrent();

		return current->context;
	}
}