/*
 * Copyright 2007-2012 Haiku, Inc.  All rights reserved.
 * Distributed under the terms of the MIT license.
 *
 * Authors:
 *		Gerald Zajac
 */


#include "accelerant.h"
#include "i810_regs.h"


static engine_token sEngineToken = { 1, B_2D_ACCELERATION, NULL };


uint32
AccelerantEngineCount(void)
{
	return 1;
}


status_t
AcquireEngine(uint32 capabilities, uint32 maxWait,
	sync_token* syncToken, engine_token** engineToken)
{
	(void)capabilities;	// avoid compiler warning for unused arg
	(void)maxWait;		// avoid compiler warning for unused arg

	if (gInfo.sharedInfo->engineLock.Acquire() != B_OK)
		return B_ERROR;

	if (syncToken)
		SyncToToken(syncToken);

	*engineToken = &sEngineToken;
	return B_OK;
}


status_t
ReleaseEngine(engine_token* engineToken, sync_token* syncToken)
{
	if (syncToken)
		GetSyncToken(engineToken, syncToken);

	gInfo.sharedInfo->engineLock.Release();
	return B_OK;
}


void
WaitEngineIdle(void)
{
	// Wait until engine is idle.

	int k = 10000000;

	while ((INREG16(INST_DONE) & 0x7B) != 0x7B && k > 0)
		k--;
}


status_t
GetSyncToken(engine_token* engineToken, sync_token* syncToken)
{
	syncToken->engine_id = engineToken->engine_id;
	syncToken->counter = 0;
	return B_OK;
}


status_t
SyncToToken(sync_token* syncToken)
{
	(void)syncToken;
		// avoid compiler warning for unused arg

	WaitEngineIdle();
	return B_OK;
}