- Start work on drawlist

- Fix issue in texloader
- add ivec2 to tecloader / screen
- add draw func for iron
- add bufCfg in 3 variants to c3d
- add poc for c3d_permutation
This commit is contained in:
2025-11-24 14:25:35 +01:00
parent f0117e07d4
commit a9eed546b9
14 changed files with 212 additions and 20 deletions

View File

@@ -12,6 +12,8 @@ const auto DISPLAY_TRANSFER_FLAGS =
GX_TRANSFER_OUT_FORMAT(GX_TRANSFER_FMT_RGB8) |
GX_TRANSFER_SCALING(GX_TRANSFER_SCALE_NO);
C3D_TexEnv* c3d::frag::m_env = nullptr;
int c3d::m_drawcalls = 0;
int c3d::m__dc__ = 0;
void c3d::init() { C3D_Init(C3D_DEFAULT_CMDBUF_SIZE); }
@@ -19,9 +21,13 @@ void c3d::deinit() { C3D_Fini(); }
void c3d::startFrame(bool sync) {
C3D_FrameBegin(sync ? C3D_FRAME_SYNCDRAW : C3D_FRAME_NONBLOCK);
m__dc__ = 0;
}
void c3d::endFrame() { C3D_FrameEnd(0); }
void c3d::endFrame() {
C3D_FrameEnd(0);
m_drawcalls = m__dc__;
}
c3d::screen* c3d::createScreen(gfxScreen_t screen, gfx3dSide_t side) {
auto t = C3D_RenderTargetCreate(240, screen == GFX_TOP ? 400 : 320,
@@ -39,7 +45,8 @@ c3d::shader::~shader() {}
void c3d::shader::load(const std::string& path) {
auto code = utils::loadFile2Mem(path);
if (!code.size()) {
throw std::runtime_error("[amy] shader: unable to load " + path);
throw std::runtime_error(
std::format("[amy] unsable to load shader ({})", path));
}
load(code);
}
@@ -58,6 +65,10 @@ void c3d::shader::compile(const std::string& code) {
}
void c3d::shader::use() {
C3D_BindProgram(&m_program);
// for some reason i need both ???
// code works perfectly without C3D_BindProgram
// but nor withour shaderProgramUse ...
shaderProgramUse(&m_program);
C3D_SetAttrInfo(&m_info);
}
@@ -92,10 +103,32 @@ void c3d::frag::edit(int id) {
void c3d::drawArrays(int start, int count, GPU_Primitive_t prim) {
C3D_DrawArrays(prim, start, count);
m__dc__++;
}
void c3d::drawElements(int count, const void* idx_ptr, int type,
GPU_Primitive_t prim) {
C3D_DrawElements(prim, count, type, idx_ptr);
m__dc__++;
}
void c3d::depthTest(bool on, GPU_TESTFUNC func, GPU_WRITEMASK mask) {
C3D_DepthTest(on, func, mask);
}
void c3d::disableScissor() { C3D_SetScissor(GPU_SCISSOR_DISABLE, 0, 0, 0, 0); }
void c3d::enableScissor(const ivec4 rect) {
C3D_SetScissor(GPU_SCISSOR_NORMAL, rect.x, rect.y, rect.z, rect.w);
}
void c3d::bufCfg(void* ptr, int stride, int shader_attribs, u64 permutation) {
auto buf = C3D_GetBufInfo();
BufInfo_Init(buf);
BufInfo_Add(buf, ptr, stride, shader_attribs, permutation);
}
void c3d::bufCfg(void* ptr, int stride, int shader_attribs) {
bufCfg(ptr, stride, shader_attribs, permutation(shader_attribs));
}
} // namespace amy