diff --git a/gx/gx_video.c b/gx/gx_video.c index eb47e2d511..753159ed60 100644 --- a/gx/gx_video.c +++ b/gx/gx_video.c @@ -246,7 +246,7 @@ void gx_set_video_mode(void *data, unsigned fbWidth, unsigned lines) VIDEO_SetBlack(false); VIDEO_Flush(); - GX_SetViewport(0, 0, gx_mode.fbWidth, gx_mode.efbHeight, 0, 1); + __GX_SetViewportJitter(0, 0, gx_mode.fbWidth, gx_mode.efbHeight, 0, 1, 1); __GX_SetDispCopySrc(__gx, 0, 0, gx_mode.fbWidth, gx_mode.efbHeight); f32 y_scale = GX_GetYScaleFactor(gx_mode.efbHeight, gx_mode.xfbHeight); @@ -386,9 +386,9 @@ static void init_vtx(struct __gx_regdef *__gx, void *data) GX_SetVtxAttrFmt(GX_VTXFMT0, GX_VA_POS, GX_POS_XYZ, GX_F32, 0); GX_SetVtxAttrFmt(GX_VTXFMT0, GX_VA_TEX0, GX_TEX_ST, GX_F32, 0); GX_SetVtxAttrFmt(GX_VTXFMT0, GX_VA_CLR0, GX_CLR_RGBA, GX_RGBA8, 0); - GX_SetArray(GX_VA_POS, verts, 3 * sizeof(float)); - GX_SetArray(GX_VA_TEX0, vertex_ptr, 2 * sizeof(float)); - GX_SetArray(GX_VA_CLR0, color_ptr, 4 * sizeof(u8)); + __GX_SetArray(__gx, GX_VA_POS, verts, 3 * sizeof(float)); + __GX_SetArray(__gx, GX_VA_TEX0, vertex_ptr, 2 * sizeof(float)); + __GX_SetArray(__gx, GX_VA_CLR0, color_ptr, 4 * sizeof(u8)); __GX_SetNumTexGens(__gx, 1); __GX_SetNumChans(__gx, 1); @@ -787,7 +787,7 @@ static void gx_resize(struct __gx_regdef *__gx, void *data) gx->vp.width = width; gx->vp.height = height; - GX_SetViewport(x, y, width, height, 0, 1); + __GX_SetViewportJitter(x, y, width, height, 0, 1, 1); Mtx44 m1, m2; float top = 1, bottom = -1, left = -1, right = 1; @@ -1199,7 +1199,7 @@ static void gx_render_overlay(void *data) { GX_LoadTexObj(&gx->overlay[i].tex, GX_TEXMAP0); - GX_Begin(GX_TRIANGLESTRIP, GX_VTXFMT0, 4); + __GX_Begin(__gx, GX_TRIANGLESTRIP, GX_VTXFMT0, 4); GX_Position3f32(gx->overlay[i].vertex_coord[0], gx->overlay[i].vertex_coord[1], -0.5); GX_Color4u8(255, 255, 255, (u8)(gx->overlay[i].alpha_mod * 255.0f)); GX_TexCoord2f32(gx->overlay[i].tex_coord[0], gx->overlay[i].tex_coord[1]); diff --git a/gx/gx_video_inl.h b/gx/gx_video_inl.h index c747b494ad..ae675e62e3 100644 --- a/gx/gx_video_inl.h +++ b/gx/gx_video_inl.h @@ -341,6 +341,19 @@ static void __SETVCDATTR(struct __gx_regdef *__gx, u8 attr,u8 type) GX_LOAD_XF_REG(0x1019,__gx->mtxIdxHi); \ } +#define __GX_SetArray(__gx, attr, ptr, stride) \ + if(attr>=GX_VA_POS && attr<=GX_LIGHTARRAY) \ + { \ + GX_LOAD_CP_REG((0xA0 +((attr) - GX_VA_POS)),(u32)MEM_VIRTUAL_TO_PHYSICAL(ptr)); \ + GX_LOAD_CP_REG((0xB0 +((attr) - GX_VA_POS)),(u32)(stride)); \ + } + +#define __GX_Begin(__vtx, primitive, vtxfmt, vtxcnt) \ + if(__gx->dirtyState) \ + __GX_SetDirtyState(__gx); \ + wgPipe->U8 = primitive | (vtxfmt & 7); \ + wgPipe->U16 = vtxcnt + #ifdef HW_DOL static inline void __GX_UpdateBPMask(struct __gx_regdef *__gx) { @@ -672,15 +685,6 @@ static void __GX_SendFlushPrim(struct __gx_regdef *__gx) __gx->genMode = (__gx->genMode & ~0xf)|(nr & 0xf); \ __gx->dirtyState |= 0x02000004 -#define __GX_Begin(__gx, primitve, vtxfmt, vtxcnt) \ -{ \ - u8 reg = primitve|(vtxfmt&7); \ - if(__gx->dirtyState) \ - __GX_SetDirtyState(__gx); \ - wgPipe->U8 = reg; \ - wgPipe->U16 = vtxcnt; \ -} - #define __GX_PokeARGB(x, y, color) \ { \ u32 regval; \ @@ -713,6 +717,19 @@ static void __GX_SendFlushPrim(struct __gx_regdef *__gx) __gx->peZMode = (__gx->peZMode&~0x10)|(_SHIFTL(update_enable,4,1)); \ GX_LOAD_BP_REG(__gx->peZMode) +#define X_FACTOR 0.5 +#define Y_FACTOR 342.0 +#define ZFACTOR 16777215.0 + +#define __GX_SetViewportJitter(xOrig, yOrig, wd, ht, nearZ, farZ, field) \ + GX_LOAD_XF_REGS(0x101a,6); \ + wgPipe->F32 = wd* X_FACTOR; /* x0 */ \ + wgPipe->F32 = (-ht)* X_FACTOR; /* y0 */ \ + wgPipe->F32 = (ZFACTOR * farZ)-(ZFACTOR * nearZ); /* z */ \ + wgPipe->F32 = (xOrig+(wd * X_FACTOR))+ Y_FACTOR; /* x1 */ \ + wgPipe->F32 = (yOrig+(ht * X_FACTOR))+ Y_FACTOR; /* y1 */ \ + wgPipe->F32 = ZFACTOR * farZ /* f */ + static void __GX_SetCopyFilter(u8 aa,u8 sample_pattern[12][2],u8 vf,u8 vfilter[7]) { u32 reg01=0,reg02=0,reg03=0,reg04=0,reg53=0,reg54=0;