Skip to content

Commit

Permalink
Added support for 800px wide mode
Browse files Browse the repository at this point in the history
  • Loading branch information
Gericom committed Jul 30, 2020
1 parent 3c7c15a commit bff447b
Show file tree
Hide file tree
Showing 3 changed files with 88 additions and 22 deletions.
84 changes: 69 additions & 15 deletions src/pc/gfx/gfx_3ds.c
Expand Up @@ -4,24 +4,41 @@
#include <citro3d.h>
#include "gfx_3ds.h"

#ifdef N3DS_USE_ANTIALIASING
// #define DISPLAY_TRANSFER_FLAGS_NORMAL \
// (GX_TRANSFER_FLIP_VERT(0) | GX_TRANSFER_OUT_TILED(0) | GX_TRANSFER_RAW_COPY(0) | \
// GX_TRANSFER_IN_FORMAT(GX_TRANSFER_FMT_RGBA8) | GX_TRANSFER_OUT_FORMAT(GX_TRANSFER_FMT_RGB8) | \
// GX_TRANSFER_SCALING(GX_TRANSFER_SCALE_NONE))

#define DISPLAY_TRANSFER_FLAGS \
(GX_TRANSFER_FLIP_VERT(0) | GX_TRANSFER_OUT_TILED(0) | GX_TRANSFER_RAW_COPY(0) | \
GX_TRANSFER_IN_FORMAT(GX_TRANSFER_FMT_RGBA8) | GX_TRANSFER_OUT_FORMAT(GX_TRANSFER_FMT_RGB8) | \
GX_TRANSFER_SCALING(GX_TRANSFER_SCALE_XY))
// #define DISPLAY_TRANSFER_FLAGS_AA_12 \
// (GX_TRANSFER_FLIP_VERT(0) | GX_TRANSFER_OUT_TILED(0) | GX_TRANSFER_RAW_COPY(0) | \
// GX_TRANSFER_IN_FORMAT(GX_TRANSFER_FMT_RGBA8) | GX_TRANSFER_OUT_FORMAT(GX_TRANSFER_FMT_RGB8) | \
// GX_TRANSFER_SCALING(GX_TRANSFER_SCALE_X))

#else
// #define DISPLAY_TRANSFER_FLAGS_AA_22 \
// (GX_TRANSFER_FLIP_VERT(0) | GX_TRANSFER_OUT_TILED(0) | GX_TRANSFER_RAW_COPY(0) | \
// GX_TRANSFER_IN_FORMAT(GX_TRANSFER_FMT_RGBA8) | GX_TRANSFER_OUT_FORMAT(GX_TRANSFER_FMT_RGB8) | \
// GX_TRANSFER_SCALING(GX_TRANSFER_SCALE_XY))

#define DISPLAY_TRANSFER_FLAGS \
(GX_TRANSFER_FLIP_VERT(0) | GX_TRANSFER_OUT_TILED(0) | GX_TRANSFER_RAW_COPY(0) | \
GX_TRANSFER_IN_FORMAT(GX_TRANSFER_FMT_RGBA8) | GX_TRANSFER_OUT_FORMAT(GX_TRANSFER_FMT_RGB8) | \
GX_TRANSFER_SCALING(GX_TRANSFER_SCALE_NONE))
// #ifdef N3DS_USE_ANTIALIASING

#endif
// #define DISPLAY_TRANSFER_FLAGS \
// (GX_TRANSFER_FLIP_VERT(0) | GX_TRANSFER_OUT_TILED(0) | GX_TRANSFER_RAW_COPY(0) | \
// GX_TRANSFER_IN_FORMAT(GX_TRANSFER_FMT_RGBA8) | GX_TRANSFER_OUT_FORMAT(GX_TRANSFER_FMT_RGB8) | \
// GX_TRANSFER_SCALING(GX_TRANSFER_SCALE_XY))

// #else

// #define DISPLAY_TRANSFER_FLAGS \
// (GX_TRANSFER_FLIP_VERT(0) | GX_TRANSFER_OUT_TILED(0) | GX_TRANSFER_RAW_COPY(0) | \
// GX_TRANSFER_IN_FORMAT(GX_TRANSFER_FMT_RGBA8) | GX_TRANSFER_OUT_FORMAT(GX_TRANSFER_FMT_RGB8) | \
// GX_TRANSFER_SCALING(GX_TRANSFER_SCALE_NONE))

// #endif

static C3D_RenderTarget* sTarget;

Gfx3DSMode gGfx3DSMode;

static bool checkN3DS()
{
bool isNew3DS = false;
Expand All @@ -40,12 +57,49 @@ static void gfx_3ds_init(void)
gfxInitDefault();
consoleInit(GFX_BOTTOM, NULL);
C3D_Init(C3D_DEFAULT_CMDBUF_SIZE);

bool useAA = false;
#ifdef N3DS_USE_ANTIALIASING
sTarget = C3D_RenderTargetCreate(240*2, 400*2, GPU_RB_RGBA8, GPU_RB_DEPTH24_STENCIL8);
#else
sTarget = C3D_RenderTargetCreate(240, 400, GPU_RB_RGBA8, GPU_RB_DEPTH24_STENCIL8);
useAA = true;
#endif
C3D_RenderTargetSetOutput(sTarget, GFX_TOP, GFX_LEFT, DISPLAY_TRANSFER_FLAGS);
bool useWide = false;
#ifdef N3DS_USE_WIDE_800PX
u8 model;
CFGU_GetSystemModel(&model);
useWide = model != 3; //wide is not possible on o2ds
#endif

u32 transferFlags =
GX_TRANSFER_FLIP_VERT(0) |
GX_TRANSFER_OUT_TILED(0) |
GX_TRANSFER_RAW_COPY(0) |
GX_TRANSFER_IN_FORMAT(GX_TRANSFER_FMT_RGBA8) |
GX_TRANSFER_OUT_FORMAT(GX_TRANSFER_FMT_RGB8);

if (useAA && !useWide)
transferFlags |= GX_TRANSFER_SCALING(GX_TRANSFER_SCALE_XY);
else if (useAA && useWide)
transferFlags |= GX_TRANSFER_SCALING(GX_TRANSFER_SCALE_X);
else
transferFlags |= GX_TRANSFER_SCALING(GX_TRANSFER_SCALE_NO);

int width = useAA || useWide ? 800 : 400;
int height = useAA ? 480 : 240;

sTarget = C3D_RenderTargetCreate(height, width, GPU_RB_RGBA8, GPU_RB_DEPTH24_STENCIL8);
C3D_RenderTargetSetOutput(sTarget, GFX_TOP, GFX_LEFT, transferFlags);

if (!useAA && !useWide)
gGfx3DSMode = GFX_3DS_MODE_NORMAL;
else if (useAA && !useWide)
gGfx3DSMode = GFX_3DS_MODE_AA_22;
else if (!useAA && useWide)
gGfx3DSMode = GFX_3DS_MODE_WIDE;
else
gGfx3DSMode = GFX_3DS_MODE_WIDE_AA_12;

if (useWide)
gfxSetWide(true);
}

static void gfx_3ds_main_loop(void (*run_one_game_iter)(void))
Expand Down
12 changes: 11 additions & 1 deletion src/pc/gfx/gfx_3ds.h
Expand Up @@ -4,7 +4,17 @@
#include "gfx_window_manager_api.h"

#define N3DS_USE_ANTIALIASING
#define N3DS_USE_WIDE_800PX

typedef enum
{
GFX_3DS_MODE_NORMAL,
GFX_3DS_MODE_AA_22,
GFX_3DS_MODE_WIDE,
GFX_3DS_MODE_WIDE_AA_12
} Gfx3DSMode;

extern struct GfxWindowManagerAPI gfx_3ds;
extern Gfx3DSMode gGfx3DSMode;

#endif
#endif
14 changes: 8 additions & 6 deletions src/pc/gfx/gfx_citro3d.c
Expand Up @@ -496,12 +496,14 @@ static void gfx_citro3d_set_viewport(int x, int y, int width, int height) {
C3D_SetViewport(x, y, width, height);
}

static void gfx_citro3d_set_scissor(int x, int y, int width, int height) {
#ifdef N3DS_USE_ANTIALIASING
C3D_SetScissor(GPU_SCISSOR_NORMAL, y * 2, x * 2, (y + height) * 2, (x + width) * 2);
#else
C3D_SetScissor(GPU_SCISSOR_NORMAL, y, x, y + height, x + width);
#endif
static void gfx_citro3d_set_scissor(int x, int y, int width, int height)
{
if (gGfx3DSMode == GFX_3DS_MODE_NORMAL)
C3D_SetScissor(GPU_SCISSOR_NORMAL, y, x, y + height, x + width);
else if (gGfx3DSMode == GFX_3DS_MODE_AA_22 || gGfx3DSMode == GFX_3DS_MODE_WIDE_AA_12)
C3D_SetScissor(GPU_SCISSOR_NORMAL, y * 2, x * 2, (y + height) * 2, (x + width) * 2);
else if (gGfx3DSMode == GFX_3DS_MODE_WIDE)
C3D_SetScissor(GPU_SCISSOR_NORMAL, y, x * 2, y + height, (x + width) * 2);
}

static void applyBlend()
Expand Down

0 comments on commit bff447b

Please sign in to comment.