Haiku ATI video driver adapted from the X.org ATI driver.
Copyright 1999, 2000 ATI Technologies Inc., Markham, Ontario,
Precision Insight, Inc., Cedar Park, Texas, and
VA Linux Systems Inc., Fremont, California.
Copyright 2009 Haiku, Inc. All rights reserved.
Distributed under the terms of the MIT license.
Authors:
Gerald Zajac 2009
*/
#include "accelerant.h"
#include "rage128.h"
void
Rage128_ShowCursor(bool bShow)
{
OUTREGM(R128_CRTC_GEN_CNTL, bShow ? R128_CRTC_CUR_EN : 0, R128_CRTC_CUR_EN);
}
void
Rage128_SetCursorPosition(int x, int y)
{
SharedInfo& si = *gInfo.sharedInfo;
uint8 xOffset = 0;
uint8 yOffset = 0;
if (x < 0) {
xOffset = (( -x) & 0xFE);
x = 0;
}
if (y < 0) {
yOffset = (( -y) & 0xFE);
y = 0;
}
OUTREG(R128_CUR_HORZ_VERT_OFF, R128_CUR_LOCK | (xOffset << 16) | yOffset);
OUTREG(R128_CUR_HORZ_VERT_POSN, R128_CUR_LOCK | (x << 16) | y);
OUTREG(R128_CUR_OFFSET, si.cursorOffset + yOffset * 16);
}
bool
Rage128_LoadCursorImage(int width, int height, uint8* andMask, uint8* xorMask)
{
SharedInfo& si = *gInfo.sharedInfo;
if (andMask == NULL || xorMask == NULL)
return false;
uint32* fbCursor32 = (uint32*)((addr_t)si.videoMemAddr + si.cursorOffset);
for (int i = 0; i < CURSOR_BYTES; i += 16) {
*fbCursor32++ = ~0;
*fbCursor32++ = ~0;
*fbCursor32++ = 0;
*fbCursor32++ = 0;
}
uint8* fbCursor = (uint8*)((addr_t)si.videoMemAddr + si.cursorOffset);
for (int row = 0; row < height; row++) {
for (int colByte = 0; colByte < width / 8; colByte++) {
fbCursor[row * 16 + colByte] = *andMask++;
fbCursor[row * 16 + colByte + 8] = *xorMask++;
}
}
OUTREG(R128_CUR_CLR0, ~0);
OUTREG(R128_CUR_CLR1, 0);
return true;
}