updated engine management code

git-svn-id: file:///srv/svn/repos/haiku/trunk/current@7042 a95241bf-73f2-0310-859d-f6bbb57e9c96
This commit is contained in:
Rudolf Cornelissen
2004-03-20 20:42:12 +00:00
parent 0eb03b604f
commit fc6c22f1af
@@ -2,7 +2,9 @@
Copyright 1999, Be Incorporated. All Rights Reserved. Copyright 1999, Be Incorporated. All Rights Reserved.
This file may be used under the terms of the Be Sample Code License. This file may be used under the terms of the Be Sample Code License.
modification to call G400 functions and mess-ups - Mark Watson other authors:
Mark Watson
Rudolf Cornelissen 3/2004
*/ */
#define MODULE_BIT 0x10000000 #define MODULE_BIT 0x10000000
@@ -12,11 +14,14 @@
static engine_token nm_engine_token = { 1, B_2D_ACCELERATION, NULL }; static engine_token nm_engine_token = { 1, B_2D_ACCELERATION, NULL };
uint32 ACCELERANT_ENGINE_COUNT(void) { uint32 ACCELERANT_ENGINE_COUNT(void)
{
/* we have one acceleration engine */
return 1; return 1;
} }
status_t ACQUIRE_ENGINE(uint32 capabilities, uint32 max_wait, sync_token *st, engine_token **et) { status_t ACQUIRE_ENGINE(uint32 capabilities, uint32 max_wait, sync_token *st, engine_token **et)
{
/* acquire the shared benaphore */ /* acquire the shared benaphore */
AQUIRE_BEN(si->engine.lock) AQUIRE_BEN(si->engine.lock)
/* sync if required */ /* sync if required */
@@ -27,41 +32,38 @@ status_t ACQUIRE_ENGINE(uint32 capabilities, uint32 max_wait, sync_token *st, en
return B_OK; return B_OK;
} }
status_t RELEASE_ENGINE(engine_token *et, sync_token *st) { status_t RELEASE_ENGINE(engine_token *et, sync_token *st)
{
/* update the sync token, if any */ /* update the sync token, if any */
if (st) { if (st) GET_SYNC_TOKEN(et,st);
GET_SYNC_TOKEN(et,st);
}
/* release the shared benaphore */ /* release the shared benaphore */
RELEASE_BEN(si->engine.lock) RELEASE_BEN(si->engine.lock)
return B_OK; return B_OK;
} }
void WAIT_ENGINE_IDLE(void) { void WAIT_ENGINE_IDLE(void)
uint32 count; {
/*wait for the engine to be totally idle*/ /*wait for the engine to be totally idle*/
count = si->engine.count;
nm_acc_wait_idle(); nm_acc_wait_idle();
si->engine.last_idle = count;
} }
status_t GET_SYNC_TOKEN(engine_token *et, sync_token *st) { status_t GET_SYNC_TOKEN(engine_token *et, sync_token *st)
si->engine.count+=4; {
/* engine count will always be zero: we don't support syncing to token (yet) */
st->engine_id = et->engine_id; st->engine_id = et->engine_id;
st->counter = si->engine.count; st->counter = si->engine.count;
return B_OK; return B_OK;
} }
status_t SYNC_TO_TOKEN(sync_token *st) { status_t SYNC_TO_TOKEN(sync_token *st)
/* a quick out */ {
if (st->counter <= si->engine.last_idle) return B_OK; /* wait until the engine is totally idle: we don't support syncing to token (yet) */
/* note:
/* another quick out! */ * AFAIK in order to be able to setup sync_to_token, we'd need a circular fifo
if ((st->counter >0xFFFFFFF) && (si->engine.last_idle <0xFFFF)) return B_OK; /*for when counter wraps*/ * buffer in (main) memory instead of directly programming the GPU fifo so we
* can tell (via a hardware maintained pointer into this circular fifo) where
/* If not we have to wait :-(*/ * the acc engine is with executing commands! */
WAIT_ENGINE_IDLE(); WAIT_ENGINE_IDLE();
return B_OK; return B_OK;