From 599fbbf01018607da1d6541b56700caae5a09ddb Mon Sep 17 00:00:00 2001
From: Rudolf Cornelissen
Date: Mon, 15 Mar 2004 07:12:51 +0000
Subject: [PATCH] fixed engine management regarding sync_to_token
git-svn-id: file:///srv/svn/repos/haiku/trunk/current@6987 a95241bf-73f2-0310-859d-f6bbb57e9c96
---
.../accelerants/nvidia/EngineManagment.c | 47 ++++++++++---------
.../accelerants/nvidia/engine/nv_general.c | 2 +-
.../drivers/graphics/nvidia/UPDATE.html | 9 ++--
3 files changed, 30 insertions(+), 28 deletions(-)
diff --git a/src/add-ons/accelerants/nvidia/EngineManagment.c b/src/add-ons/accelerants/nvidia/EngineManagment.c
index 062927ac42..42a3dd916e 100644
--- a/src/add-ons/accelerants/nvidia/EngineManagment.c
+++ b/src/add-ons/accelerants/nvidia/EngineManagment.c
@@ -2,7 +2,9 @@
Copyright 1999, Be Incorporated. All Rights Reserved.
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
@@ -12,11 +14,14 @@
static engine_token nv_engine_token = { 1, B_2D_ACCELERATION, NULL };
-uint32 ACCELERANT_ENGINE_COUNT(void) {
+uint32 ACCELERANT_ENGINE_COUNT(void)
+{
+ /* we have one acceleration engine */
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 */
AQUIRE_BEN(si->engine.lock)
/* sync if required */
@@ -27,41 +32,37 @@ status_t ACQUIRE_ENGINE(uint32 capabilities, uint32 max_wait, sync_token *st, en
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 */
- if (st) {
- GET_SYNC_TOKEN(et,st);
- }
+ if (st) GET_SYNC_TOKEN(et,st);
/* release the shared benaphore */
RELEASE_BEN(si->engine.lock)
return B_OK;
}
-void WAIT_ENGINE_IDLE(void) {
- uint32 count;
- /*wait for the engine to be totally idle*/
- count = si->engine.count;
+void WAIT_ENGINE_IDLE(void)
+{
nv_acc_wait_idle();
-
- si->engine.last_idle = count;
}
-status_t GET_SYNC_TOKEN(engine_token *et, sync_token *st) {
- si->engine.count+=4;
+status_t GET_SYNC_TOKEN(engine_token *et, sync_token *st)
+{
+ /* engine count will always be zero: we don't support syncing to token (yet) */
st->engine_id = et->engine_id;
st->counter = si->engine.count;
return B_OK;
}
-status_t SYNC_TO_TOKEN(sync_token *st) {
- /* a quick out */
- if (st->counter <= si->engine.last_idle) return B_OK;
-
- /* another quick out! */
- if ((st->counter >0xFFFFFFF) && (si->engine.last_idle <0xFFFF)) return B_OK; /*for when counter wraps*/
-
- /* If not we have to wait :-(*/
+status_t SYNC_TO_TOKEN(sync_token *st)
+{
+ /* wait until the engine is totally idle: we don't support syncing to token (yet) */
+ /* note:
+ * AFAIK in order to be able to setup sync_to_token, we'd need a circular fifo
+ * 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
+ * the acc engine is with executing commands! */
WAIT_ENGINE_IDLE();
return B_OK;
diff --git a/src/add-ons/accelerants/nvidia/engine/nv_general.c b/src/add-ons/accelerants/nvidia/engine/nv_general.c
index 52795feaf0..00478b070a 100644
--- a/src/add-ons/accelerants/nvidia/engine/nv_general.c
+++ b/src/add-ons/accelerants/nvidia/engine/nv_general.c
@@ -80,7 +80,7 @@ status_t nv_general_powerup()
{
status_t status;
- LOG(1,("POWERUP: nVidia (open)BeOS Accelerant 0.10-5 running.\n"));
+ LOG(1,("POWERUP: nVidia (open)BeOS Accelerant 0.10-6 running.\n"));
/* preset no laptop */
si->ps.laptop = false;
diff --git a/src/add-ons/kernel/drivers/graphics/nvidia/UPDATE.html b/src/add-ons/kernel/drivers/graphics/nvidia/UPDATE.html
index f3b5febbff..b8689b0cb0 100644
--- a/src/add-ons/kernel/drivers/graphics/nvidia/UPDATE.html
+++ b/src/add-ons/kernel/drivers/graphics/nvidia/UPDATE.html
@@ -4,16 +4,17 @@
Changes done for each driverversion:
-head (0.10-5), (Rudolf)
+head (0.10-6), (Rudolf)
- Implemented laptop internal flatpanel presence and native resolution detection;
- Implemented external DVI flatpanel(s) presence and native resolution detection;
- Added flatpanel(s) refreshrate protection: it(they) is(are) always kept at 60Hz refresh;
- Added flatpanel specific CRTC modeline and DFP modeline tuning: DVI connected panels work now on both heads (if applicable);
-
- Fixed fullscreen overlay on DVI panels.
- NOTE:
- dualhead switch mode is not yet operational for flatpanels...
+ - Fixed fullscreen overlay on DVI panels;
+
- Fixed acceleration engine management regarding sync_to_token: no more updating glitches should occur now.
+NOTE:
+dualhead switch mode is not yet operational for flatpanels...
nv_driver 0.09, (Rudolf)
- Fixed NV11 trouble with repeating screen(s) on the right side of the monitor;