diff --git a/examples/03_objects/main.c b/examples/03_objects/main.c index 8e99dfc9..3e730e6f 100644 --- a/examples/03_objects/main.c +++ b/examples/03_objects/main.c @@ -172,8 +172,6 @@ int main() t3d_matrix_pop(1); // ======== Draw (2D) ======== // - rdpq_sync_pipe(); - int totalTris = 0; for(int i=0; imaterial->name[0] == '_' ? 1 : 0; if(noDepth != lastNoDepth) { - rdpq_sync_pipe(); if(noDepth) { rdpq_change_other_modes_raw(SOM_ZMODE_MASK | SOM_Z_COMPARE | SOM_Z_WRITE, 0); } else { diff --git a/examples/22_bigtex/src/scene/scene.cpp b/examples/22_bigtex/src/scene/scene.cpp index 888db4d0..fbaba70e 100644 --- a/examples/22_bigtex/src/scene/scene.cpp +++ b/examples/22_bigtex/src/scene/scene.cpp @@ -94,7 +94,6 @@ void Scene::draw(const Memory::FrameBuffers &buffers, surface_t *surf) skybox.draw(); if(state.drawMap)mapModel.draw(); - rdpq_sync_pipe(); rdpq_mode_zbuf(false, false); // Second draw, if shading is enabled, this will draw the lighting + vertex colors into a different buffer @@ -105,13 +104,10 @@ void Scene::draw(const Memory::FrameBuffers &buffers, surface_t *surf) rdpq_fill_rectangle(0,0, SCREEN_WIDTH, SCREEN_HEIGHT); rdpq_mode_pop(); mapModel.drawShade(); - rdpq_sync_pipe(); } t3d_matrix_pop(1); - rdpq_sync_tile(); - rdpq_sync_load(); rdpq_set_color_image(surf); rdpq_set_mode_standard(); diff --git a/examples/23_hdr/main.c b/examples/23_hdr/main.c index 2bc4c524..860fb11a 100644 --- a/examples/23_hdr/main.c +++ b/examples/23_hdr/main.c @@ -134,7 +134,6 @@ int main() rspq_block_begin(); t3d_matrix_set(modelMatFP, true); - rdpq_sync_pipe(); rdpq_mode_antialias(AA_STANDARD); // then all objects with depth @@ -248,23 +247,20 @@ int main() t3d_light_set_exposure(exposure); t3d_matrix_push(t3d_segment_address(1, rotMatFP)); - rdpq_sync_pipe(); + skydome_set_viewport(sky, &viewport); skydome_cloud_pass(sky, display_get_delta_time() * 1000); // move the clouds with time - rdpq_sync_pipe(); + // Draw sky without any depth first rdpq_mode_zbuf(false, false); rdpq_mode_antialias(AA_NONE); - rdpq_sync_pipe(); + skydome_draw(sky); // draw the main halfsphere first with no zbuf - rdpq_sync_pipe(); + t3d_light_set_ambient(colorAmbient); t3d_light_set_count(0); - rdpq_sync_pipe(); + rspq_block_run(model->userBlock); - rdpq_sync_pipe(); - rdpq_sync_tile(); - rdpq_sync_load(); //rdpq_text_printf(NULL, 1, 240, 210, "%llu", TICKS_TO_US(ticks)); //rdpq_text_printf(NULL, 1, 260, 220, "%.2f", display_get_fps()); diff --git a/examples/23_hdr/skydome.c b/examples/23_hdr/skydome.c index 7259d9fb..f84135a6 100644 --- a/examples/23_hdr/skydome.c +++ b/examples/23_hdr/skydome.c @@ -166,7 +166,7 @@ void skydome_draw(skydome_t* skydome){ rdpq_set_blend_color(skydome->color.clouds); rdpq_set_fog_color(skydome->color.fog); - rdpq_sync_pipe(); + if(!skydome->__vars.modelblock) { rspq_block_begin(); rdpq_mode_mipmap(MIPMAP_NONE, 0); @@ -180,15 +180,13 @@ void skydome_draw(skydome_t* skydome){ rdpq_mode_antialias(AA_NONE); rdpq_mode_zbuf(false,false); - rdpq_sync_pipe(); + t3d_model_draw_object(obj, NULL); - rdpq_sync_pipe(); skydome->__vars.modelblock = rspq_block_end(); } // for the actual draw, you can use the generic rspq-api. rspq_block_run(skydome->__vars.modelblock); - rdpq_sync_pipe(); t3d_frame_start(); } diff --git a/examples/24_hdr_bloom/src/actors/pointGlobe.cpp b/examples/24_hdr_bloom/src/actors/pointGlobe.cpp index 5317d5bf..d77ccc91 100644 --- a/examples/24_hdr_bloom/src/actors/pointGlobe.cpp +++ b/examples/24_hdr_bloom/src/actors/pointGlobe.cpp @@ -54,8 +54,6 @@ namespace Actor ptTex = sprite_load("rom:/spheres.i8.sprite"); rspq_block_begin(); - rdpq_sync_pipe(); - rdpq_sync_tile(); rdpq_mode_combiner(RDPQ_COMBINER1((PRIM,0,TEX0,0), (0,0,0,TEX0))); rdpq_mode_zbuf(true, true); diff --git a/examples/24_hdr_bloom/src/main.cpp b/examples/24_hdr_bloom/src/main.cpp index dd1580ff..519d97fd 100644 --- a/examples/24_hdr_bloom/src/main.cpp +++ b/examples/24_hdr_bloom/src/main.cpp @@ -134,15 +134,11 @@ int main() postProc[frameIdx].endFrame(); auto surfBlur = postProc[frameIdxLast].applyEffects(*fb); - rdpq_sync_pipe(); rdpq_set_color_image(fb); // Debug: show last offscreen buffer (downscaled and/or blur) if(state.showOffscreen) { - rdpq_sync_tile(); - rdpq_sync_load(); - rdpq_set_mode_standard(); rdpq_mode_combiner(RDPQ_COMBINER_TEX); rdpq_mode_blender(0); diff --git a/examples/24_hdr_bloom/src/postProcess.cpp b/examples/24_hdr_bloom/src/postProcess.cpp index 04bb80c2..0f438152 100644 --- a/examples/24_hdr_bloom/src/postProcess.cpp +++ b/examples/24_hdr_bloom/src/postProcess.cpp @@ -49,8 +49,6 @@ void PostProcess::endFrame() if(!blockRDPScale) { rspq_block_begin(); - rdpq_sync_pipe(); - rdpq_sync_load(); rdpq_set_mode_standard(); rdpq_mode_begin(); diff --git a/examples/24_hdr_bloom/src/render/debugDraw.cpp b/examples/24_hdr_bloom/src/render/debugDraw.cpp index 8b9f188f..59f08416 100644 --- a/examples/24_hdr_bloom/src/render/debugDraw.cpp +++ b/examples/24_hdr_bloom/src/render/debugDraw.cpp @@ -14,10 +14,6 @@ void Debug::init() { font = sprite_load("rom:/font.ia4.sprite"); rspq_block_begin(); - rdpq_sync_pipe(); - rdpq_sync_tile(); - rdpq_sync_load(); - rdpq_mode_begin(); rdpq_set_mode_standard(); rdpq_mode_blender(0); diff --git a/examples/24_hdr_bloom/src/scene/scene.cpp b/examples/24_hdr_bloom/src/scene/scene.cpp index 91d9b762..1b2ceb48 100644 --- a/examples/24_hdr_bloom/src/scene/scene.cpp +++ b/examples/24_hdr_bloom/src/scene/scene.cpp @@ -32,8 +32,6 @@ void Scene::draw(float deltaTime) t3d_matrix_pop(1); // particles - rdpq_sync_pipe(); - rdpq_mode_begin(); rdpq_mode_zbuf(true, true); rdpq_mode_zoverride(true, 0, 0); diff --git a/examples/24_hdr_bloom/src/scene/scenes/sceneMagic.cpp b/examples/24_hdr_bloom/src/scene/scenes/sceneMagic.cpp index d1678839..0da48693 100644 --- a/examples/24_hdr_bloom/src/scene/scenes/sceneMagic.cpp +++ b/examples/24_hdr_bloom/src/scene/scenes/sceneMagic.cpp @@ -109,7 +109,6 @@ void SceneMagic::draw3D(float deltaTime) rspq_block_run(objSky->userBlock); // Main map mesh - rdpq_sync_pipe(); rdpq_mode_zbuf(true, true); t3d_matrix_set(mapMatFP, true); diff --git a/examples/24_hdr_bloom/src/scene/scenes/scenePixel.cpp b/examples/24_hdr_bloom/src/scene/scenes/scenePixel.cpp index bd878edb..93f2d11e 100644 --- a/examples/24_hdr_bloom/src/scene/scenes/scenePixel.cpp +++ b/examples/24_hdr_bloom/src/scene/scenes/scenePixel.cpp @@ -135,7 +135,6 @@ void ScenePixel::draw3D(float deltaTime) rspq_block_run(objSky->userBlock); // Main map mesh - rdpq_sync_pipe(); rdpq_mode_zbuf(true, true); rdpq_set_prim_color({0xFF, 0xFF, 0xFF, 0xFF}); rdpq_set_env_color({0xFF, 0xFF, 0xFF, (uint8_t)(doCutout ? 0x00 : 0x70)}); diff --git a/examples/99_testscene/main.c b/examples/99_testscene/main.c index 21bdf7d9..9ace5273 100644 --- a/examples/99_testscene/main.c +++ b/examples/99_testscene/main.c @@ -18,12 +18,7 @@ int main() { profile_data.frame_count = 0; - // @TODO: game random slows down under different code. - // investigate what part of the shifting code/data is causing this - #if RSPQ_PROFILE == 1 - debug_init_isviewer(); - debug_init_usblog(); - #endif + debug_init_isviewer(); asset_init_compression(2); diff --git a/src/t3d/t3d.c b/src/t3d/t3d.c index c76d9739..1d753752 100644 --- a/src/t3d/t3d.c +++ b/src/t3d/t3d.c @@ -6,6 +6,9 @@ #include "rsp/rsp_tiny3d.h" #include +// @TODO: temporary hack until libdragon exposes an official API +extern void __rdpq_autosync_use(uint32_t res); + _Static_assert((RSP_T3D_RSPQ_SCRATCH_MEM & 0xFFFF) == 0x80, "Scratch-Memory location changed!"); _Static_assert(RSP_T3D_BSS_TEMP_STATE_MEM_END == RSP_T3D_CLIP_BSS_TEMP_STATE_MEM_END, "Overlay data doesn't match!"); _Static_assert(RSP_T3D_CODE_RDPQ_Triangle_Send_Async == RSP_T3D_CODE_CLIP_RDPQ_Triangle_Send_Async, "Overlay code doesn't match!"); @@ -376,6 +379,8 @@ void t3d_tri_draw(uint32_t v0, uint32_t v1, uint32_t v2) v1 += RSP_T3D_VERT_BUFFER & 0xFFFF; v2 += RSP_T3D_VERT_BUFFER & 0xFFFF; + __rdpq_autosync_use(AUTOSYNC_PIPE | AUTOSYNC_TILES | AUTOSYNC_TMEM(0)); + uint32_t v12 = (v1 << 16) | v2; rdpq_write(-1, T3D_RSP_ID, T3D_CMD_TRI_DRAW, v0, v12 @@ -395,6 +400,7 @@ static void t3d_tri_draw_sequence(uint32_t baseVertex, uint8_t polyCount, bool i // increment per step (+ 3*VERT_OUTPUT_SIZE), also serves as a flag for tri vs. quad baseVertexEnd |= (VERT_OUTPUT_SIZE * (isQuad ? 1 : 0)) << 16; + __rdpq_autosync_use(AUTOSYNC_PIPE | AUTOSYNC_TILES | AUTOSYNC_TMEM(0)); rdpq_write(-1, T3D_RSP_ID, T3D_CMD_TRI_SEQ, baseVertex, baseVertexEnd); } @@ -415,6 +421,7 @@ inline static void t3d_tri_draw_strip_generic(int16_t* indexBuff, int count, boo dmemAddr &= ~7; // align start to 8 bytes dmemAddr |= (doSync ? 0x8000 : 0); // make negative if we want to sync + __rdpq_autosync_use(AUTOSYNC_PIPE | AUTOSYNC_TILES | AUTOSYNC_TMEM(0)); rdpq_write(-1, T3D_RSP_ID, T3D_CMD_TRI_STRIP, loadAddr, (dmemAddr << 16) | ((count*2-1) & 0xFFFF) ); diff --git a/src/t3d/t3ddebug.c b/src/t3d/t3ddebug.c index 8953a385..33921b8a 100644 --- a/src/t3d/t3ddebug.c +++ b/src/t3d/t3ddebug.c @@ -15,10 +15,6 @@ void t3d_debug_print_init() { } void t3d_debug_print_start() { - rdpq_sync_pipe(); - rdpq_sync_tile(); - rdpq_sync_load(); - rdpq_set_mode_standard(); rdpq_mode_antialias(AA_NONE); rdpq_mode_combiner(RDPQ_COMBINER1((TEX0,0,PRIM,0), (TEX0,0,PRIM,0))); diff --git a/src/t3d/t3dmodel.c b/src/t3d/t3dmodel.c index d232785b..7a47b1a6 100644 --- a/src/t3d/t3dmodel.c +++ b/src/t3d/t3dmodel.c @@ -152,7 +152,6 @@ static void set_texture(T3DMaterial *mat, rdpq_tile_t tile, T3DModelDrawConf *co if(tex->texReference) { if(conf && conf->dynTextureCb)conf->dynTextureCb(conf->userData, mat, &texParam, tile); } else { - rdpq_sync_tile(); if(tile == TILE1 && mat->textureA.textureHash == mat->textureB.textureHash) { rdpq_tex_reuse(TILE1, &texParam); } else { @@ -395,15 +394,10 @@ void t3d_model_draw_material(T3DMaterial *mat, T3DModelState *state) bool setBlendColor = (mat->setColorFlags & 0b100) || (mat->otherModeValue & SOM_ALPHACOMPARE_THRESHOLD); setBlendColor = setBlendColor && color_to_packed32(state->lastBlendColor) != color_to_packed32(mat->blendColor); - if(setBlendMode || setCC || setOtherMode || setTexture) { - rdpq_sync_pipe(); - } - if(setTexture) { state->lastTextureHashA = mat->textureA.textureHash; state->lastTextureHashB = mat->textureB.textureHash; - rdpq_sync_load(); rdpq_tex_multi_begin(); set_texture(mat, TILE0, state->drawConf); diff --git a/src/t3d/tpx.c b/src/t3d/tpx.c index 8c361a2b..f64e412e 100644 --- a/src/t3d/tpx.c +++ b/src/t3d/tpx.c @@ -12,6 +12,9 @@ extern rsp_ucode_t rsp_tiny3d; DEFINE_RSP_UCODE(rsp_tinypx); uint32_t TPX_RSP_ID = 0; +// @TODO: temporary hack until libdragon exposes an official API +extern void __rdpq_autosync_use(uint32_t res); + #define SWAP_VALUE(a, b) {auto tmp = a; a = b; b = tmp;} #define MAX_PARTICLES_S8 344 #define MAX_PARTICLES_S16 228 @@ -112,18 +115,22 @@ inline static void tpx_particle_draw_generic_s16(TPXParticleS16 *particles, uint } void tpx_particle_draw_s8(TPXParticleS8 *particles, uint32_t count) { + __rdpq_autosync_use(AUTOSYNC_PIPE); tpx_particle_draw_generic_s8(particles, count, TPX_CMD_DRAW_COLOR); } void tpx_particle_draw_s16(TPXParticleS16 *particles, uint32_t count) { + __rdpq_autosync_use(AUTOSYNC_PIPE); tpx_particle_draw_generic_s16(particles, count, TPX_CMD_DRAW_COLOR); } void tpx_particle_draw_tex_s8(TPXParticleS8 *particles, uint32_t count) { + __rdpq_autosync_use(AUTOSYNC_PIPE | AUTOSYNC_TILES | AUTOSYNC_TMEM(0)); tpx_particle_draw_generic_s8(particles, count, TPX_CMD_DRAW_TEXTURE); } void tpx_particle_draw_tex_s16(TPXParticleS16 *particles, uint32_t count) { + __rdpq_autosync_use(AUTOSYNC_PIPE | AUTOSYNC_TILES | AUTOSYNC_TMEM(0)); tpx_particle_draw_generic_s16(particles, count, TPX_CMD_DRAW_TEXTURE); }