I made this very little stub in order to show how I render stuff to screen.
It is a very simple approach. It worked VERY WELL while I was using it in 640x480, with a RGB component cable... but when I tried the same code using a normal TV cable... I got all that flickering on screen (because of the reasons we all know already).
But when I tried it on a 640x240 videomode (single field, in order to avoid the same problem as before) I find that it seems that "pixels" are not packed exactly the same way :( (as described in my previous post). If you have any clue, it would be greatly appreaciated.
Anyway, thanks in forward,
Roor
----------------------------------
static unsigned long *xfb = NULL;
static GXRModeObj *rmode = NULL;
unsigned long *VRAM = NULL;
bool CanDraw=false;
void Retrace(u32 arg)
{
if (CanDraw)
{
for (int bi = 0; bi<200; bi++) memcpy(xfb+((bi+20)*320),VRAM+(bi*640),320*4);
VIDEO_Flush();
}
}
void SHELL_Run(void)
{
while (1)
{
// HERE VRAM IS UPDATED WITH THE DATA I WANT TO DISPLAY ON SCREEN
// AND I SET CanDraw=true; IF I WANT IT SENT TO SCREEN (XFB)
// OF COURSE ALL DATA IN "VRAM" IS STORED AS YUV422 (YUYV) AS A NORMAL (640X240 2D FRAME BUFFER)
// IE: IF I WANT A HORIZONTAL LINE OF "TWO" GREEN COLORED PIXELS IN THE MIDDLE OF SCREEN I'LL BE WRITING: VRAM[160+(120*320)]=0x0;
// PROBLEM: XFB INFORMATION DOESN'T SEEM TO BE EXACTLY "LINEAR" IN THIS 640X240 MODE... AS IT WAS IN 640X480 :(
}
}
int main(int argc, char *argv[])
{
VRAM=(unsigned long*)memalign(32,4*640*400);
VIDEO_Init();
rmode=TVNtsc240Ds;
xfb = (unsigned long*)MEM_K0_TO_K1(SYS_AllocateFramebuffer(rmode));
VIDEO_Configure(rmode);
VIDEO_ClearFrameBuffer (rmode, xfb, COLOR_BLACK);
VIDEO_SetNextFramebuffer(xfb);
VIDEO_SetBlack(FALSE);
VIDEO_Flush();
VIDEO_WaitVSync();
if(rmode->viTVMode&VI_NON_INTERLACE) VIDEO_WaitVSync();
VIDEO_SetPreRetraceCallback((VIRetraceCallback)Retrace);
SHELL_Run();
VIDEO_SetPreRetraceCallback(NULL);
free(VRAM);
return 0;
};
Edited 1 time(s). Last edit at 12/10/2008 08:11PM by Roor.