diff --git a/nx/include/switch.h b/nx/include/switch.h index db30bdc4..7dda99f6 100644 --- a/nx/include/switch.h +++ b/nx/include/switch.h @@ -62,6 +62,7 @@ extern "C" { #include "switch/nvidia/channel.h" #include "switch/nvidia/info.h" #include "switch/nvidia/fence.h" +#include "switch/nvidia/rect.h" #include "switch/nvidia/gpu/cmd_list.h" #include "switch/nvidia/gpu/gpfifo.h" #include "switch/nvidia/gpu/zcull_ctx.h" @@ -73,6 +74,7 @@ extern "C" { #include "switch/nvidia/cmds/3d.h" #include "switch/nvidia/cmds/3d_init.h" #include "switch/nvidia/cmds/3d_rendertarget.h" +#include "switch/nvidia/cmds/3d_viewport.h" #include "switch/nvidia/cmds/3d_clear.h" #include "switch/runtime/env.h" diff --git a/nx/include/switch/nvidia/cmds/3d_viewport.h b/nx/include/switch/nvidia/cmds/3d_viewport.h new file mode 100644 index 00000000..856086f9 --- /dev/null +++ b/nx/include/switch/nvidia/cmds/3d_viewport.h @@ -0,0 +1,38 @@ +typedef struct { + float scale[3]; + float translate[3]; + u16_rect window; + float near; + float far; +} VnViewportConfig; + +static inline void vnViewportSetScale(VnViewportConfig* c, float x, float y, float z) { + c->scale[0] = x; + c->scale[1] = y; + c->scale[2] = z; +} + +static inline void vnViewportSetTranslate(VnViewportConfig* c, float x, float y, float z) { + c->translate[0] = x; + c->translate[1] = y; + c->translate[2] = z; +} + +static inline void vnViewportSetWindow(VnViewportConfig* c, u16_rect r) { + c->window = r; +} + +static inline void vnViewportSetDepth(VnViewportConfig* c, float near, float far) { + c->near = near; + c->far = far; +} + +static inline void vnViewportSetDefaults(VnViewportConfig* c) { + vnViewportSetScale(c, 0.5, 0.5, 0.5); + vnViewportSetTranslate(c, 0.5, 0.5, 0.5); + vnViewportSetWindow(c, (u16_rect) { 0, 0, 0xFFFF, 0xFFFF }); + vnViewportSetDepth(c, 0, 0); //? +} + +void vnSetViewport(Vn* vn, size_t index, VnViewportConfig* c); + diff --git a/nx/include/switch/nvidia/rect.h b/nx/include/switch/nvidia/rect.h new file mode 100644 index 00000000..6155cbf1 --- /dev/null +++ b/nx/include/switch/nvidia/rect.h @@ -0,0 +1,12 @@ +#define MAKE_RECT(type) \ + typedef struct { \ + type x; \ + type y; \ + type w; \ + type h; \ + } type##_rect; + +MAKE_RECT(u16); +MAKE_RECT(u32); +MAKE_RECT(float); +MAKE_RECT(double); diff --git a/nx/source/nvidia/cmds/3d_viewport.c b/nx/source/nvidia/cmds/3d_viewport.c new file mode 100644 index 00000000..a6698eb6 --- /dev/null +++ b/nx/source/nvidia/cmds/3d_viewport.c @@ -0,0 +1,28 @@ +#include +#include + +void vnSetViewport(Vn* vn, size_t index, VnViewportConfig* c) { + VnCmd( + vn, + NvIncr( + 0, + NvReg3D_ViewportScaleX(index), + c->scale[0], // ScaleX + c->scale[1], // ScaleY + c->scale[2], // ScaleZ + c->translate[0], // TranslateX + c->translate[1], // TranslateY + c->translate[2], // TranslateZ + 0, // Swizzles + 0 // SubpixelPrecisionBias + ), + NvIncr( + 0, + NvReg3D_ViewportHorizontal(index), + (c->window.w << 16) | c->window.x, + (c->window.h << 16) | c->window.y, + c->near, + c->far + ) + ); +}