Skip to content

Commit eec19fb

Browse files
committed
Add VIDEO_{Disable,Enable}PositionInterrupt
1 parent e56f442 commit eec19fb

2 files changed

Lines changed: 86 additions & 43 deletions

File tree

include/ogc/video.h

Lines changed: 6 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -53,7 +53,7 @@ distribution.
5353
*/
5454
typedef void (*VIRetraceCallback)(u32 retraceCount);
5555

56-
typedef void (*VIPositionCallback)(u32 posX,u32 posY);
56+
typedef void (*VIPositionCallback)(s16 posX,s16 posY);
5757

5858
void* VIDEO_GetNextFramebuffer(void);
5959
void* VIDEO_GetCurrentFramebuffer(void);
@@ -242,8 +242,11 @@ u32 VIDEO_HaveComponentCable(void);
242242

243243
GXRModeObj * VIDEO_GetPreferredMode(GXRModeObj *mode);
244244

245-
void VIDEO_SetAdjustingValues(s16 hor,s16 ver);
246-
void VIDEO_GetAdjustingValues(s16 *hor,s16 *ver);
245+
void VIDEO_SetAdjustingValues(s16 posX,s16 posY);
246+
void VIDEO_GetAdjustingValues(s16 *posX,s16 *posY);
247+
248+
void VIDEO_EnablePositionInterrupt(s16 posX,s16 posY,VIPositionCallback callback);
249+
VIPositionCallback VIDEO_DisablePositionInterrupt(void);
247250

248251
#ifdef __cplusplus
249252
}

libogc/video.c

Lines changed: 80 additions & 40 deletions
Original file line numberDiff line numberDiff line change
@@ -2425,7 +2425,7 @@ static inline u32 __VISetRegs(void)
24252425
return 1;
24262426
}
24272427

2428-
static void __VIDisplayPositionToXY(s32 xpos,s32 ypos,s32 *px,s32 *py)
2428+
static void __VIDisplayPositionToXY(u32 xpos,u32 ypos,s16 *px,s16 *py)
24292429
{
24302430
u32 hpos,vpos;
24312431
u32 hline,val;
@@ -2434,25 +2434,25 @@ static void __VIDisplayPositionToXY(s32 xpos,s32 ypos,s32 *px,s32 *py)
24342434
vpos = (ypos-1);
24352435
hline = ((vpos<<1)+(hpos/currTiming->hlw));
24362436

2437-
*px = (s32)hpos;
2437+
*px = (s16)hpos;
24382438
if(HorVer.nonInter==VI_INTERLACE) {
24392439
if(hline<currTiming->nhlines) {
2440-
val = currTiming->prbOdd+(currTiming->equ*3);
2440+
val = ((currTiming->equ*3)+currTiming->prbOdd);
24412441
if(hline>=val) {
24422442
val = (currTiming->nhlines-currTiming->psbOdd);
24432443
if(hline<val) {
2444-
*py = (s32)(((hline-(currTiming->equ*3))-currTiming->prbOdd)&~0x01);
2444+
*py = (s16)((hline-((currTiming->equ*3)+currTiming->prbOdd))&~1);
24452445
} else
24462446
*py = -1;
24472447
} else
24482448
*py = -1;
24492449
} else {
24502450
hline -= currTiming->nhlines;
2451-
val = (currTiming->prbEven+(currTiming->equ*3));
2451+
val = ((currTiming->equ*3)+currTiming->prbEven);
24522452
if(hline>=val) {
24532453
val = (currTiming->nhlines-currTiming->psbEven);
24542454
if(hline<val) {
2455-
*py = (s32)((((hline-(currTiming->equ*3))-currTiming->prbEven)&~0x01)+1);
2455+
*py = (s16)(((hline-((currTiming->equ*3)+currTiming->prbEven))&~1)+1);
24562456
} else
24572457
*py = -1;
24582458
} else
@@ -2461,46 +2461,36 @@ static void __VIDisplayPositionToXY(s32 xpos,s32 ypos,s32 *px,s32 *py)
24612461
} else if(HorVer.nonInter==VI_NON_INTERLACE) {
24622462
if(hline>=currTiming->nhlines) hline -= currTiming->nhlines;
24632463

2464-
val = (currTiming->prbOdd+(currTiming->equ*3));
2464+
val = ((currTiming->equ*3)+currTiming->prbOdd);
24652465
if(hline>=val) {
24662466
val = (currTiming->nhlines-currTiming->psbOdd);
24672467
if(hline<val) {
2468-
*py = (s32)(((hline-(currTiming->equ*3))-currTiming->prbOdd)&~0x01);
2468+
*py = (s16)((hline-((currTiming->equ*3)+currTiming->prbOdd))&~1);
24692469
} else
24702470
*py = -1;
24712471
} else
24722472
*py = -1;
24732473
} else if(HorVer.nonInter==VI_PROGRESSIVE || HorVer.nonInter==VI_3D) {
2474-
if(hline<currTiming->nhlines) {
2475-
val = currTiming->prbOdd+(currTiming->equ*3);
2476-
if(hline>=val) {
2477-
val = (currTiming->nhlines-currTiming->psbOdd);
2478-
if(hline<val) {
2479-
*py = (s32)((hline-(currTiming->equ*3))-currTiming->prbOdd);
2480-
} else
2481-
*py = -1;
2482-
} else
2483-
*py = -1;
2484-
} else {
2485-
hline -= currTiming->nhlines;
2486-
val = (currTiming->prbEven+(currTiming->equ*3));
2487-
if(hline>=val) {
2488-
val = (currTiming->nhlines-currTiming->psbEven);
2489-
if(hline<val) {
2490-
*py = (s32)(((hline-(currTiming->equ*3))-currTiming->prbEven)&~0x01);
2491-
} else
2492-
*py = -1;
2474+
if(hline>=currTiming->nhlines) hline -= currTiming->nhlines;
2475+
2476+
val = ((currTiming->equ*3)+currTiming->prbOdd);
2477+
if(hline>=val) {
2478+
val = (currTiming->nhlines-currTiming->psbOdd);
2479+
if(hline<val) {
2480+
*py = (s16)((hline-((currTiming->equ*3)+currTiming->prbOdd))>>1);
24932481
} else
24942482
*py = -1;
2495-
}
2496-
}
2483+
} else
2484+
*py = -1;
2485+
} else
2486+
*py = -1;
24972487
}
24982488

2499-
static inline void __VIGetCurrentPosition(s32 *px,s32 *py)
2489+
static inline void __VIGetCurrentPosition(s16 *px,s16 *py)
25002490
{
2501-
s32 xpos,ypos;
2491+
u32 xpos,ypos;
25022492

2503-
__getCurrentDisplayPosition((u32*)&xpos,(u32*)&ypos);
2493+
__getCurrentDisplayPosition(&xpos,&ypos);
25042494
__VIDisplayPositionToXY(xpos,ypos,px,py);
25052495
}
25062496

@@ -2511,7 +2501,7 @@ static void __VIRetraceHandler(u32 nIrq,frame_context *pCtx)
25112501
#endif
25122502
u32 ret = 0;
25132503
u32 intr;
2514-
s32 xpos,ypos;
2504+
s16 xpos,ypos;
25152505

25162506
intr = _viReg[24];
25172507
if(intr&0x8000) {
@@ -2539,7 +2529,7 @@ static void __VIRetraceHandler(u32 nIrq,frame_context *pCtx)
25392529

25402530
intr = _viReg[30];
25412531
if(ret&0x04 || ret&0x08) {
2542-
if(positionCB!=NULL) {
2532+
if(positionCB) {
25432533
__VIGetCurrentPosition(&xpos,&ypos);
25442534
positionCB(xpos,ypos);
25452535
}
@@ -3177,14 +3167,14 @@ u32 VIDEO_HaveComponentCable(void)
31773167
return dtv;
31783168
}
31793169

3180-
void VIDEO_SetAdjustingValues(s16 hor,s16 ver)
3170+
void VIDEO_SetAdjustingValues(s16 posX,s16 posY)
31813171
{
31823172
u32 level;
31833173
const struct _timing *curtiming;
31843174

31853175
_CPU_ISR_Disable(level);
3186-
displayOffsetH = hor;
3187-
displayOffsetV = ver;
3176+
displayOffsetH = posX;
3177+
displayOffsetV = posY;
31883178

31893179
curtiming = HorVer.timing;
31903180
__adjustPosition(curtiming->acv);
@@ -3196,12 +3186,62 @@ void VIDEO_SetAdjustingValues(s16 hor,s16 ver)
31963186
_CPU_ISR_Restore(level);
31973187
}
31983188

3199-
void VIDEO_GetAdjustingValues(s16 *hor,s16 *ver)
3189+
void VIDEO_GetAdjustingValues(s16 *posX,s16 *posY)
32003190
{
32013191
u32 level;
32023192

32033193
_CPU_ISR_Disable(level);
3204-
*hor = displayOffsetH;
3205-
*ver = displayOffsetV;
3194+
*posX = displayOffsetH;
3195+
*posY = displayOffsetV;
32063196
_CPU_ISR_Restore(level);
32073197
}
3198+
3199+
void VIDEO_EnablePositionInterrupt(s16 posX,s16 posY,VIPositionCallback callback)
3200+
{
3201+
u32 level,hline;
3202+
3203+
_CPU_ISR_Disable(level);
3204+
if(HorVer.nonInter==VI_INTERLACE) {
3205+
if(posY%2) {
3206+
hline = (currTiming->nhlines+((currTiming->equ*3)+currTiming->prbEven));
3207+
_viReg[30] = 0x1000|((hline/2)+((posY/2)+1));
3208+
_viReg[31] = posX+1;
3209+
} else {
3210+
hline = ((currTiming->equ*3)+currTiming->prbOdd);
3211+
_viReg[28] = 0x1000|((hline/2)+((posY/2)+1));
3212+
_viReg[29] = posX+1;
3213+
}
3214+
} else if(HorVer.nonInter==VI_NON_INTERLACE) {
3215+
hline = ((currTiming->equ*3)+currTiming->prbOdd);
3216+
_viReg[28] = 0x1000|((hline/2)+((posY/2)+1));
3217+
_viReg[29] = posX+1;
3218+
3219+
hline += currTiming->nhlines;
3220+
_viReg[30] = 0x1000|((hline/2)+((posY/2)+1));
3221+
_viReg[31] = posX+1;
3222+
} else if(HorVer.nonInter==VI_PROGRESSIVE || HorVer.nonInter==VI_3D) {
3223+
hline = ((currTiming->equ*3)+currTiming->prbOdd);
3224+
_viReg[28] = 0x1000|((hline/2)+(posY+1));
3225+
_viReg[29] = posX+1;
3226+
3227+
hline += currTiming->nhlines;
3228+
_viReg[30] = 0x1000|((hline/2)+(posY+1));
3229+
_viReg[31] = posX+1;
3230+
}
3231+
positionCB = callback;
3232+
_CPU_ISR_Restore(level);
3233+
}
3234+
3235+
VIPositionCallback VIDEO_DisablePositionInterrupt(void)
3236+
{
3237+
u32 level;
3238+
VIPositionCallback old;
3239+
3240+
_CPU_ISR_Disable(level);
3241+
_viReg[28] = 0x0000;
3242+
_viReg[30] = 0x0000;
3243+
old = positionCB;
3244+
positionCB = NULL;
3245+
_CPU_ISR_Restore(level);
3246+
return old;
3247+
}

0 commit comments

Comments
 (0)