diff --git a/src/Graphics_NDS.c b/src/Graphics_NDS.c index d463b7b63..513ccee68 100644 --- a/src/Graphics_NDS.c +++ b/src/Graphics_NDS.c @@ -68,6 +68,14 @@ static void blockalloc_free(cc_uint8* table, int origin, int blocks) { /*########################################################################################################################* *---------------------------------------------------------General---------------------------------------------------------* *#########################################################################################################################*/ +static CC_INLINE void CopyHWords(void* src, void* dst, int len) { + // VRAM must be written to in 16 bit units + u16* src_ = src; + u16* dst_ = dst; + + for (int i = 0; i < len; i++) dst_[i] = src_[i]; +} + void ResetGPU(void) { powerOn(POWER_3D_CORE | POWER_MATRIX); // Enable 3D core & geometry engine @@ -397,7 +405,7 @@ GfxResourceID Gfx_AllocTexture(struct Bitmap* bmp, int rowWidth, cc_uint8 flags, } } - swiCopy(buf, addr, (tex_size >> 1) | COPY_MODE_HWORD); + CopyHWords(buf, addr, tex_size >> 1); free(buf); } else if (tex_fmt == GL_RGB16) { stride = bmp->width >> 2; @@ -416,7 +424,7 @@ GfxResourceID Gfx_AllocTexture(struct Bitmap* bmp, int rowWidth, cc_uint8 flags, tmp[x >> 1] |= idx << 4; } } - swiCopy(tmp, addr, stride | COPY_MODE_HWORD); + CopyHWords(tmp, addr, stride); } } else if (tex_fmt == GL_RGB256) { stride = bmp->width >> 1; @@ -429,14 +437,14 @@ GfxResourceID Gfx_AllocTexture(struct Bitmap* bmp, int rowWidth, cc_uint8 flags, { tmp[x] = FindInPalette(palette, pal_count, row[x]); } - swiCopy(tmp, addr, stride | COPY_MODE_HWORD); + CopyHWords(tmp, addr, stride); } } else { stride = bmp->width; for (int y = 0; y < bmp->height; y++, addr += stride) { cc_uint16* src = bmp->scan0 + y * rowWidth; - swiCopy(src, addr, stride | COPY_MODE_HWORD); + CopyHWords(src, addr, stride); } } @@ -455,7 +463,7 @@ GfxResourceID Gfx_AllocTexture(struct Bitmap* bmp, int rowWidth, cc_uint8 flags, offset = tex->palBase * PAL_BLOCK_SIZE; vramSetBankE(VRAM_E_LCD); - swiCopy(palette, (u8*)VRAM_E + offset, pal_count | COPY_MODE_HWORD); + CopyHWords(palette, (u8*)VRAM_E + offset, pal_count); vramSetBankE(VRAM_E_TEX_PALETTE); tex->palFormat = tex_fmt == GL_RGB4 ? (offset >> 3) : (offset >> 4); diff --git a/src/Graphics_WiiU.c b/src/Graphics_WiiU.c index af248cfda..9ece00fbd 100644 --- a/src/Graphics_WiiU.c +++ b/src/Graphics_WiiU.c @@ -303,60 +303,26 @@ void* Gfx_LockDynamicVb(GfxResourceID vb, VertexFormat fmt, int count) { void Gfx_UnlockDynamicVb(GfxResourceID vb) { Gfx_UnlockVb(vb); Gfx_BindVb(vb); } -/*########################################################################################################################* -*-----------------------------------------------------Vertex rendering----------------------------------------------------* -*#########################################################################################################################*/ -void Gfx_SetVertexFormat(VertexFormat fmt) { - if (fmt == gfx_format) return; - gfx_format = fmt; - gfx_stride = strideSizes[fmt]; - - group = fmt == VERTEX_FORMAT_TEXTURED ? &textureShader : &colorShader; - GX2SetFetchShader(&group->fetchShader); - GX2SetVertexShader(group->vertexShader); - GX2SetPixelShader(group->pixelShader); -} - -void Gfx_DrawVb_Lines(int verticesCount) { - BindPendingTexture(); - GX2DrawEx(GX2_PRIMITIVE_MODE_LINES, verticesCount, 0, 1); -} - -void Gfx_DrawVb_IndexedTris(int verticesCount) { - BindPendingTexture(); - GX2DrawEx(GX2_PRIMITIVE_MODE_QUADS, verticesCount, 0, 1); -} - -void Gfx_DrawVb_IndexedTris_Range(int verticesCount, int startVertex, DrawHints hints) { - BindPendingTexture(); - GX2DrawEx(GX2_PRIMITIVE_MODE_QUADS, verticesCount, startVertex, 1); -} - -void Gfx_DrawIndexedTris_T2fC4b(int verticesCount, int startVertex) { - BindPendingTexture(); - GX2DrawEx(GX2_PRIMITIVE_MODE_QUADS, verticesCount, startVertex, 1); -} - - /*########################################################################################################################* *---------------------------------------------------------Matrices--------------------------------------------------------* *#########################################################################################################################*/ static struct Matrix _view, _proj; +static struct Matrix _mvp __attribute__((aligned(64))); + void Gfx_LoadMatrix(MatrixType type, const struct Matrix* matrix) { if (type == MATRIX_VIEW) _view = *matrix; if (type == MATRIX_PROJ) _proj = *matrix; // TODO dirty uniform - struct Matrix mvp __attribute__((aligned(64))); - Matrix_Mul(&mvp, &_view, &_proj); + Matrix_Mul(&_mvp, &_view, &_proj); if (!group) return; - GX2SetVertexUniformReg(group->vertexShader->uniformVars[0].offset, 16, &mvp); + GX2SetVertexUniformReg(group->vertexShader->uniformVars[0].offset, 16, &_mvp); } void Gfx_LoadMVP(const struct Matrix* view, const struct Matrix* proj, struct Matrix* mvp) { Gfx_LoadMatrix(MATRIX_VIEW, view); Gfx_LoadMatrix(MATRIX_PROJ, proj); - Matrix_Mul(mvp, view, proj); + Mem_Copy(&_mvp, mvp, sizeof(struct Matrix)); } void Gfx_EnableTextureOffset(float x, float y) { @@ -396,6 +362,43 @@ void Gfx_CalcPerspectiveMatrix(struct Matrix* matrix, float fov, float aspect, f } +/*########################################################################################################################* +*-----------------------------------------------------Vertex rendering----------------------------------------------------* +*#########################################################################################################################*/ +void Gfx_SetVertexFormat(VertexFormat fmt) { + if (fmt == gfx_format) return; + gfx_format = fmt; + gfx_stride = strideSizes[fmt]; + + group = fmt == VERTEX_FORMAT_TEXTURED ? &textureShader : &colorShader; + GX2SetFetchShader(&group->fetchShader); + GX2SetVertexShader(group->vertexShader); + GX2SetPixelShader(group->pixelShader); + + GX2SetVertexUniformReg(group->vertexShader->uniformVars[0].offset, 16, &_mvp); +} + +void Gfx_DrawVb_Lines(int verticesCount) { + BindPendingTexture(); + GX2DrawEx(GX2_PRIMITIVE_MODE_LINES, verticesCount, 0, 1); +} + +void Gfx_DrawVb_IndexedTris(int verticesCount) { + BindPendingTexture(); + GX2DrawEx(GX2_PRIMITIVE_MODE_QUADS, verticesCount, 0, 1); +} + +void Gfx_DrawVb_IndexedTris_Range(int verticesCount, int startVertex, DrawHints hints) { + BindPendingTexture(); + GX2DrawEx(GX2_PRIMITIVE_MODE_QUADS, verticesCount, startVertex, 1); +} + +void Gfx_DrawIndexedTris_T2fC4b(int verticesCount, int startVertex) { + BindPendingTexture(); + GX2DrawEx(GX2_PRIMITIVE_MODE_QUADS, verticesCount, startVertex, 1); +} + + /*########################################################################################################################* *-----------------------------------------------------------Misc----------------------------------------------------------* *#########################################################################################################################*/ diff --git a/src/Window_WiiU.c b/src/Window_WiiU.c index 203225701..963590596 100644 --- a/src/Window_WiiU.c +++ b/src/Window_WiiU.c @@ -104,6 +104,7 @@ void Window_Free(void) { } #define OSSCREEN_TV_HEIGHT 720 #define OSSCREEN_DRC_WIDTH 854 #define OSSCREEN_DRC_HEIGHT 480 + static void LauncherInactiveChanged(void* obj); static void Init2DResources(void);