while (aptMainLoop())
{
gspWaitForVBlank();
PPGraphics::Get()->BeginRender();
PPGraphics::Get()->RenderOn(GFX_TOP);
sm->UpdateFrameTracker(); // Step 1
PPGraphics::Get()->DrawTopScreenSprite(); // Step 2
PPGraphics::Get()->EndRender();
}
void PPGraphics::UpdateTopScreenSprite(u8* data, u32 size, u32 width, u32 height)
{
mTopScreenSprite->width = width;
mTopScreenSprite->height = height;
u8* linearData = (u8*)linearAlloc(sizeof(u8) * size);
memcpy(linearData, data, size);
if(!mTopScreenSprite->initialized)
{
mTopScreenSprite->initialized = true;
GSPGPU_FlushDataCache(linearData, size);
C3D_TexInit(&mTopScreenSprite->spriteTexture, width, height, GPU_RGB8);
u32 dim = GX_BUFFER_DIM(width, height);
C3D_SafeDisplayTransfer((u32*)linearData, dim, (u32*)mTopScreenSprite->spriteTexture.data, dim, TEXTURE_TRANSFER_FLAGS);
gspWaitForPPF();
C3D_TexSetFilter(&mTopScreenSprite->spriteTexture, GPU_LINEAR, GPU_NEAREST);
}else
{
GSPGPU_FlushDataCache(linearData, size);
u32 dim = GX_BUFFER_DIM(width, height);
C3D_SafeDisplayTransfer((u32*)linearData, dim, (u32*)mTopScreenSprite->spriteTexture.data, dim, TEXTURE_TRANSFER_FLAGS);
gspWaitForPPF();
C3D_TexSetFilter(&mTopScreenSprite->spriteTexture, GPU_LINEAR, GPU_NEAREST);
}
linearFree(linearData);
}
void PPGraphics::DrawTopScreenSprite()
{
if (!mTopScreenSprite->initialized) {
return;
}
ppVertexPosTex* vertices = (ppVertexPosTex*)allocMemoryPoolAligned(sizeof(ppVertexPosTex) * 4, 8);
if (!vertices)
return; // out of memory in pool
float x = 0, y = 0, w = 400.0f, h = 240.0f;
// set position
vertices[0].position = (ppVector3) { x, y, 0.5f };
vertices[1].position = (ppVector3) { x + w, y, 0.5f };
vertices[2].position = (ppVector3) { x, y + h, 0.5f };
vertices[3].position = (ppVector3) { x + w, y + h, 0.5f };
// set color
vertices[0].textcoord = (ppVector2) { 0.0f, 0.0f };
vertices[1].textcoord = (ppVector2) { 1.0f, 0.0f };
vertices[2].textcoord = (ppVector2) { 0.0f, 1.0f};
vertices[3].textcoord = (ppVector2) { 1.0f, 1.0f };
// setup env
C3D_TexBind(getTextUnit(GPU_TEXUNIT0), &mTopScreenSprite->spriteTexture);
C3D_TexEnv* env = C3D_GetTexEnv(0);
C3D_TexEnvSrc(env, C3D_Both, GPU_TEXTURE0, 0, 0);
C3D_TexEnvOp(env, C3D_Both, 0, 0, 0);
C3D_TexEnvFunc(env, C3D_Both, GPU_REPLACE);
C3D_AttrInfo* attrInfo = C3D_GetAttrInfo();
AttrInfo_Init(attrInfo);
AttrInfo_AddLoader(attrInfo, 0, GPU_FLOAT, 3);
AttrInfo_AddLoader(attrInfo, 1, GPU_FLOAT, 2);
C3D_BufInfo* bufInfo = C3D_GetBufInfo();
BufInfo_Init(bufInfo);
BufInfo_Add(bufInfo, vertices, sizeof(ppVertexPosTex), 2, 0x10);
C3D_DrawArrays(GPU_TRIANGLE_STRIP, 0, 4);
}