diff --git a/CMakeLists.txt b/CMakeLists.txt index 3592c88..e8a3ec7 100644 --- a/CMakeLists.txt +++ b/CMakeLists.txt @@ -30,6 +30,9 @@ set(INSTALL_PKGCONFIG_DIR "${GSKIT}/lib/pkgconfig" CACHE PATH "Installation dire set(GSKIT_EXTERNAL_LIBS "") set(GSKIT_EXTERNAL_INCLUDES "") +# Enable interprocedural optimization LTO +set(CMAKE_INTERPROCEDURAL_OPTIMIZATION TRUE) + set(CUR_GIT_TAG v0.0.0) find_package(Git) if(GIT_FOUND) @@ -125,6 +128,8 @@ add_object_library_macros(GS_CORE_OBJS ee/gs/src/gsCore.c gsKit_remove_vsync_handler gsKit_add_hsync_handler gsKit_remove_hsync_handler + gsKit_add_finish_handler + gsKit_remove_finish_handler gsKit_clear gsKit_set_scissor gsKit_set_test diff --git a/ee/gs/include/gsCore.h b/ee/gs/include/gsCore.h index 972d600..e76c453 100644 --- a/ee/gs/include/gsCore.h +++ b/ee/gs/include/gsCore.h @@ -152,6 +152,12 @@ int gsKit_add_hsync_handler(int (*hsync_callback)()); /// Removes a hsync interrupt handler void gsKit_remove_hsync_handler(int callback_id); +/// Installs a finish interrupt handler +int gsKit_add_finish_handler(int (*finish_callback)()); + +/// Removes a finish interrupt handler +void gsKit_remove_finish_handler(int callback_id); + /// Sets gsGlobal->EvenOrOdd depending on current field drawing void gsKit_get_field(GSGLOBAL *gsGlobal); diff --git a/ee/gs/src/gsCore.c b/ee/gs/src/gsCore.c index 095eea4..ef66214 100644 --- a/ee/gs/src/gsCore.c +++ b/ee/gs/src/gsCore.c @@ -252,6 +252,34 @@ void gsKit_remove_hsync_handler(int callback_id) } #endif +#if F_gsKit_add_finish_handler +int gsKit_add_finish_handler(int (*finish_callback)()) +{ + int callback_id; + + DIntr(); + callback_id = AddIntcHandler(INTC_GS, finish_callback, 0); + EnableIntc(INTC_GS); + // Unmask Finish interrupt + GsPutIMR(GsGetIMR() & ~0x0200); + EIntr(); + + return callback_id; +} +#endif + +#if F_gsKit_remove_finish_handler +void gsKit_remove_finish_handler(int callback_id) +{ + DIntr(); + // Mask HSync interrupt + GsPutIMR(GsGetIMR() | 0x0200); + DisableIntc(INTC_GS); + RemoveIntcHandler(INTC_GS, callback_id); + EIntr(); +} +#endif + #if F_gsKit_clear #define MIN(X, Y) (((X) < (Y)) ? (X) : (Y)) void gsKit_clear(GSGLOBAL *gsGlobal, u64 color)