From 1463c318e047b70d5c9cc81680050aa841a86d62 Mon Sep 17 00:00:00 2001 From: xhp-creations Date: Wed, 4 Jan 2017 14:19:26 -0500 Subject: [PATCH] RPX Channel RPX Channel --- Makefile | 66 +- README.md | 30 +- channel/code/app.xml | 11 + channel/code/cos.xml | 97 ++ channel/content/dummy | 1 + channel/meta/bootDrcTex.tga | Bin 0 -> 1229804 bytes channel/meta/bootLogoTex.tga | Bin 0 -> 28604 bytes channel/meta/bootMovie.h264 | Bin 0 -> 52530 bytes channel/meta/bootSound.btsnd | Bin 0 -> 450076 bytes channel/meta/bootTvTex.tga | Bin 0 -> 2764844 bytes channel/meta/iconTex.tga | Bin 0 -> 65580 bytes channel/meta/meta.xml | 140 +++ filelist.sh | 16 +- src/Application.cpp | 155 +++- src/Application.h | 13 +- src/common/common.h | 12 +- src/common/gx2_ext.h | 177 ++++ src/common/os_defs.h | 15 + src/common/types.h | 2 +- src/dynamic_libs/README.md | 2 - src/dynamic_libs/acp_functions.c | 40 - src/dynamic_libs/acp_functions.h | 42 - src/dynamic_libs/aoc_functions.c | 58 -- src/dynamic_libs/aoc_functions.h | 58 -- src/dynamic_libs/ax_functions.c | 118 --- src/dynamic_libs/ax_functions.h | 64 -- src/dynamic_libs/curl_functions.c | 54 -- src/dynamic_libs/curl_functions.h | 51 -- src/dynamic_libs/exports.h | 26 + src/dynamic_libs/fs_defs.h | 61 -- src/dynamic_libs/fs_functions.c | 131 --- src/dynamic_libs/fs_functions.h | 95 -- src/dynamic_libs/gx2_functions.c | 173 ---- src/dynamic_libs/gx2_functions.h | 211 ----- src/dynamic_libs/gx2_types.h | 699 --------------- src/dynamic_libs/os_functions.c | 326 ------- src/dynamic_libs/os_functions.h | 174 ---- src/dynamic_libs/os_types.h | 27 - src/dynamic_libs/padscore_functions.c | 19 +- src/dynamic_libs/padscore_functions.h | 55 +- src/dynamic_libs/socket_functions.c | 81 -- src/dynamic_libs/socket_functions.h | 108 --- src/dynamic_libs/sys_functions.c | 49 -- src/dynamic_libs/sys_functions.h | 47 - src/dynamic_libs/syshid_functions.c | 78 -- src/dynamic_libs/syshid_functions.h | 90 -- src/dynamic_libs/vpad_functions.c | 55 -- src/dynamic_libs/vpad_functions.h | 114 --- src/entry.c | 7 +- src/fs/CFile.cpp | 1 - src/fs/CFile.hpp | 4 +- src/fs/DirList.cpp | 17 +- src/fs/DirList.h | 7 +- src/fs/fs_utils.c | 11 +- src/fs/fs_utils.h | 2 +- src/fs/sd_fat_devoptab.c | 1019 ---------------------- src/fs/sd_fat_devoptab.h | 38 - src/gui/FreeTypeGX.cpp | 22 +- src/gui/FreeTypeGX.h | 3 +- src/gui/GameIcon.cpp | 24 +- src/gui/GridBackground.cpp | 6 +- src/gui/GuiButton.cpp | 35 +- src/gui/GuiButton.h | 4 +- src/gui/GuiElement.cpp | 1 - src/gui/GuiElement.h | 3 +- src/gui/GuiFrame.cpp | 115 ++- src/gui/GuiFrame.h | 13 +- src/gui/GuiImage.cpp | 8 +- src/gui/GuiImageAsync.cpp | 11 +- src/gui/GuiImageAsync.h | 7 +- src/gui/GuiImageData.cpp | 50 +- src/gui/GuiImageData.h | 9 +- src/gui/GuiParticleImage.cpp | 14 +- src/gui/GuiSound.cpp | 1 - src/gui/GuiSound.h | 4 +- src/gui/GuiText.cpp | 4 +- src/gui/GuiText.h | 1 + src/gui/GuiTrigger.cpp | 10 +- src/gui/GuiTrigger.h | 10 +- src/gui/VPadController.h | 23 +- src/kernel/kernel_functions.c | 49 -- src/kernel/kernel_functions.h | 19 - src/kernel/kernel_hooks.S | 136 --- src/kernel/syscalls.c | 255 ------ src/kernel/syscalls.h | 26 - src/kernel/syscalls_asm.S | 20 - src/link.ld | 5 +- src/main.cpp | 54 +- src/main.h | 3 +- src/menu/MainWindow.cpp | 2 - src/resources/Resources.cpp | 1 - src/resources/Resources.h | 2 +- src/resources/filelist.h | 128 ++- src/sounds/BufferCircle.cpp | 1 + src/sounds/BufferCircle.hpp | 2 +- src/sounds/Mp3Decoder.cpp | 2 +- src/sounds/OggDecoder.cpp | 1 - src/sounds/SoundDecoder.cpp | 3 +- src/sounds/SoundHandler.cpp | 30 +- src/sounds/SoundHandler.hpp | 2 +- src/sounds/Voice.h | 68 +- src/system/AsyncDeleter.cpp | 2 +- src/system/AsyncDeleter.h | 7 +- src/system/CMutex.h | 6 +- src/system/CThread.h | 22 +- src/system/exception_handler.c | 18 +- src/system/memory.c | 75 +- src/system/memory_area_table.c | 397 +++++++++ src/system/memory_area_table.h | 34 + src/utils/StringTools.cpp | 2 +- src/utils/StringTools.h | 2 +- src/utils/logger.c | 6 +- src/utils/utils.c | 17 + src/utils/utils.h | 2 + src/utils/utils_asm.S | 5 + src/video/CVideo.cpp | 164 ++-- src/video/CVideo.h | 28 +- src/video/shaders/ColorShader.cpp | 18 +- src/video/shaders/FXAAShader.cpp | 16 +- src/video/shaders/FXAAShader.h | 4 +- src/video/shaders/FetchShader.h | 8 +- src/video/shaders/PixelShader.h | 92 +- src/video/shaders/Shader.h | 33 +- src/video/shaders/Shader3D.cpp | 26 +- src/video/shaders/Shader3D.h | 4 +- src/video/shaders/ShaderFractalColor.cpp | 32 +- src/video/shaders/Texture2DShader.cpp | 24 +- src/video/shaders/Texture2DShader.h | 4 +- src/video/shaders/VertexShader.h | 102 +-- 129 files changed, 1849 insertions(+), 5435 deletions(-) create mode 100644 channel/code/app.xml create mode 100644 channel/code/cos.xml create mode 100644 channel/content/dummy create mode 100644 channel/meta/bootDrcTex.tga create mode 100644 channel/meta/bootLogoTex.tga create mode 100644 channel/meta/bootMovie.h264 create mode 100644 channel/meta/bootSound.btsnd create mode 100644 channel/meta/bootTvTex.tga create mode 100644 channel/meta/iconTex.tga create mode 100644 channel/meta/meta.xml create mode 100644 src/common/gx2_ext.h delete mode 100644 src/dynamic_libs/README.md delete mode 100644 src/dynamic_libs/acp_functions.c delete mode 100644 src/dynamic_libs/acp_functions.h delete mode 100644 src/dynamic_libs/aoc_functions.c delete mode 100644 src/dynamic_libs/aoc_functions.h delete mode 100644 src/dynamic_libs/ax_functions.c delete mode 100644 src/dynamic_libs/ax_functions.h delete mode 100644 src/dynamic_libs/curl_functions.c delete mode 100644 src/dynamic_libs/curl_functions.h create mode 100644 src/dynamic_libs/exports.h delete mode 100644 src/dynamic_libs/fs_defs.h delete mode 100644 src/dynamic_libs/fs_functions.c delete mode 100644 src/dynamic_libs/fs_functions.h delete mode 100644 src/dynamic_libs/gx2_functions.c delete mode 100644 src/dynamic_libs/gx2_functions.h delete mode 100644 src/dynamic_libs/gx2_types.h delete mode 100644 src/dynamic_libs/os_functions.c delete mode 100644 src/dynamic_libs/os_functions.h delete mode 100644 src/dynamic_libs/os_types.h delete mode 100644 src/dynamic_libs/socket_functions.c delete mode 100644 src/dynamic_libs/socket_functions.h delete mode 100644 src/dynamic_libs/sys_functions.c delete mode 100644 src/dynamic_libs/sys_functions.h delete mode 100644 src/dynamic_libs/syshid_functions.c delete mode 100644 src/dynamic_libs/syshid_functions.h delete mode 100644 src/dynamic_libs/vpad_functions.c delete mode 100644 src/dynamic_libs/vpad_functions.h delete mode 100644 src/fs/sd_fat_devoptab.c delete mode 100644 src/fs/sd_fat_devoptab.h delete mode 100644 src/kernel/kernel_functions.c delete mode 100644 src/kernel/kernel_functions.h delete mode 100644 src/kernel/kernel_hooks.S delete mode 100644 src/kernel/syscalls.c delete mode 100644 src/kernel/syscalls.h delete mode 100644 src/kernel/syscalls_asm.S create mode 100644 src/system/memory_area_table.c create mode 100644 src/system/memory_area_table.h create mode 100644 src/utils/utils.c create mode 100644 src/utils/utils_asm.S diff --git a/Makefile b/Makefile index 3551552..c7bad2d 100644 --- a/Makefile +++ b/Makefile @@ -9,6 +9,9 @@ endif ifeq ($(strip $(DEVKITPRO)),) $(error "Please set DEVKITPRO in your environment. export DEVKITPRO=devkitPRO") endif +ifeq ($(strip $(WUT_ROOT)),) +$(error "Please ensure WUT_ROOT is in your environment.") +endif export PATH := $(DEVKITPPC)/bin:$(PORTLIBS)/bin:$(PATH) export LIBOGC_INC := $(DEVKITPRO)/libogc/include export LIBOGC_LIB := $(DEVKITPRO)/libogc/lib/wii @@ -22,6 +25,8 @@ export CXX := $(PREFIX)g++ export AR := $(PREFIX)ar export OBJCOPY := $(PREFIX)objcopy +export ELF2RPL := $(WUT_ROOT)/bin/elf2rpl + #--------------------------------------------------------------------------------- # TARGET is the name of the output # BUILD is the directory where object files & intermediate files will be placed @@ -32,13 +37,17 @@ TARGET := flappy_bird BUILD := build BUILD_DBG := $(TARGET)_dbg SOURCES := src \ - src/common \ src/dynamic_libs \ src/fs \ src/game \ src/gui \ + src/kernel \ + src/loader \ src/menu \ + src/network \ + src/patcher \ src/resources \ + src/settings \ src/sounds \ src/system \ src/utils \ @@ -59,7 +68,10 @@ CFLAGS := -std=gnu11 -mrvl -mcpu=750 -meabi -mhard-float -ffast-math \ CXXFLAGS := -std=gnu++11 -mrvl -mcpu=750 -meabi -mhard-float -ffast-math \ -O3 -Wall -Wextra -Wno-unused-parameter -Wno-strict-aliasing $(INCLUDE) ASFLAGS := -mregnames -LDFLAGS := -nostartfiles -Wl,-Map,$(notdir $@).map,-wrap,malloc,-wrap,free,-wrap,memalign,-wrap,calloc,-wrap,realloc,-wrap,malloc_usable_size,-wrap,_malloc_r,-wrap,_free_r,-wrap,_realloc_r,-wrap,_calloc_r,-wrap,_memalign_r,-wrap,_malloc_usable_size_r,-wrap,valloc,-wrap,_valloc_r,-wrap,_pvalloc_r,--gc-sections +LDFLAGS := -nostartfiles -T $(WUT_ROOT)/rules/rpl.ld -pie -fPIE -z common-page-size=64 -z max-page-size=64 -lcrt \ + -Wl,-wrap,malloc,-wrap,free,-wrap,memalign,-wrap,calloc,-wrap,realloc,-wrap,malloc_usable_size \ + -Wl,-wrap,_malloc_r,-wrap,_free_r,-wrap,_realloc_r,-wrap,_calloc_r,-wrap,_memalign_r,-wrap,_malloc_usable_size_r \ + -Wl,-wrap,valloc,-wrap,_valloc_r,-wrap,_pvalloc_r,-wrap,__eabi -Wl,--gc-sections #--------------------------------------------------------------------------------- Q := @ @@ -67,16 +79,16 @@ MAKEFLAGS += --no-print-directory #--------------------------------------------------------------------------------- # any extra libraries we wish to link with the project #--------------------------------------------------------------------------------- -LIBS := -lgcc -lgd -lpng -ljpeg -lz -lfreetype -lmad -lvorbisidec +LIBS := -lcrt -lcoreinit -lproc_ui -lnsysnet -lsndcore2 -lvpad -lgx2 -lsysapp -lgd -lpng -lz -lfreetype -lmad -lvorbisidec #--------------------------------------------------------------------------------- # list of directories containing libraries, this must be the top level containing # include and lib #--------------------------------------------------------------------------------- LIBDIRS := $(CURDIR) \ - $(DEVKITPPC)/lib \ - $(DEVKITPPC)/lib/gcc/powerpc-eabi/4.8.2 - + $(DEVKITPPC)/ \ + $(DEVKITPPC)/lib/gcc/powerpc-eabi/4.8.2 \ + $(WUT_ROOT)/lib #--------------------------------------------------------------------------------- # no real need to edit anything past this point unless you need to add additional @@ -119,14 +131,13 @@ export OFILES := $(CPPFILES:.cpp=.o) $(CFILES:.c=.o) \ # build a list of include paths #--------------------------------------------------------------------------------- export INCLUDE := $(foreach dir,$(INCLUDES),-I$(CURDIR)/$(dir)) \ - $(foreach dir,$(LIBDIRS),-I$(dir)/include) \ - -I$(CURDIR)/$(BUILD) -I$(LIBOGC_INC) \ + -I$(CURDIR)/$(BUILD) -I$(WUT_ROOT)/include \ -I$(PORTLIBS)/include -I$(PORTLIBS)/include/freetype2 #--------------------------------------------------------------------------------- # build a list of library paths #--------------------------------------------------------------------------------- -export LIBPATHS := $(foreach dir,$(LIBDIRS),-L$(dir)/lib) \ +export LIBPATHS := $(foreach dir,$(LIBDIRS),-L$(dir)) \ -L$(LIBOGC_LIB) -L$(PORTLIBS)/lib export OUTPUT := $(CURDIR)/$(TARGET) @@ -135,12 +146,29 @@ export OUTPUT := $(CURDIR)/$(TARGET) #--------------------------------------------------------------------------------- $(BUILD): @[ -d $@ ] || mkdir -p $@ +# @$(Q)$(MAKE) -C sd_loader @$(MAKE) --no-print-directory -C $(BUILD) -f $(CURDIR)/Makefile #--------------------------------------------------------------------------------- -clean: +clean: clean_channel @echo clean ... - @rm -fr $(BUILD) $(OUTPUT).elf $(OUTPUT).bin $(BUILD_DBG).elf + @rm -fr $(BUILD) $(OUTPUT).elf $(OUTPUT).bin $(BUILD_DBG).elf $(OUTPUT).rpx +# @$(MAKE) -C sd_loader clean + +#--------------------------------------------------------------------------------- +install_channel: $(BUILD) NUSPacker.jar encryptKeyWith + @cp $(OUTPUT).rpx channel/code/ + java -jar NUSPacker.jar -in "channel" -out "install_channel" + +NUSPacker.jar: + wget https://bitbucket.org/timogus/nuspacker/downloads/NUSPacker.jar + +encryptKeyWith: + @echo "Missing common key file \"encryptKeyWith\"! Insert the common key as string into \"encryptKeyWith\" file in the HBL Makefile path!" + @exit 1 + +clean_channel: + @rm -fr install_channel NUSPacker.jar fst.bin output tmp #--------------------------------------------------------------------------------- else @@ -150,19 +178,23 @@ DEPENDS := $(OFILES:.o=.d) #--------------------------------------------------------------------------------- # main targets #--------------------------------------------------------------------------------- +$(OUTPUT).rpx: $(OUTPUT).elf $(OUTPUT).elf: $(OFILES) #--------------------------------------------------------------------------------- # This rule links in binary data with the .jpg extension #--------------------------------------------------------------------------------- -%.elf: link.ld $(OFILES) +%.elf: $(OFILES) @echo "linking ... $(TARGET).elf" - $(Q)$(LD) -n -T $^ $(LDFLAGS) -o ../$(BUILD_DBG).elf $(LIBPATHS) $(LIBS) - $(Q)$(OBJCOPY) -S -R .comment -R .gnu.attributes ../$(BUILD_DBG).elf $@ + $(Q)$(LD) $^ $(LDFLAGS) -o $@ $(LIBPATHS) $(LIBS) +# $(Q)$(OBJCOPY) -S -R .comment -R .gnu.attributes ../$(BUILD_DBG).elf $@ + +#--------------------------------------------------------------------------------- +%.rpx: %.elf +#--------------------------------------------------------------------------------- + @echo "[RPX] $(notdir $@)" + @$(ELF2RPL) $^ $@ -../data/loader.bin: - $(MAKE) -C ../loader clean - $(MAKE) -C ../loader #--------------------------------------------------------------------------------- %.a: #--------------------------------------------------------------------------------- diff --git a/README.md b/README.md index 3fa2d7c..07b280b 100644 --- a/README.md +++ b/README.md @@ -1,19 +1,23 @@ -#Flappy Bird GX2# -A GX2 Flappy Bird port for the WiiU. -Assets from Floppy Bird (HTML5 and the original Android game). +#Flappy Bird RPX# +A RPX Flappy Bird port for WiiU +Assest from floppy bird HTML5 and original android game + +#Installation# +Put the Flappy Bird folder on an SD card in the "install" folder. Use wup installer y mod to install to your NAND or USB. It is recommended to install to USB. Signature patching is required. #Usage# -Press A to begin the Game -Press A to jump -Press HOME to exit -Avoid the pipes and the flor! +Press A to begin the Game +Press A to jump +Press HOME to exit +Avoid the pipes and the floor! #Building# -In order to build this application, you need the custom liboGC and portlibs modified/created by dimok. You can find them on the loadiine_gx2 repo (https://github.com/dimok789/loadiine_gx2/releases/tag/v0.2). Simply put the files in your devkit folder and run the Makefile. +In order to build this application, you need the custom liboGC and portlibs modified/created by dimok. You can find them on the loadiine_gx2 repo (https://github.com/dimok789/loadiine_gx2/releases/tag/v0.2). Simply put the files in your devkit folder and run the Makefile. #Credits:# -**dimok** - WiiU librabries, dynamic_libs, examples, Homebrew Launcher -**Maschell** - GX2_Example and coding help -**vgmoose** - Coding help -**pwsincd** - Icon -**QuarkTheAwesome, dylon99** - Various help and testing +dimok - WiiU librabries, dynamic_libs, examples, Homebrew Launcher +Maschell - GX2_Example and coding help +vgmoose - Coding help +pwsincd - Icon +QuarkTheAwesome, dylon99 - Various help and testing +brienj - RPX build diff --git a/channel/code/app.xml b/channel/code/app.xml new file mode 100644 index 0000000..f25462b --- /dev/null +++ b/channel/code/app.xml @@ -0,0 +1,11 @@ + + + 1 + 000500101000400A + 0005000046425244 + 0000 + 20811 + 80000000 + 00004252 + 0000000000000000000000000000000000000000000000000000000000000000 + \ No newline at end of file diff --git a/channel/code/cos.xml b/channel/code/cos.xml new file mode 100644 index 0000000..aed6147 --- /dev/null +++ b/channel/code/cos.xml @@ -0,0 +1,97 @@ + + + 1 + 0 + flappy_bird.rpx + 00000000 + 00000000 + 00000001 + 40000000 + 01000000 + + + 1 + FFFFFFFFFFFFFFFF + + + + 3 + FFFFFFFFFFFFFFFF + + + + 9 + FFFFFFFFFFFFFFFF + + + + 12 + FFFFFFFFFFFFFFFF + + + + 11 + FFFFFFFFFFFFFFFF + + + + 13 + FFFFFFFFFFFFFFFF + + + + 14 + FFFFFFFFFFFFFFFF + + + + 15 + FFFFFFFFFFFFFFFF + + + + 16 + FFFFFFFFFFFFFFFF + + + + 17 + FFFFFFFFFFFFFFFF + + + + 18 + FFFFFFFFFFFFFFFF + + + + 19 + FFFFFFFFFFFFFFFF + + + + 20 + FFFFFFFFFFFFFFFF + + + + 21 + FFFFFFFFFFFFFFFF + + + + 22 + FFFFFFFFFFFFFFFF + + + + 00000000 + 00000000 + 00000000 + 00000000 + 00000000 + 00000000 + 00001000 + 00001000 + 00001000 + \ No newline at end of file diff --git a/channel/content/dummy b/channel/content/dummy new file mode 100644 index 0000000..2f259b7 --- /dev/null +++ b/channel/content/dummy @@ -0,0 +1 @@ +s \ No newline at end of file diff --git a/channel/meta/bootDrcTex.tga b/channel/meta/bootDrcTex.tga new file mode 100644 index 0000000000000000000000000000000000000000..1564b91389a2c3d3972a78ab5be3b48386ded0e3 GIT binary patch literal 1229804 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 z36KB@kN^pg011!)36KB@kN^pg011!)36KB@kN^pg011!)36KB@kN^pg011!)36KB@ zkN^pg011!)36KB@kN^pg011!)36KB@kN^pg011!)36KB@kN^pg011!)36KB@kN^pg z011!)36KB@kN^pg011!)36KB@kN^pg011!)36KB@kN^pg011!)36KB@kN^pg011!) z36KB@kN^pg011!)36KB@kN^pg011!)36KB@kN^pg011!)36KB@kN^pg011!)36KB@ zkN^pg011!)36KB@kN^pg011!)36KB@kN^pg011!)36KB@kN^pg011!)36KB@kN^pg z011!)36KB@kN^pg011!)36KB@kN^pg011!)36KB@kN^pg011!)36KB@kN^pg011!) z36KB@kN^pg011!)36KB@kN^pg011!)36KB@kN^pg011!)36KB@kN^pg011!)36KB@ zkN^pg011!)36KB@kN^pg011!)36KB@kN^pg011!)36KB@kN^pg011!)36KB@kN^pg z011!)36KB@kN^pg011!)36KB@kN^pg011!)36KB@kN^pg011!)36KB@kN^pg011!) z36KB@kN^pg011!)36KB@kN^pg011!)36KB@kN^pg011!)36KB@kN^pg011!)36KB@ zkN^pg011!)36KB@kN^pg011!)36KB@kN^pg011!)36KB@kN^pg011!)36KB@kN^pg z011!)36Ma85Xeh6xS8^I8jPui%w$7@T$h=U011!)36KB@kN^qX5(1EOsTs`%M#9pP011!)36KB@+-3xFcNo%sF-#qo@a$s=6Q2@k@>9BJpBm&p?g#I2 z>;1<4rvfw;Q_x;1 z>p6q?HZv#Q4hfI|36KB@kU)zduq#hLd2B-O&U#(sFs~Q$yS(zNtmvfw%T@XoL7>p1^Rr#Z)z`wYaKxL56$OxZU%pm@7d7r&SoI%{AmEI!WO;|`0AOR8}0TLjAh9zJ<^Y`3Q z-ITEjzW3`QLq>FZ{nVq&syZyXWSbUW5o5ux?5z=muk3|ZY`^>_27mRzF$sQtLju~~ z9gysf{KGj=fMEe6V*_IS9uaHE?BNdl}~4)idR9{uzG_ zFtrc(*e76iw}3_JscXOzuYmcH0Ry80`cMHjthQ%vBtQZrKmsH{0wiEhz%uhU&w#18 zJ=^Iz-l^+$uP(4-T&RyOq-$(gyPjc>_=i0bpd?NE0HoM^9`qZ%y8Rnw;R&3z59!eb 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 literal 0 HcmV?d00001 diff --git a/channel/meta/bootLogoTex.tga b/channel/meta/bootLogoTex.tga new file mode 100644 index 0000000000000000000000000000000000000000..944896ecbf7c2891fb9b19eaca0702fe50c9b744 GIT binary patch literal 28604 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≈qd#WHxL{Gc8VpFU#F);BP~v8W^qf8=E3nxkcGcxnTQcC@%+PiIk>h zSB`fiJF_zB@BXz~^&|Y=dKkv_HyYOu)t^_pCcww1OTk(t#Mm9U1mgZ}xy%BCb?X)@ zjJy9$4QeaFJRr_62iqCtFpNy&ShVr$>G*IXJMTbW`HMf~GgZRvyAl1foS>wOTe)$? zmaYSETLVT`PsX+-8~%WGAe*@ROd%R#lqpHA5kveQ`>}85&qsKSdDi@ z4i?uWf*HZ}ag6O|8?T1u(0i6UkqaB7GVpK|DV#cBh)twUq&^4f?RAY*#eib;>;Ndk zpyptvM!9V@xX&i;KU)kUcwkfJKTERHIn;!usKUcm78mmmT{Xg5N^LyU&q4ur9Wln?cw<@vX${FDjCzRf1{YbL{)c-AP6 zF|<)g-r-%Piv1inil7@S|B`@439A+MU`gf5Ij*)RB zL>8QTP+%b)EzC8wh)i;nSfHwFkt^7J$DdPQ*y zD;w}O@9RB3pIuiUogU01B?m1Le+%9};rA?jtn@ZyrMW4kG@)HT^Y~?chD^UdS0Ew` zI|!>r81n0(x=7(jCS+nd98uvPGX-@2x$&F&yk0GO zn!0Q{$#OiTSUai^^^C<2jETr}Q3Tz(Yfxlo#&eX?9YvFw1kHlO7?x%=3vgS6O&-+b z#*F6m3M*!Kl3h@kx}C4ri4pqUr>$xQ-pba>$I+b{!wQFyPg52{L4JG6yIRYEs*<+T z)o-F1qsy6#N(70Knp)+MPjs?FslYa{JS6#K{+VWFHCc93?L|=9UDEDtc?mXMdXx_7 z#lUjK2@ml@w88+GPyiITh#pV9_PAi7EMiaQIq5>vqU>an%^~uBI74alBPFvQ#SvOy zXQ(=T&PE*2&sD(P9>N`u+qG{%x1ZB`sSiGJe@^(@#L{)B%6{R8wT#iDTig1@>&9(x zW=n=zyEb1lHTH1Sp_F1T+83(sa0o&>r}GzDwgL zu!&vdFAUsj<)6tle2V12mw8yFE*N0?$i;N$tl@sIPlrnnrdNCH>~5V+M;zq=eL3-gcfqyy_1 zY*M?I2Brq{1x=LOK;C(uTjyVFkL_N7I==q#A|D8=!XPIDvEdJ@gcfKzU4fzUdR^B& z=lK#L{l2`O%oLS}0Z#cu8Tmk#yMs7Ll+I(o7*OM#NYm`GM%mMvKI@}X9b9Fso6;E6 zh9bC}#vDit|LD|6j79@)4RSV5n)nbmpZC$DDhlmdiW(2-IjM8_sirL|;T!nF!uA|Y zlx0DinZx;9#o#(hmxG99M`RPw2bebLOL9=ki2;O%c%x^BsJHT>{eP!eS#tk_ZNXgI zSm7`$C%1blBTF~KPwA07B@+!uCc_q9INv)k{^%^3O@5->(aZF452%!Hk21=kufmbj;kk26XDvNpq zq-*V3LmXppek`A1*yGEn`qEk7y5-Ju|F!iv%)U=ZwU>rrh|ZJdh?0!b?Z9AtM|qZd ziSw~e_{=PmjbNVB_K=&~oNdS4$BEfB&es)ILk6T~Exq@O2+z33_u7Kr=KAfG2V+~N zp%Lvh=H*8QReLmp0T*VJ09B9Q5MXp6LwZmR8S`|wea#*9b@?8cVRy<%096CKdJw+L zLEP$hA3)oE_`Y_7$^fm)VL~|J1&+)ngyao*%*U;<*?MwtMd>_>;MO-0ZytZ|h4`r)XINb-6R>4T)pBM? z=2P*PuV%f0*9MdyS~~#lq+2v#rKRo`yn3+N8>}zApkB(|!?`c7lbHMO_rI<<$t7d_S&Wx->f##rq*Y-s4%6&k z0@fgdk-fRnN1EPyWjT9i+p$2-ZAiTiRtX7Xla_{%nQf}0SJF9dwz)VcjNP)rt{U*! z7dnQJYF@I0`}OC;FrDsuAUNuyH~`agAO7l}-pyyRx{uDG$}j**yCKZoNKU=cbU=C$ zT2NWCFj1%ZSzemrjkW`eYu2SJ;^m|w@mW&lb{#0)vAV>^Rjzo%`saJKUwAF?#OXCi zB!##_EtSvwPyT#x)N)WYlQi0NmOw4atK+=3o~hO}Z>n95_MET1I~z(WB!z1$pWw!U8GXxm6YKYynU;2oxsFVIsGw)zFzjWIIkW3Ngr;CntkWk^&QwBWJlU+2c+Wg!gFog+UY1->}iud^+|5 z0dL>ee5AT3MqSsDCl*c2rxhw#H@7ZQ_ornh`t&4-I3Mtob$A=Cc6K|}+ct)SMI=+FtDpCvNv15t2 zSoDYyWvnU4qE8#Yy9v-4VzJ=SiwG{jD@~=NwV3I{LV0KyB&D~;0xtBiGdP5Yf*w_i z(T1q-SAmlT=A&4A!fjviBs;QjwncE6#$%C0eR(e~VLVE@rsgkfcQ&kZ({}b&V!K&{ zgs@gbx&hYHF$QDo+}uUP0H};-Tjj_10n~sC5vKTMFCS94@U{HjuG+uTy!q#0zFU4! zgUgUutk08S9}K8F-eL0Gv&o$Uol*r-u;et0`Q84GgPBr&zXN&n*5x2cH!TwPZrizM z`0|kWn>{D`ME!dWm!n^5LFRh5yM`TjS%rwbgGuq@i4_C6CzfzKE6C>P3_R93mFHpr zaaTG4__CS0N6J^LXsUzBC-k=4M@1#S=v2jkxGcaJqeS&M!sPwPR+7stK_o~_=$Oca zJ6;VqM_YXioQ^bz7^3S-|1i=NH1AnZjLsicKN(U4H5bJ@anbl@vQVqB3GH~(%XGDk zphSY!`7xZBkKD*9puRkGr3u`)WiR(~k(JTAQ?vn2T#}p`u2o^UVu+0p@gdr1Xz=J- zEcg<1nd2tv9P!YzH0-O-Z}>vwN>}meqSG7rlLPGGbA)1I+7<4aI7D@7E`Bg#O;awr zDTLbQm3(FXwf6x3WpRn>A_osnfV%jk0Mt2yw;!D6qew%|mf3tIahDG|j!-FmL472j!l)YK}b7l3ZZ+78HW&Qeh>> zr!lj=*ndLA|00`4<<`%|NWG^X0ml@0fgf^)8JNJ&=(lan7n5^OD%OOzcEfgxZ z2YfCd9E}-E0}(s1xT9IUL55zcKCXe3eFP@02muzjR!q=towm)p+is2Bp@Lof;H%a# zGakn=CsNAwNn#RXkA*C0bWn>BT)QnNfx2~`F)b^~Q;si}1Ah(rwbM<;o9Fr?;{y17 zsihYkyj08V(%Dduv9Ny!;m$+Rn_Nl7Ve33Na+o3aCbogZ96opuAIoxwInQJa@R)+` z+}}+sDAMyww2GH<@3~jS9pdt8;yyTqMIWw$-a+|Rt$hSphw`C{eHl70LHup2ct*X( z0R!u)=!QQWK$rzNe3e&gxSg2UNZH}*t%E0p+DI@##d3UsRJGSZwpOLhTgm(~pDbis z36sVy>Z9#O&QB9{;r!vJ!3xuVW-!Yrz~xP%(7ka8GAZMicv!r8ncR>Gw-4UXV~m^e zz7=>|T*`?ZeS0)I`X&jku=hnqt3LK&8q%1JNR)VZtE;`b{&IXstrS`tQ_I}uo@7zd ztp1c~)ENtX&Vrg!d@HajpCD>uJ%14~xI`9Wv(#-|-2db|dqw9sh>IlS#N|IqAvB`P zybcQ9rF`mHm6sq&O8s?T*e0kv;46j5 z$s<@Hv$QhSP#KNim1L0Ma?C{GZRO1+i5-SfY`(shB^l)iA{`|Dn{l>9@! z@aACk`n>-$wZgyUm%$$*g14-;tmAr6CFsCrP}jcJBYV+Bj15gEvB3#DtkYSUnvV|m zEN=ff)B^d$kwZ7j+4J z4C!kHGG=m*L6D8f3-O_5ZXqqH7<(9x+sQC>wecuCp=d+gLENaaTr~1UyyniL=;vIs z+R0+lFxPP+UUQV5`Q3gCkLmZ8j~xbN9pZx5*L;{#cLa<>bc~M#y%M!>n{$}pEGh1C zpNj$!VGpaAK)=dUl!mD^qVp*v9c%^6>RWmL8Makvq8xA=1wgTREfpaZn(=a-lDcr4 zTBQ-n1~OLN^ZT@FZaD;-3-o$AsX ztm!-mhuQ}Wgf@PyV7H^mJJHe3g9tYn;w-1$lwV^HDU`4;M5 z4e|C)QDf{t9MBJC7RHW+CRXkuiGPm#GwKR@#w|a)q(iRED{7**R04eKdJ3H7{Vs<;~bNeyV&bzc}m=Hf>q>8!YFPgoY@J z{E$b!hprEYFMY^BX@czd-=RUm|3GnJje6UV`7{$6t#G5kwMM_KqYV`~a7V6dUP#In zbl}Byt_+0g1jnl?{F$ee`pJR*?@#u;Yyb~S2C+@lG=zu0=)-wHSEOgYjYT+o^Uzc0 zImkMhYWxoyoQ=q`qKThx5_0bBzj-P4*MHBR*#uy9aq{2eYiKm(^irb8|83GZ0%l3O zKyo_v4;U)phP*PXm!C>ju9yvj?K`%#dx?F0I1J|ZaXk?>%46)#4`z_DAI+8BEX~A} zfYQ@X_sOucziVAIv^!>@q{xBUi7y)0;&E;}dz(gagTsl%o8)zxR>%T?M&{1^uyC~A z>s}k)Kk`+L0^@$3PZ?)rS&;$ZFRs%bti-C)Z<3m6oylB8&;6YgtR! zout9x7Q%)-;x4D>tB>Z=b+ry%1j-JCODh7&>Z!`&$4l4*5BR~7D=&L}P<8qvWWtyH z0lKMx5ZgnZMhjXc%;Ii}MA-@R`S)HTk@2ddP3Iw=>rQz;<^q1Lxe!h?nkL3TPo9Z? z@qz;Az6PV>2Bc1xK*)We4>1QhWG?Ls*n=LIW-M~uX#NozTZC=t95<% znLY7!?0yfMD2o$PM+IM>!6#)urOI@`vunwaR~#lkq6A_f8FZH57n7Y$I@&mhvdFZF z=LD4{q0?ZbkGMW(8=)T{yh+NL&APZSxY!tNhJiEmPzC2Cv0$eZ4&iOthwt2M|-z=}Et5^@9c`V`zpmc7;A}@1m&ur~x93^u^doUvN!WCkRoG zjfr|_ySUqTiRaQYos*+TOEpJkB|an2BzuM-ZcM~MN0(%DL&`8ILM%>Q_ix$mb3wn` zUx$LnvFSywVLga2-lTB0x_r1Rx(dqD> zh&LrPPPb%&P&%KjJrXBc%XhnpD_G8#2)Q^hWfe! zWi%A%iaRc9hULH%Gd2-)vo^=fuozCU1`-CfD8XvB>OiB4^0I3Av5VP1wFy6DHid#c z)MOaVjw+aBPsR5v)tSw|I1jp#@QOt<Yk(gy7lEY1N+bU@Vh{Ji; znil7(-bJoNJd(fmV5=zkfoGe-98TyH-Cdb$MW8j>Dey_d zD-K$bi87Zu80|*|XakX9B*8xF68L)4OfbSR;ap-n*cZ}i75MMzXxPok=0t5TNatg{ z?waH;a57J2@6ufQ`c*i4GNkJ#g5SBN4)fff?iW?#(DN{dv@Imd0GPESBIbfFN#O}F z9IGDWr^w(YiJlef_TDk{ZJ1gmNcww~r(P``niA4<#DOh)j#kNDIU%>%JEP42ZQs`C zu_CBQB{#CFaL-v~RgAykKXQ>LNoa*utY*%r)Pf$t_IMva=xTvQiCCW?k~5%?fo$>o=v;zzgl zrdqzN_Np{X&WRyd$Cu`fJ-^8s93c$CPwRAK%{5EM!(7Z4DcH$G6c${$Ynb8=^R1(( zqbn4h$=p-bV)6dJCLOID)@GDhQ#gs~$*mUhfFHd(e^kt`SP}tUh_<%M1)l|p7;U`H z3JKS~dV935)Z3-*0Gz*<_;hz$*#Z1K-iYdcN`HLB8|-o^_874yqck3A6A~|>H(r?d zLwuj_81-rJ5D5Fvt_ul8jdzR6?9@2@l-yN}N$W{ZLDFA(cVp}%Vm%MqhVN>OB}>ic zg8PY3(_eowfxnV3IDv`o)@*EPdbh9cVPV^Efmg*7Oi%QP@|PyNDEfk@9I=KLW=7$% z2r-NwjJZ7$J(8k!E0i>^PFY?%514Bg58}eM^gqR9vi?-Has$sLe5gCRu{-w1sKvCW9VateJL7n{L96IxKpn%I+=cNw-Ztl zw}wKEjfdnesx});b1{mawV(OWNRhety++anG*2bJY_6lt8|AWhhL!oO|Agg|r8~D& z&M6Jx9R$x{zx*YmF0x@&fLw^Ef%xMjK)$(1K>H1#2;6Yi=IC%v^tJ@p#Gs0p6VcvhaB+9*B8^-FJ8uyF)yqUUhovqe3qM?_ z!qyzVKG00+K{h!8b}I7M`-aM2qWkn`3~$N3s@e6S;wuEKkBbsPHnSUsvkTnfcFQK2 zd^|)+;ON&-Ex=G=>;qhy0^^na@`0|R^Y{8dQJ#^5med@2zcVA zs$nWE-j(`}2c5;`muAS`A0^s)JXV#UE_oPTwD~06`RYW%YohpJdQGObHX;Cd#yO4)97V zP5%kp8P!djSJ{>!pzfMe_6)yek|WyPVIasw106dCd8YnkwhDGk^JtPP3WAYM_Y|W$ zz!j*8xnWk0D!svIxFduXpmCm+2BYMQ?NXz_WgMX-@`@{3X<^c4WYC@`dQ;{Iu&{c{ z_oPrVws9Q2t7k-NJa@Y_o?Q{lffLpS-J)+>GjQDzBg%BRXY9I9CC<1C0*NF(_nTr8 z7%+3kxrwhu7B)zK%7rsq9-W`j(T|C9g67qSucFFdsyRdf!&Hwo-KfSYm z&r1TwBGrzXES!)aY^iY*G(+v;heI5~n>=fFqWLES-QWs+cq00OMN`64l`3*80CXq% zU|`xyhYB)n5oXHp0;TW}S{F>p6(dq>tx*GRzF%OA-ke$Br+N2;^9%=zCxsS|P|%7s zG@q2K0hctquu;&bPCJ$?(q#VhP~Hc`umev_m+kLeZ0Cq(4cBDJ`<@$1 z4$lejoqQ^kMY%K~8x3bpnv+Et;lva&Dc#FB<$AC0w_0ZJeM78zUM~@$lX8)+1M`j7 zJUPa7RMW3_O$co54)Wd+s?3od&hKq+8{Kb7t<}40^9ab z-y!*$jZehrufk+{c_dQ!cJHuAP=)=XQs7X1{BDirvb`+jVh-=)#UKt7WPJHo@wm{NHI48o!1sc{h>#? zS2kNW^+kbHxT$iWCzQvd4WzIlEa&WbjrZ%N06Zo|(s)|f5UDsxPS*EWNs^X@&0^W*a{viIK z83qUJ`}?(oP$q&x!R&qiQ@Y$-ZIt&!U&hf*vAsVI@IvGLY+rzf2^T3znh0sVjZ^+6 z7KOvY9MRr_N87B59*oMgHZ!Z^8m`6zw*C!w{-O5YakUXN1S(w zvyVwFOO{aih*W45Q@tSc@ZNTy?5O2-BWcp!p( z9bdNe76g@;<|uj}Lo<#uRB{66af>9)Aq{HV&ew(ob}Fxb3U;ff8)-lvJW--K<$%fh z_5*z46Vi1{e--QcM8L~%$eMxp@6pEvxMZGcM3d~E{c57~=evU(kYAWPD8pz`(x1`d z$Bg41nS(IK!vL6H9Lf2hXr8rEXA=8_T>N_jeg@8Rxd&Ssgs+1KLHx;jA3?S`_&@a%nP%Za{TG^O(@*QZ#~9|6re#J1bj zd~6X98nSj=sFcgrC+er6&if>GJfG zs$W?T7H*q;fQoHT5p5)iW$Gm%=)y52L51wFa~{XB_p;U6vc@oJTlM*-bQcH$`q~#gP~8bK4}+#s(sw5?pL(q(lPArresEP?zL&A3?zB`s?A9d zZb@LQzcZ484e@;`2ml2CtXc}Zd=&5ES>VB#gysvkt6;Z(HU|U z$=2(z;n7Z$BFuu$PPN|RbJqP)p5I!MU2#$o*##xr2ie+|MT8Dv=1U&+?(RPX zd-xv&%j{Zs^j30~#%VTP+gCi#gx+GKP|;^gnrEZyafRy|*UHuLQyXD-my3Y=!u_1}WoXn7Gg>)SV}9V`M+t!||DpcN`5wNtFm&UggMEt=-_Y~ z?(J_2{gm9K+xV`1FyWI$AHSWY<-4Mtg0=KM?qg%Lx~K`icdOr{&sZ}k3fs&yPr*%| zO%%h<2*CW39%`9tm^&8G=ma?bX}wI#h(@(mKgFwudlteppG7pDxwa3zS^0Q-x({DU ztt%8*me7`Z({*xov&fx@4ZbTtc2DV<3iht7GEzwt--$}05)|T2yW}8Gfqvj-yk)H@ zcP&}=^U+F+o6DQvNI=pEn-2NyfPNXLdUoKv{D!gyzTdkzq-r*xjCC}Y9a$S{)#t(W zFX7gxLxZW;_0l4u#@-l(uCOR=D<#<^s|2V^K(?%_*RK+U(iW?at%8hUGHb&vHR`gd zqZpc-c|TTJwbsc{=ENtGLCe2p6M17|T8Fu+Lh+}&xjgXF{rqWb^!a~IqisR4?d8G6 zZuAGu>9w5Z?9|a`Xe=m1iHIEJo;i2bH_FY072{`mg8r!c9HDd3t_*#454*#7vfQKh z9AhTEIM|X}9>kWDE!sKBmpP@Uqk{)HkLVdcbiyh5`dYF24^^ud2`5RJM*Q?OGn$m< zdd)?+mD+@li$E$BS}?pE5||uoO~5<}D~swr?Pg9?qJ&!=MG{(+Gl45gm!$7k38@c+86ujJ#?ncOPe3^sU0^XV4A+bzaI7ko6MTe-kTMTx?eQf zH{+4Sl1MuQ)`3~%4Oi|<1u5(UFGCX~7vg+a;_dG83dHFTF|gyqSgcV4jq#vA8N@mM zgE@5%>m0DbIMuq0R*E--`2KyV?LrCnYtiqM+1L0AnIA*Lgtb*Cgy@n7U`%E#e#rp5 zGXkM7hxGYcwS-Jq#Y-|dB$XKkya5FD%B_a5(_o`Uv(q2z^-!qd$~}AlJ--n!h4XX; z8B;uzL^o6Lzm?E*069Kt7?ktF5~dv0f(Ibrx%*cE;U93v z0thFX{2`!V+SUhaRi9HtQ|Aj0311)%@VqBPKlNx3T3CfN4CSZx*Xw|;@&jH*D?28A zF73;F7=nn6Y!U2_hiSOym0b798=b)Fs1-tycEBZP^M(S6EQRiSe}z|{Gy!AqvK$q^ z+e&l9fu{|e>Qaj~t?kw^{N!^G_S9@PiW6g5_iUyu=L4mwBBUJ>B9AMWX#X+f6(rR{ zA#Z~Wb~+q9l2^QuUb2NK+l^Kclmf+Ha)kqF?GN8AIo1{eX96t8iOCy8&0H>J3KG3> zu zY_5&d5d6Q-&Nq3B z;+kcCy+ap=)O0kp^3?c*AMcXUp(5xE)aqBzQS@8RRjWMj7(z&y;G`~oc8K#tcd&e0 z2n9+Mx?g$si5XI*~4yYw$>NvrhHLW*Ux+*yLdYE&C7uJGhoEiRA z@Nt}k^uzJO;Lf_qEv)0kjQ_<68bG}-4K48W*A*1*)!*A?Cy4SV8$7yLWqc_VY)N1M zH5`{XlsC9p23joLO6J&x!#H_iVf4J1H^RgpUR~ri4*i022Rt-<(=ku#5jz6Ei4Go# zA?+<{OOrgS+UuAIRauDLz8!ay$$X*JJCRwB-wB7*s5HuNCt*XSmJmSYwkj5=)ML%z z*NxzL`&R=J2>EnmqtM6M8GXcQsX`{YPHQVbDM<};WTVIY8s#Y0zT_URKEs`Wd%Sbf59f5yXtV2 zHg}@n`lH&xeDG4KPZ}I)Eteh&Y<-cvQ;VQu?QL{ZZXFzrDqrp{aJMHe{>^iV^!EO7 z7wWTv5+#6DvqATbJxcI$s2ZmZQy;Ty_piN}&97~Bd(?QARVlRd z+4SG^J_YHsR*>464g|u_?=!^?#Ec|rzqS9IkXY9^?YKi8I4=B5ax1Uk+uK`;w9s>= z-Y-QeZX3ZjbrqH9=-^~rP*^~Y28Bm>LcBrhRG+z2aFSHmEUKKU3l}wi>3L%7qf)!M>y#KkN_K#}R-1D0#D%OLBb4;hgLbW(bjII^&9dTnE ztcu}}8g-BOimfud6Eyn{S+~(}(9#W3M%X)BrdLHU-NiTqnLtvGn+Xp<$(k@sWM z`QdNh>05mZd{fT}Pnv+2QJulLmTs>webb9xfZ$UhGR>hy7W_H-vCe?eCWP(~NF-Bo*>IoPpdzNMy;6_Df51%nnlbsf1@*2l;r z+T#upR+r+ZF18&Hp@fu;rs^}FJD0+LR2=dQmiyRXK+j#<+Wg{CW}V>~NXO~$aL z{pWxMUV|1E*l)g3gG+0V&~+ph6`NiILWxAcR2@bJK-!ppH)MMc8s*|UWB?A=K7Pp^ z(u@u$6|~m0m6gaGD7sMM8*}P8QJYAv^VM#8h4dM-E5;$Z+qCQ!)D3wUJCL{FU{RZv za$~q$I@yy5H)gTQad=<{#(@N1;Cx&dzgV=W#_*t*8eN*v;J?Q z{r4ys8f@;5?8=`f*fo6g$92L+g$afa<49wB&VuN#f0_KeEdS>PFIj_4z*VJ&xKCGC z&aGEl5YUR?+rDBFwVOL)C#R+xM)h7k05LIdn=zE&`Mt;%5Vz9lJ zrCnnd0>GHlm)UrPj2`LQ^P|melX1MI9WlAm>p`nazd2j0e~eCYStc$KnPaxXiu z2KvOG>m_GDaCN}q?pTMYf>2?YR6Gp><>vV5i3Ogj`r8fP3LJm+NOs>i+G4Kt z#040`nE>-8S;P- z!fh;ADV9q_5l?#VCE!h*sR%BQl}lrrTL5_F z@|;3^C%KK(W=xLn?nresSFWJ$2NsObE(?NSqkY_et^loix|`hQ@Vd%8C`9uu(l`17 z+`R7;-b{7y8`ZhpM;(f}M0Bc>xHLDI7^FeKL9qq===JX{bl&xh<+LEGD6a4#w7ZeU z2IZi-{=t*bKZbGVThOBSh|z8|4!4Ej$D}hM7r*!H2}y{Fci-5^vRgQ zpf=%uzHvqawXrdG*tkN5uvQ1J-u&#RQKm1~)Y>!A`n~X0C?_J?c|rzxTR-E*VURtA ztmhzMUG|-^U11yI^Z~EWk<^w22X4RO|5I;J!Q&|!`>r-^5(8+C)i}^~vq2$RXcM-`BMh;C9Adw= zywRTXHsdutz#!4XVbn2Kez=bXzDgde0}6avOZ`S@e`&l$YT2W9Pgr1&_HwXVd;;_S z8{ex@OaYMK zdre9^x7H4awGV9RBLRE~TSh{cV{mnL^^v=EpnAl?JnFZ5dUfr71`w+P5IX<)=i0wb z^?&>64l+Z2X07E)q;vJC>c5C*{@14POf}br#eVc|h@*Z?z*U=DF2W$Xf>D7UyTnX!QMJJReSgPGc_}VH#`O7i?&p;j;y^@Wr%~ zS`S!W6DMa!ThPBa+alEaz5Fk3sJ}3LKx3(5G&i+_jFKmFq#yY^vm!G1K9J*AmJUUN`$DcWs z5xje4EQe|1s8oKRCEqk56wF9~JD7BAMiuZAt)S@sK$;YAMNb$Lc2SC$RMfiG%LNtBHXa!ZRE}JhK9p-Sx}a*kgxEYzQJ3e5LLSAnp)vfHj`lc>`6(VDUizQx zWA8geDB3Cq)P9zBEm;TvqfSSAZAlj}LW%uWMTwUU{$VEPSW%5Ie9nr{2(iW-y`auh z3}!gzKFDc!KtAvV_6~|Y3wpqq#ie5_?_fx@iVirt(ZwiwdgsKX+5 zF~1UcsaU5jIIH1@pfU8wPgrvaqVa8CkJ>#&C5hT6aF`o}-E)wwuNXm8HHi`gKG8Y> zK2j~BKyQ6oj^61p*JXAih^Wo5=<#?+b>M~SJ#Q|+Z`Q|UI$LJb2d=kR6H=5Hz<_Gj zy1NQS9=GQ3Ms@rVliPQYCt-6CD+tg5S=w&GGYN)-|B*Skz{)Vq1IGFE1sJzw-lc|! zzbbKVVyTaAmh`2A1G9Y%{s3UFCK~|^4euxR#2Zuqce^ctw!+Ty$++g@zne-;#Z)P5 zDchxPLNRKWZIS{zYgE!;T0`1}1hb@Wl_1bCDY$W#NakDT;&5ums^hhr9sCMsNuD|F ztG=jHuAClC2RF2dl<;^nqJQ68aozo@Ro;mAGtj^Yw8oCbq>IF8<#^sYoOr!Aj7Zjo z(;y2ftCeED1W=gV>b`+BPt73Br>NAzj_$ZcJDoOQ)6T-`vU0C2?Eo4|pr9Poy$S2pMco6V-cA*zE4y7?m@!F)J515RWTT9f8Gs3)RM=&-xPZ zO<3h3vx)2L20%~>@Xf0Y6d)5OJ4VuKn8q5N6S0ilPp&x37hql~iPheGY5Y`dKC@5n zbBL&(OM{l2aDlD|p1p(#=iT%cvF;?50TGstncY8L)B7~22-}4N&ELCiH&PcpC+7k-+f9*p`sH!-OKeopa z%Byw$aE+y_&a%GD#8dN~Iw0h>jyfaiTz6m58`#f9L!c;!F6sMwlSTCe4P@}3NV;Al zcMyk1zmHENRx4!Z-gJeRnE{M_9Pf9M3Y(CqM32g}vl|~kmB&=B|O%4fL26t~s z<p%n)< zW~oo4@?$l4n3t-ANJq14_)`GGXK)^={Rqk;YM~SDLtA^Y*Zx(JySHn1V0-wuD=*M^ zR4DJ^zHG4&OEpqjWgHzOZXO(AAmx{@tK78#f@ZXkXbafH6b-Kq#-Wjc zBl%Ip%QA??N&&IsgOh)F@{oZhiX)BXl)9yyA0YfQ$(EA?hC7PE62wZ7^5&S-LDs%pFbU^0Ix$K%YKOF8kg)Sx44a%fnMP^!0n!j<37Zc?}|ox$A1 z2g(PK^aQ`1VHNvtn~~Ie1>~|!{LN$_A<sre-KoU*EQTV)pR5|}5f1w}Giv`Yc1 zv7BviQzy>~EMzFBz^J40)H=Au5+%c81piLqvnzF8TetCIv$ei8T_baLwA$m9FcVr- zC#DM_mg%WC1J~U2T0nGX?-+--4YZQ)duTar)(v$Ne{IP}7hT*%;3%D#o$EzHq$>ig ze2R_f^_vhDH$CVedBmL5UeJYsi&it2eQGkqPcxO!6rKQXgZ|*UUm{%0tS>Lb$XLDP z8kkGbS+R@zNe{+sfB=-vE!?!cy4 zp2x#E>)ImVg;4<;X}K^b|`cV3#E&{S)#0ea1k;>k3x^-v8j-{eR<}13pXw z*&{96DgktvcMnoKPF~#<4sM(gKmt-wOo#|RT>WGm_?7b^J&z%GJNfTh(m-)LL4jZ? zeJ@VEu(V38%p8F~9fX@&zd=+4db|f@BNrHl7n|{593}wJvJc3wSjb*M6=&|UNNJ=E zXaWTW(>r(xP-CmIS5CUn|Y+568SjyO5XGcR5Y;SMkO`#g?c|QNiw` z5-b(O%GzvHK56ni3w_@XEme{3=%C*jV>x(D7(z@v358l%G#*}WwJRsH1th zmm-cfTuLQfWZ7BMYb*23kTlfr#i`2&)US??21h zI}O<Zp&JoNPLKh4Z7^O3>7V?Et5&AgQ5mfTm)jQmY-5azkN+cYG^)Pq^M9QY^F$ z0befir+xN+l^6u*23#gj)ApLJ<^=m5#4a!F{3&{*RNKIy+U70Ej)rTGb?B16O3`{l zuYJRf9_uv4^PmXWY=70lE&|5w_6t^Ext>9)ZA~FFNBVQTJZ)Je(m7F^Cf9 z2t;1BMlsMWYxvmlnBkRHh4@YZfH77iOkaHfXFgAx@jWTY==Or^40q zSW7WI%vW}fcv5djas`T(QtJh|mHon<+q3?@wLf-hL%wF-^R+y-+b62*i2aUmSm(F6ceb__F`}US zR5i#heh!Fq(>~GRM4aJ?$HpOGjy!>V@D(h0lU-?P!Pr7~ z;-pWL#*QM|^RZ{wAoXa2mVx#)!%fonlh*;0-|)2R4&`r*xLLH5_0G7K?B0n{O0tfCMrez z5VZ4j9dt^NNN5nUsa|%HTv_n%A9uEjtlx~aD)%>C>}N-g>{=#U&D~>a+BE7c3M<0c zaL;4jZZVkmDL;=O8kRQU!*G{(bg)Imy@ODx?WlC0hHf`6?Re7k@@2`g@Qfygsri#I zXOS-hrwp&fC=ny4{EIz3{7}LEXUn8*<0h4F6K~|{tO=(DGmJy<3A~$+vaXl6nPCWOBQFzy zD+%h|UVf(=7GEl8QUlDO?J4_)$EQH z=_l6JOe}+Pp(md2C-P)e@T@>2_wqQzp0n~dG72r>mNz1Hfo1g@OW8u+&+lO! zL}CW4fgRFovaGe>p*zR$K*V|cF8f8nx?aO z4i-iAx8e^D^yO?(|I&T%3)|Z=mImxT9!;qViP?$<>fyxI%tXP^GWS}oHhtjN33|ID ziojFFgVe$GEU+(7L(+ZReM7$@upuhHHigemclcQmiZJH6n|He|{+eD1_QZwkqJ*~0oFwGXT>JbIYywvz;LGZ zM4*rG&3bn;M6&b)B#^obwS<=_Adp}Y%zJ&WTa$t{7Os0tAg9cK4NVue*{j_{M=zcb zVzvp8lE@&Y*hP7(FUgT`QYs+!^x~iVa=Fos{kB1SttH?$pz6@VU1Yv$cdO=N)C{t) zuAGUl8IS0k`+t-saFqyXi_Vsp68;afGyXTTS3WDfM2CLe{kk0sX<){#UBQw;@mgVFYsm2+y5u^os8ct+XAu*W)IB`Lr%c)n0PrM zG94&oSxYwpj`eDt9!O*H51z?eNHp&F{8H279-1yA!k0H3@9U5Nb@f#pI#Vn0$rK^B zKF?QZ0&;jk(4(4|VU^cbH#9!}#O!2K=UFjvESSQCPc8y+pg%KgPXiW>kwFNMRhDLY z(4J6>Z@L`i;!8|+-Az=cGx%VDbeYYD@Ej|8Jy0L6*}h8ZI1Q~^Y9E8^Soc-Vi zzEj1Q|7sZAyk7CSas{UHbP4i=j>+CNct=N1JX-Rnd*w!;ES8YZNq#OyIG{_`w!vgN%>Q{BWXN&fF z8E$ioqlAMrR5S>emIpEajjG)Ho-iADMJ~tMQxTIs81))iH%uJ*{7Z6bI^MVOJEguk z>KzvZ6)&;7FV!$8<>bgAcub#A%8-l|Im{zlQNk=1c9 zLH@|DNr1jpMjH1=v`mcHKv|%xJyXKBkbhvWBKjBJM_Y0bx-4TJ@try^aS~UilG)Cy zbbO+)nw=LxHU7b4)DxEgc@68d!?2o>JkP79K(j>GG8&KX9J$`#pAo^GnsbZ;5gEE;~3Q}MlHw;k@8 zt#stKx&k8L_CfF#MlX7&CLWw-4*V)Y?`Vi;nN0pdo0D+!1{C{kq?G7@6WaFBj3KQB zDh*e?@L9?jh56h87`UL!UqsF7z|+V)?0`<<7(>*RubJ(uI|lfuJ@tn->5Woam;`uG zds$oi1>24jTa!~MITy!$eY3M60-K_W3{g-6w}mkU0qqVy9f=jifBZ+|bxD07FgiB0 zlwgbH@frjQo6^evug{8WG5%&Vd*Wmw0+@A@QM%EN2HJ}bNV~Wb1Ew6=QxT+=2qKOG zT@Hc4_Owh=qt{BU)+j_PDU$S%rs*%`2(WzAMHb?#iwEOBH4*|SPnE?78B|pY5#Xi+6us{xUxw<&%U|$4pgV+U|xD$b~U1N&!W|FoxC$_<_ zuy=cXy1S{7DRSB_(8;^G3HGP67?=Rv-gW?AN~ps{;XiOS13+3CbG&61@%gUC`D|NEMfN`6Y zRf(V;(Xy`G{=Mu@2F~5M~l{&;!{0dk_a(!%%T7pO(V7C$)iclN%-YF>g zIQ~rV{67+0FQ?i(e`nQt91hBFI>J>AoJZJMCUxH!!x=tohg+ej z&YtY8YHO=M5!UY<2S)Gj2QYL4B>c>ADP9#DMF&RNI)tb&Jl)XTRmU(=TKiYwy5g*9 zejFfgn*i2&zaD3wl}+@Lh~y#9Q`kiNLB39icyuemdOl9Q;6;gOQEtIMTY%w>b8ZAi z!Ub|+S`;3oSoDlTUEC579?kwmW`{z*HE)$$o3JGhu9Fu>8v|(^hFp){B zzPrDg6fsZ1=S*q?96FC^G5EJt%b~ybp{qAlT&g3@wo;d_7!U2^Nr3CeVquRTN$cyF z_}mwAt$0CXFy%m9M2sP8#yzgf{(q_$2TT&&L9%s7%LZ$McR2(jp+&+!*HV%8Hr09b zk#rXS^fZ~x#bUv&QN2a0ymVWd#@fVKhtW@es&ZKb{j{)fgL|C`3URIlFyytS*sP&N#}sMv`LP4t$i zfAv3(?vr#}%Ga5oek;V32A#VJa+GS+z;b~A={#2pAUoz=Gz*GOWkl$?S)#*ibHp3d zi+5-vZqp|^&dt_82id78%pP^4 zy94S9Q;q8f6$ujBPe=_eZdCv62~Y)B(ommgVrunZsY|^T>AWsCnAIzRT`iZ?8p5KM z%rv(g3>`77-8+(9h0reHk)2HXnmdBU+zocVY$^w<#L1Oy-fWBu{AA(O=rI?C|+Gjyt}Wcnu=MH+O>LN_OU2et(iGM^h?*R}}A| zDhp4Kmx`iH&iE{7jO7MDR!oaex9FlatzAcMN7Bis@LDEEaG7+S z@y-uwyQ6mjNGYN@QX5z&WC<;In#kr5Zn4@qvg?Hdu)& zP!i^y61BRj-ZMECc;fObUKKU9hpzLN2d2%K^u($AWUDhgc3&|xO?Buc)91fuj5#c3 z0{_Rwt_K7ogDDy2>qB;PYf2>c(hwQ~eup`27OcsYEL&=IVHisasbDFVI zEKQ22xupVDnp4I)IX#rh`Z%-vSS!U>ks5X;K|Y;NM9O)4Kh7F% z6FSEm3f`mRsIb}SryyXLEF2gc5XmTsW!rcob}p8is&gu>38h9i!da3Z?-yD%4kQdJ zNz32C^ute-wea?W#@ZQN1h=-Z-4;`)>Qu-crB%gri=(BykaD>1f3tEO9%&u#f}F zyeW9i9%MMa2dqGKiG|CsdEr|*@oD%{;OY{HpRipo|I5vhFU@-8Rj^W8Qj$T46HhAV z1!de|a?%UBM;~oydu?Op!r}cXhncl4qO@;Q%daez1Hl$)`0pJFE zF*+&781z{i&^!Hbmsc(9SoDF0O+e$ZJN){9AGEq=^&w;im`;x}rswSC)KNOjH5*h6 zl5{lENSz^@39`ZLUPZ8!PYQefTVC7T_hiqTzjyzSRMP94zmZ#;HOyGPE@)}!(#auE9V;;|LGR9!^Navg>-{s{Y*d&2 z6Yem$f`;$)!cqM{@dgMN8UDeYq(Q|5*Q#uX-zw5*-rgDKyG-le`scRE_sB86&GfcG zL6=Sj`jhP%ly-4GtuQ)u&P-S=s$2Yf>&%UcHb^+127;o?&sgs&f$~QRVplDV+bN6b znWZW^*=(}3t|=%#MMzlAcWm=~dW~f0%pLw+0n>is;DsDQSIvN<`o45U6n!*CzZ<_E zyk}lRXF2(^4`^?Bv<2UYCLK9UAy`IV{i*<0OI2W!y)c1)^2+dg{yz;4XX^cROGKJM z?o*asc}06WxP}(#vIjS|k6I6=5)(#U4rwUHu#I+CF-=q}p(-d_ysufWPNi^CarOO> zi#&kMx-oIGjsNDn-4MV!m417W8gBK>-?c^l2NC3LYvYCBr@Q)jcd} z!&7bNARC_LmL{y?j-(v8_OoGMVOu2>;^$QjGBr3KaG+?c=3T`Uw$QK9>vP*-UtI&P z-jIu21OxQkn!kN{({DN%SntA4lc5q$TGa03+DzU9}N;U%|RYX1} zTv>3>%{F!khqBjX6+4PfeY6t=9(J=cvcXUL&Oi0=l2%Z&Pp)elPw_qMLQ@_crZ5>bEfb;N z=c4^D6cJGI()|K<@O8#zL06Vnh)C6*DF5Fn00Lf1~ z2Xp(i&C?N;nNDz7(XS)QoV+CB?=ng(E7*r$W=A}M=`{}S6}`7Dg`7efR$iA78>~5! zdJZ;2`du(wc^?4`@Zz;J59>O1ze`bZMg|SAGbj{KHtMWK%V%yHoq`BVUc;L}IV|NZ zwD-XYttf@b@%~@DY*Vo^o*psT7_iU=b|txCO)HF17(&#U+j~o?@M+X|_H7MDPTBt{ z*FX$(mV+b5?ECH@ZkNfe6LCT}GPnE1CMd^b*k&`S?4lzc*U0Eb-v%;4+Cm>{+kN_2 zMxPOFrvws8sP90(bhHQ}^Pla+I`EbtJyCx+YaLLS1|U z5Bg{~_d`VlYo!nP^LIYBXbZ{|ihDK2@+6{caDx&;M_8k>{il9da=v(aRUpCOx;{=6 zfXaGbOu!?%e*|wz$JuOZ?%`?ChQpU{!zyuCTF-xU`o#6r&R_iLi-OC-=BIA}olsLd z@mNJScBb_`Tv1Gads77e*6vj|Stlz!<=3Z!Zm2|x%97Y!>-L%Zs7Z!mIcAG;6pFqU zQm8IgNqM$Ig(rR^{Rvvj7L%q8zMhfW6>gApeRC3Fe|m2=>SBE0g>2Z{)vqgb_@``9 zHz0~EI5vL<;@4o_PShZzIt|3#-OWE8aK3Eb%IL1==hg^2?ldpE zr9>KyGH?BX$c&X17Q5v3u8EO5(@LT){bnZlA6n++GT>&fD^sA@Y%itlm!{%BnjMeu zrPmVuCBFQj;h^^|eD2puv-$tYaGU=-!>uUgds5(ubYt#bk+r9b78rCOWXMT=tu#Mf zRgayDr_IgoZ&kI*BRT6l2nAB?OiK$*sHB&aFfAE%ND$h@=eGA6hAa|mZ)F9CUy6bMpI_G!#73X zm!&bZMNS~v$@TBVYt49nv2~R>WeZwJq>1oo$*Vda3u}Oa+t?LT$4OhKgr5jqUH&RO zi5()a%-J^liJrgPT8E~inQz_%DBaB#>NCl8_(Cx!N(Am0#wmb{{_tOVorlZab@|qt;1*VTdEfU#P4vU38*d$z$fp-obO<{a~8+?J)2A4aw9m zirU@iXR+6MZ6Rwf{-s0yS{+#kWdx0JF~G#<@E#C&(Vs?SJ6F+vu8l7%R?UpJk7ikk z1xd%fD+MbeP%!Ro>B|-!031~N!S_S1{n`@>Ru|9m=f6T#YOOM$rbx(AcP1cMUYd(E zkA++}@sa`~ z7ps}`UqMyph}%g9MdP0u;onmNp9}d+0H%;McujLkP6xA|o)C170+~5}O#wXe@FlSS z=R**Wz0t1(+aMWm{m4wunkTHf#_MviX$<0Qhjj zsXa3w%z#TqcY$($vScd@_kALojA&PovR&I@yhM&h9_N5xJ1;1+R?!h&NY}WbUE*De zt5qLHMkEVhBT9dPc7-B}dp=Jr-7Z0@?=2q)&n8(8?h}BQ2 z2-rc7vM*=0$;FE-$XU4%QK|@!OZ!{mppB&5cSy|;2nmZBCqsMh^k-~zrUoB1DVg%! z-Hc^Klhr7l1Fddu=k+9*@-@Rzx_ypz2w`(V=Jy&8m_J0bydCNGiqAI7kBI+<2eCKa zpPYDF^4+7F1Awo`A=aw|t}Q2MN=y+B#GH3XpcWaNZh+Ivzxv%WE^+OhiNv0Sc~U`S z75kGA0_y3WOD+w%EBd{#R0^>ImWkSz_b@ZV!5|zc?lI~XyTw4IJ(DhcBdO~yv4@1f zlvc?TTI+85b{Hg66{X^=F5w=FU%qozzvXw;<#|(MiNURs^^Gj_v0MwN>LoeXWw7~- zk{r_IL-mw?1F!WB(`Qnes~iS$c{RKjs&3qcmhBv{Qi8>e`>iG@|4-asSxM2?aOWl{cO zGm`3jbRfOCmin+}rHGIS_8C~zws7P9(vojoGjcnBEe4^U7jh%1b@6*tCMSXXhZ=J1 zg?@-Xi1o8VtZ)OR93jM;=`wN(^)#;A#Hqbwy9f(+eJDsw{f6P>0sz}-+77YCP*TxS`DB@%+PRKTm?@Eq6J25&uhbS9F1bX~PBfdX(1W5W z$KJ#?Cc)bWfs<=4DVYI{?YdqifGn|-yx9JTyCDuvMNEg-m|R;S*_LMz`lkYMmw)F#xh1* z>6Wr8Qt#tvn?LI^14f5rluTQ+>$y}GPgRAQynXf;sM3&BMw40BRQ`)&52^s2UgBFo3v}M&blJi#Kh0WK|h1y2nrwsKAca2lYh5fw)`3QF5 zQP~0Q7bG42nn2#|{2@6^T+>>0IBvelb3U@x#&;*tzKQe*HMOh~B*gI^(*#~F+)p?Z zehL<&F7m7>Ji>Do^Yfqki^OB#F(Uvvrcph z>{5invYWxVUm;DEyMqFe4{hk3yl&t11L8wko%h#@Ba^IN4U1fRlO zJw)=1YAc9Z#12jOu;#~@n0<15SWHTIIxGh$O0_IS;c%MObe|-0Mtc95rMql zoTzC_5zABS$xIX`d4}Wjo7j1Hujowb-uDr5jY`gX>^B_s#f>h=jA+QBN11N#{nzey zB#mqlbT_(eO%~0~680)}g^*9Nzx@vIDOELA z4>S5#S_CIVX;CNmp4g14m8Dr~B8w%Dw?~V!F}pI;-y2v3&*Q?dPkArDu9tlPmzpMH z#_})SEU|mnp;)(evg<`tpj_=QBR=GVLvZrdC(0nayrPNpyJ3J_rkvoEjg;!r_X$vSDb+ecZ(|Jf`{x`)xB5*hk`a0A&_@a={#=F44`HKiFC}AMQ>~+Mp#BgHygLKa|6EX-x)b2Xp8}Z->DTJKLWQ=e zq|tYHq_LjRLYK#1zpNmf!^K5gG1Bs107V1raHZDNp*tby@TZl@&Dio9qR5D$&1pi&bn8#|vAb>>*kLA1<+(6z81T?xw~8 z1Xq_!2^I8q2kc?0)m8w%t4eUyo0+H1u-UI?XV<9AoA&2;IOn;SqMg}yx)G0z_Jbw- z#T_!KEHE7Dn@n^R#Z%B~{|*eL6{y`yNyd1m0%gn2B#WnZJ~3bU!WPx#q6f7$EA}3F%Mjw39E?-!kWLCDgoi0 zI@kzxxh;h?#^dxJZln>Aer^cm#QF}fg$Nqy6!}hp5 zn4%j*XksoO-5Qu81d&S3LIjdz-+u*q93b_+3^GqoZN4i!5z< zF@5s`HB4N;2XE15TsCx4whto+o8*PMC~=zl-uRLS<{t-+`R*Dr^M=jViriA&ey<`j zOJ%(Kbn!`KEz0QD8La=yk+*&8)A~zN`IespU_KZ6*5`G%Nr$a4&X-j{{bb(}OgO zxQ~?O#?uo?d$F3XAGp2)hz-Dyn0E=^!t(t?_x2b3S`rGToA z)IfuipS}Dw>iKWZcnn>(FfLZ6uP#}s^+lD9>x0d#gs9TWP?#IG>Kahmc8$h{TvCib zpXL?$u$Rz*w0;A@H$~h|CN^OL5Q6DQsZVo>`kS4u>J<5I?42P&CjfE8hB>_a zNK`(jJTxk6b`T;39D>6>q~S3}8xui!OI_2SW%lB_P1Vn6ngsq@5Qn;FKve}ss*A#7 zkardaC0F0=U>UN(k8xeCE)?kkQdtf>6)uFI;2Vw`lP!3BWyxN~Cpkc$sCh zUfj(R>^G5FlmrJyhRqsp8e3F-W;=SB=UrP5fLtwnRmkpa8d8cg%e`rx!pIj0;#85> zDuu2RW*PEw{p#eFdEnXnHx)GQBNx0zS-xJ3;iZ+TYRWPI)1WwBMX_y=LU3DG(G|#+ zN^esgNWDHq!6`2N1t;| z3DXX*EViO>hMw6`7Vx_)Ys~M$ZW>v~oaAq4pPI0P`IH*QB5dTTCeK`&-0n=P-5lZa zj`5obdZ(gR(7H;?Er|RU<(?Whi?-1!%9Rg$$psLR6vr$(EBpr!6OVJ8iI#vDojAcM z(S>-VnaeB*?|Ph>oR^DHn)WEfJySS3I(I{zyXtZ%k=}`CB&+;!arF2p&{0@{*LHWU z0+7ShAcM~)o3BzgSwu#u)Y1>YY3?a?UnIXS77MCGAk3wZjPYSkbSW%vyb$!qc~)G+ zSvKta{lYC7-co=E>sd)_-we9%2^JkesNIg--AT$5xxPzwb;sEmy3K|0bJ3H9>El0< za>u;;H*l#LLJ6xi28P>{$S2Y6x2=$gwb!Rh+sBKhU}r2p*c~#BV_f2mPJ+L2pT5j~ z2nUMox-Y57km#dZNLH&)NgciK>pe#8Y7tS;R9pQI>Bv+pi?pUh{JUQd%h|wsTtbaj zBa03(3l!r((WLn2qSjU*wo)ssQ!V-jZVg@G3jWJ%vDy0X3S3oH-zd)MZZJONb8n#M zF{R2V5ziDjAo-=z_gzPwCNk>KYZu!ok1-uUe*wF5xT`}<`q!_TV?HTd{wRLElOs60 z36XRs!`RQcjfYD2Yi~OM)Q|%QOd3=)LU>0GK~E}^7w;rfxFuA_JMSl4HT4z^Uj+M0 zn>~k1Ds+1KEQ|9Uik<_Yb{Qts;P0@e%R&FlJ^aeyVi+VQm6{JzLf=V6khf-HY1~6y z<`fJ^7{=wMbV2{{azmD~fYXx}atZ&6iB6-J1i}1Xm9xLrq0n=YfXymKKa=rrfE~@} zf4}(xe7yH55P30u?!#n%5UtpU!3Fi$-iLwCN%9kQOo)zGQU*XqZB~X_VNIb4s5-YF z*y}`ENCQ&DhXat|C%=|b=ZWgcKdUZy%YeQpERZ1kD?u&nntmH0kn^QoMjlV5p@%0X z2o-kBC(sPCFq#A|1gCzDGOj&9oV%5qgMy<{8>h_#z%~P(s5N zAQlZRfIfo%InMo}8QvZOC~9L$-rasf1}p*R?5=|1ycTSCTA29pPw0JivKg)zam z@8Pv~3TB;TDIfmb-Y#)$NO+ys=U{r7C}e-RV$(2&`DE79ln>QMr6a5=!MI*ES9%PC zFhXM$R7VUxWpFxz@B8=yn9bcLy%#N*FlCinuIUbwm@^UEAO7a0-=7P;!JO#IqOLSg_38i+LkP5gm=6DYXMAfRBdkYjN0F5Mfj%b|2} zVfqEeTys1c z>D)!;ezrnD5r`>O%#MAG4I``}W1{=2!4CU>sW%(v|4+SwJ^GAyrtO_^kUWpoQ^-0n zYkcqLh3u@+VwVXViS99GMw&*pXHGvQFBUiX_q43d5n$SOjH?6!R)0fyk6hhkReCqQ zwwQ`(%)SBkIZoWIT@QY2uTY&~x@lvuB0)lXj>@IMJ6wO;-1@Y82cmXaBZ4RqP zdDc;O!+2*pC{E@pxIaaHv2UIPuD4}q0%#HLj#(DNpmMtNYlb2turL%WkutO8DlYa< zg`U~${(O!PTka0r^si>W<%vHx>f;1ri`d1J7K;j$$4*)3afp9B`swDw0laKK7HmvTfV8ZQFR4ZQHhO+qP}nwynF9lbd|MVUnrpPFFpWO8iEq zbu*}*I~umNOqcfTZr_XtlB3L9D*393vwX1Es{OhmnbB!tLgBQ6C?C<2k5KC!r~&$` zWnnPae$g+6k%#Tu&cDG2LvWs6qf0X(^_gt=z=6WmwN22kqI$!jnzqh9Mp!0OU-gm~ z-2esC$QhiCpq^`-nMld>h18@zpiP{=S??09DBmV;moG6s5h3UlhOG(%Cfp%WSr4#6yvPIJBu*=DolG(M(7 zbDu~WLL`q{M+rEar4k3?$044zm=pQUp9_!uzg|o|@kTEvJGF^hSAarmd~K*ehBLTi zjZrXq-yN}b*~6di8&ZTq2&?6Jlvzd#<*f7jRr2j9T^#)oH*=s3C_s;+qm#%gBhKd|)50g55hpo# zs;%)us>i}~E%x*g(nwE|DW~|OwjLbojP2xia;ZWivsq=N=6kyvjmx^4Vn)A4I4H|J zP@mk$0@iolzvz8t7D2ykGwD{Yp4n=!6+{J|Xk9#gUz#y99c2#Q)edGcg%QgAbRVV0 zgOOTGmG*W=qrqLX)+ESs7c48(^z{9LpBst2lb=y%$cCAsB?GpOkn==TL5&U0E&o-0 zv9~UL8dUoDuQG!`g>rbz2Jhzbxm~>bD_vYY{v;y9W9y{??yTwuPv=H_o}M&QNm|6Q zrAOMgixs-xdE{z^GzJD`{3NG@_e^3{UVj4n5%S^WbMHr$)0YIr6OZ|tZtFQJm0XL; zXw6y#nyt0EoyBlfU?^_&zupEjR1|1rSOwJGuC%+}kPm(oE7UI(hiza~M+)pDl5Ud(`;LL*DJAr<+1nbvIJW>&S$H9;mGN1D{oQ3$nA#am~W~3UFpP9 zlO@AQ7uQnl^Tu`8%uC<@5sCsWW2Xw3s2+H$V0Wh7Q#YMEb+D28Jh@(|V7%!qpK!Vx z;|l>n9575F(&arjbJ!PXmUG)`h(;OCVF>vtFMooM+T3}o)iGF}YCVM>df>sn3g7|y z^ujz}!nXS(Tz%DEA@BaGSdHJ7vlB<~SI-vK=apWDar&BS>V({zQfdP4dw7a`6GCXJ7u4Cj*{-rgJFq?_+4#&YBf*HBgVDLDjdF6S7=QDjXD!VBC<&v;) z0SF8+ntyXcG>HEZnXPW7oewvlqd$%FCiLpj7ZQ$ zr6OzqJOT&5v&9QHVNHhcKn$eVvR;-}j9(r4k&(Qwue`5TqR0=%{re9uJ`Av9<}S8f zZs$OqoN^DeX#Gc(b0ZJ5u;j^OelEU59UNewj2UdRi9-I-6!HWD^P?IGp#S+L#5fES z?9(6ia;P@iJ>GS&`n^9!){xWAOK?Nn0+a((H_i*A)aY6@vVng>HggL@z6iCrQUr-e z?bvN|Zha#Kt6(}GlQyM}gCSbODQIw_0z>hG*%PLzvZ(p*8r(lQixsimD_WEyKAM&~G>@_{!2WYG177%QI*4oqArVJAx< z*~B3z@A??mnt6bDk0LdIrp#y3P5}q@h%E7BUq{W}KP<8w!MOE#Et5f!m8|wOH015& z-Y0%N(!0p;hVT6!x207wdL@SbVK6v?8XsctOAv#**#EAU8GdJ)J5F3qppgce(B++x zNq+*qRU<+zv#gH3qLUX^d->f^`E3E>66C*d>P;1Kx%2oXOa|&mM$AN_L!%T?{f&{i z6WPdYZ&yO6rk778V`f~1AOzem2Q_?5rbG-t4^p*8YfkA1xUwLk{x%5|}>82g2ubW?ZHIm2!~KtHlF7bB|9%3&AkZH*KY zq9t(EBWI^DgRe;&q#gI}jI2EjxV?{s>{pQ$H1IGtPeOECd@m4v*<6XGUYj+USB0kr ztGKna-x9oU*Z!^a8g7yrNWOwI)Gic4H z&!Yse!AxXX>ujhYCv__cyf?%(h`{z|z{@Ew+VS;#3y zXTEnf2efR%wAf+)XZ?8pzx8{*bN}Y!v9L~CD?-_^^niJ|?qD;Hdmc}Xg81)B^YixK zK_KW-9j}C^mwgH2RdK8@Y#@5~+)08nlc0kQ{E3ziN)rVEs*p1;E}Ao^Q}@u!Ap z_U&+KQCLpJf2%yY+|hC0o{NU0IW%-G5)4b~0{h+gXPpCWH8$s23@O=BKRaeybj8q! z_v(>nZOSx>dqKv(xW7slWb0^CD~!`nF!X#Y?bDS101onb;&W#oJH0IZAzsFWeatGY zqnxw+l=uQ65a>%)2G6jh66aw;7FVMY3YF1xGi`FZNy)-sGD@sG%JZ9(mvNML*{90r z)4BivV$wI0k+ND+mDpCD;^XeI8&}Uk73>#gd_=+p<@J$WNrxC1P!E^C@@-_RUtP;E zOgbI_3!7}T1nK}v2sADY8kw@T?N&jQg9&)7as+&&c{#oDxzmXK^V3d01H3n=cVdyr zkF!aThQ)pT^A7POFcqR+))R(b>OVjp9%tHCKrkwQ{I$(HPD^_tx$o};U7>F!g#mx2 znOnS-d>E`&)QSny4+9Dee`k$|)aPq-0|dXbI+lMDkgS)mZ{QkKeZp`A12iUYCvB)G zt2i&pG#0&q-gyD`?^n3HXLK)Lng}E?w zrBEFDl$CeAhkP?lKQX^o0N&j{<z7?PqCNKI`Z|uyl(wOK-@R#^Lw=*R2hM59R#! zLG9%4-*;|M;g8M|=d|Y{R*g3RXrxwVQdMb&TyEilk%#j@#PS#_SzE$yInFF-$ZfZc zBNFTY(^sc=KJ@Uma70CFG8rifZg>1R>`#6w`7}QS&JeR|QeUNqINQ5CK0q;G#xXX~ zU%67+SJB;ikFLq@x9_wynm>+rX-#7^>{CKm(iAW8?&{)GGyVWe5xcMN3_aYb>{4D= zxi}?Ps8YFImf;;@=~QK9mdKBW7?!_={e4@BXVnxL#Da}DdIoZ({)x}#3(i<^0gcD# zkftt*Wx~QTt^JN-)n76T>my=iX~Jrzk6o1_-PL^m6;E9oW93GRp^|ViJABbZlbAVB z$}xZMp`6~|g0TBk(3f1{G1JvLdb9f5{KA^1+LGj`2TK6=Th65i!(s$feUJgnhiDeu zTd?Y6RdG*Vd#>!DHwux))a{uJiOuJr7Ei zDBt^lf?7aaGk7x(x0XAav?Tc%^FGs_3=G)n2jV&T#xlIE;+a;Ia%zBikyLqTN1=~P zADpOhlH6P^5AXYWTcv3j$k3AsXz^(Q4e)*Mh9{N}R*R=@h)DmJKB!)`sD%UutBWO9 z&xH#|trK~pWTRxsv{AUX5dU+m-d+)Hs`JUR zW9xuRt;D?TSN;IR9>^{&C54C}xR;-9X?qzJQR21?xlIPT`DjrZZOQ>E_O!GI@zMNYh`nzitG7AuUlpFRrMV zUeoIAt|7TZ0pFcVkkkeVE4t5Sq30;&+#xGyql**2z1hlZlCqg*C@5w&A+F)0b`7(> zQQEwE>Aio9m>2VB8$zcLZOP_|TCo2Tirf~Hwb6&+WiyL|7{K6&QSc4 z!!ry5+Uvs*R5dYPO4u=&k4r<~zcGJyjwZ(i&e#Uzp!`_8Pm8k#YMx?>?r}~>6YD{RqFhURbH|_))%8S?({c7PI(W@CZYYqbVXr{1fM{`LZ>~uXPjRD;X-N;Eo#$7mVbU2U|UUaAB(($)CW1<$t?G21?I!rPX z-J0MXnKwU)6ZzPmc0#DMN7)3jH_nCuH7H<1rl~XPMX+10_!Baf)hLrqn6n1J zC&~F5uzmtd)Jx#=0F%)v{Rx}Ix>DUW(wrO%btvNBeo?_k4KmpAJFNq#skPRU^rFth z3(#8lW%A;Yx{d`8cf0;CfznMO^|KqTp2U+NKI_9es_`8O)UlMy__%Zw1|X-pYiqK_ z#HarYCRCRwpQ4zSS$nI3GWN_O%)Wb$hu#*!%(qca1tx?#*L3C|hTIhFa2kpc2dHy($3OB5=vKFjFr`Z|@bHsahWCh$nxzObm~$5UGi?1%mjR&jkzU%5h~^NDB+ zuC1;{1zN|NT^wwKiI1MD2tgsA?bc8<8<3EX!{_=_#u-HLwSebdS3HOm0l&=Cu?0=G zHYbp!j)CMRa`$~l?mQ&pLi(4m6rf604eGYKA(ctZX;>JoXjHkZy42F^wr?mE<6A+l z9CI|w4Ib_X^`1nqu|P}&5gc+a+mZkf9NY1~8S!uzEj|CT4~v~_vL5)^gB6dEJ$d>x zUAXXPFW;d0=BKwe7v2?O*$@JB&`&kD;ko`t>zfKP<|_{enbj)NZWG^h%?N5`&AKeH;guvpDD}&bRCKl~26{{<$NGvCz9!QbdM0)P0 zO^BhLd>X-<^ge2kMp@?-e|ebW^?3nweiutjLdlo)x%&?WWW*FXB8+EWVAm}#+?gU z618j~jwBe&eyC*vAH|565$QqPpEn!jGQt1(@PGf` zhyRDQ&)k*NHcU*D)?4o^e15O5?wI|lOwD;kRk(u?{yeU@vxXY}MGMJ?$@p4tdHc1Q z7@raV<=PxK$k_cYn8{6>+n*a@MA&19LAlphVGrmR#{n?wgvxgCRFnR z#MtxCk*VYG&j&0X162{~8nbatLB}bE8ON9oUU6?C5ef-ciSeb3<6m&gWbWR=Ybrf3r;VT6S+gAN5O(h z@_N-U2FKw-Gq<9nL*LvHuK`y9mc7MHGF&8G%LRA|;x!0%ciGJ!8nKy!nBofssz};J z>dk^=)xn0)xbd09@C6a*u44Mg#6?5!Tj|P8o`4q_uxrSyn}j?-X_p(nE$3VQ$UWj= z$R>0I$2e;VZ-Rw6%nO^RJv-@n0M8jVfQjtM1h5Y7Z{eHI&{?ip}26Q{4dQh6t#WAa0s)P}eClIt1Hv%*X97UbPFU^}OH^%ke=vN8ip# zkK3_dN|Axiv)s7>A9P4|$2MuT5g?fp7a^>ga7FoT6(X&(<>h0p*T9#fSYchVq@qYA zi$631Sn-Xx%`|IhkMKp6EQ>;*agjyJ8*zLSwySjQQZLqaZqffVL{x_Q9I(ki%(z@{ z^0rB62$fI|udzA(H5adR&x`v`yisBL_cOG<`I6M_XV~|jFs?|(s+xdR5;DJe5Y|&J zP&7v!32Sg7VpmZ@g5@QS({x5CZ9mXs9%Tz{bu1oMza>g4w}QCjd3Bj#xMy##Ak3#uB0uTPDQ;$l)apU<@;TQ zOna~kz*Y5h-nz;E1JlMSa1GHS73FANnH72ZtT~<{o+lp(lb4|j8g4z7g|GaCku^s! z%k*4_=hwCO!VV2wqiIkGdy#MDzoX`IqBX$uc^@$TZ&CDR#0v12k2lQlGL0>ada9Gg zH15#GORG>8yW(cBY`L0+j{H*aE;Yg9kO7XM!wvn$b!kxwWN%QkH|b{i*?g04!A{Fk zF0|}JUbV!%Avj)r7!8keR=j;=2+#7?lU1_mk?H{v{*3TTur`Z+T^SQsG7wOX1D?JnM-tW^8A?z5 zwsu=6@?FKl2qVwZUq*Cl{}ohgoaHxjDOgnO%SGTdZPg=gQo&nQsXi`Tko{Z7^1 zdYR|H=#U3X&^jUE9L}_#-()8v0t*H<=#8{(^28{m#}sZI-KQB3&8(~#VfcVR9z1ZJi{_K)pZ1${Dpo!?xnXKu4UAFAFl-&EM zUrmp~OB{;*CRNspG(N4K5dIUc7*8r5yi>7@0yI&-Rp2$%VLoWPvNVgt)ym~;nJ&DD zZJD|jE-lxmO-HoqVWHhS=dy*v-yjuMZPhvlV$UL?cJnLWcV{pXd-wpydF&N|l@})n5xfPcEJkuS0LoLA@LfIh6@Zl}#w%>f`ob3LB77 z%Z{eh=1^knj5&9U%|C0>Q?F49IPb8IaiG2>Zymsia2=u!jGRgeMqiiK`54+#08s@m zzl=fYh-@hBi{ikxrVUJ}zK4>@jo0)HDqR-Vkg6FDiDK*b!s2%H35B}z}T~{T$+PCp}q(ba_MHnOcw^IP?gX! z_+S4{ZOJuxmS4XD?x7BSCs_0fbZo%Y8*fkCdT)n-(O!GH@#S8x;1_r2*)t&g%0dw< z8R(>H{0lIQmb>^oXb9vy#ncQxJ>YNTL3i2xyD7XtYL*HL*^FDX9Hy)3_ehB5F&s4F z-_;i!OW!3WDvopoLs=Ym&C3l^EnkliIc~lAbIY1|cR8TRWIo++|O9ZN%z1D#`1P|0r01o*~-sxMg(r61s%`H$M_JEdyn(eJ~mdD|xad%GAURgzbkqZbh-6!}1Qua1u4r;oUXmVXmyLoMM`pE?(7x(l?+bKH zhg|}{efUNkoqAyKilHwNZz3Mp!VnkGI8@@z%N&sX7MeOhoYS(IDb+uo=$`vh?-2PK z^l;P=ndeD{*94XMfzBOZInJ~k&Wv*+t`~f^1c9p5s?t&7Ys4)Mtc8V1~vCtCIZd?^)oj&yP+p!ZeEb*FVcO`zMYvYqO@U9If?wl@D)7ZdXVv;^a=Zx1kPGW*utv@+fC{28U|TDeX4qjI92^nf zP9{4Ul%?Q)?y|tzyj{BG+l>!}p_XSn4Mc63A;JW4b%05!L+yrYIG} zUF2_#BHG*ejFu|EL!gB&J)#f>f*#`H-bb8+1iit$3g}GeX{J)%RkS}I-o`;ojm`Va zgzj*S-;w2wL-Q;GEfgPR48?ckyX@EuoNBddG=DZ|qgtiI^zmD~eHbV#-4N-SPW!a! zi-_4}cS_NQvYkIEd|ANK=XZFE_#4rN9-|adnki16YBy)E0%Fn(9k|vshpC%v;7<23 z5K(ge&V?)ahaR@q{py~U;cC(2;h*8A}^ zPAxEcIqhL+#%b{(epB;3As*~ zY@Z-|3$V^I%v}W59C)98wlm80j3ONf96)syM7jnZa&;o%wu19b@@0$t8UBOIJgYzu zRpTmn5Zhi|rppt+GbU10X405!JCr1!O)sTF32}q560Rn#^fb~-hInT?Y+kX@`Eg|7)+RPU{lTzMqAO(x- zkhK?zM~PBa*rhW1i%}+@y8dwLUHh5*Qivwl%bLu;;gCja_oqWXvtH8=0Lr3c@jt9? zK;fhVaKP0$aX5*3g3s7zGJ8IoD}??3vuytV*RrkrSlmuvL-7zZwQ|F((IYSvf(Z8z zQT*HpJFoF2QsOd022hqxsPlbom@!ZrWn2ty6JNazNmlS1K1(|XGmceD@PCS1myxsY zk_O5AUbDveRB#hiT%6eZfJZtVR{3wCMoHq zW%(_V0XAeL%2(>t+p!OxG=Td|I`po9->r*tKqxDiCEH7gUBa6KogK2o3Wv2JD-2v_ z!zyg5CKTOjIdbLCANL-w@zkh9A6ib6V$J;;QY7Y?S(rqfCOA}ga}ofV;%S0E^;VKq zq&OR$mI4!Q7^z2R4+w2VCs6O;H~`--{}VOZ;Uh=W+8A@O8ds~sg=#>gB(TrTAKzx`ueZIr66?F)XwH+TJ4=&6eB=(ui2+V4kQe!A378q!~!EGk)W3nw9^rSQi)jSIa_IYQLUd$C~ z|8qD^^{M%oDR-=wC|NXf*?gWZw*F`P$WbJBS%~z(FjaD9Av<+|Lbt*83eEMJTw(YX&)f)YAm8q0GZ71_&5MzShAc|v-Ok&^3~?o?fH&d*Jo-dDBk;Y zGV4TKN%k7lYA|dK6=w#-D0=BrOvF_VKlmM`oj1JiW)H>J;#dp|TExijIK*s-tr9jg zi=o`P(eGWD6_2{yE?u(Si3j`|%#Jot{X5c^z%Em??ye_=f92zuo02HH@ekt*#UfaJ z1Y_HY-(JCKW|Wh@Pe(XV$oFqaCqzx)2?dQss{V~hvqlA`?m zCQQQOcQ!A|&T}q1WeaFORx(>!XiK)fKos>3r3BD?AW5OP==1Kz2r96n$tqqBp8$sX z70Nsy1Vm`=YrZct3KZX-^^U|twE{i z3A7@j>9|O`d638y?(3;I5h^$Msc0F_|DF z&Mg9A;;hZJvN!p6Jd{|e~!>wkG2#iAJ;vz&xaWm@!7J$ z5_>{Ex4Ni4<;$vK@?6NJ%y-=P)oqwS1r0e)#EW0fu=o}3wVKJP-g~1TF1n$iPAAYX zHW(F{HHMc;aQBCXU_Kf{BeB{Skq0Ggj35RQ{CteabO5rX$qpP93z31!}B6593=1;pnZT8>&2~gF6Z*BL@qvWbj7lqA8?qA?K_N*&~HTfir~igycIHX{StbU zzmhJDWq%wLmL@;u42H*WT_zn?-IMCey?J-BygKc*-SVg|mz0v}S=LGQ>IuHSO@e%A z{?hp6?9zQ!y0ixgBW+6ae;kQ(Jb<;zJVOAkR1%g&FjoH%$`rC-hp#0hOoGXPS@p)- zOTRRP(X^}T)!5XHU`-}T87;eUfmP$hCDKu|o>f?#=ZS2r@H>~Pg6|m&X9BakB*VTvYApk#X5#bIv1s+w!f{kmYXd8C$|OvS8nN( zDtN1$0D5S#&7ZcVD)9h{AT9%IJ;Fp-YM6el!O)B34k1HuJbzhnYz@+qY6-xnT^gvJ zp!N9^L#asbTzVe{o>{h#nFu~%25q%l!YfDeWS4fke7zvs>-A~Ar&J|o>}}LlXv@^V zR+7UCW>a3q^{C-0DuI0 zepxvJPFv;A?#R9punHy*%u4SQceb4h4x0(F5$Q);M;ETK{32`|2WqKr6au9kp}Gu5;J2Lv(*NHVO z?^ZfGH(L(zCx5J{b$`LGOWe8`miCIP&tlH4u|>qpD{1f7hZvyx@f4wbioKi+rpwj? zZz)Kcx4b4cZjd=i*H-!&;?PoSUct2x|7H?;kk!GmzRmVKkRBPI0)#KGG@q~N7#b~D zFgroGAUe?O&G4ME8Y7#JB#dJPf|`r;EdD_@gT4Y-P<0zYDl~?SCSR>D`}G<=61@0$ ztq`Dy#+BI$pdX_#yvc-k^$oi$XNeGG$Eywk5Q(p%meuk30XCgcP?Of#i4f?#9Xn>+ zc~cC2ikYd)rz)qn?_`s`j+I3QL7dDL#{p0(syi3R5w`q^P(oeJfLw4NA|qm*j$x3V z-jJSF9Rclgj1OPT4I~}1!kuVprZu(Gs@Igu0Y$lk*pL`*#bc8YR65;-5it0AG7Bk< z=Y6@uTw_6$2vt1w0k28YX*zRhNkRQta`nLZ-VJvsGZmXKSv{D;GOTafMJm#;5!M%9Jk%Mw;u)L zE=dJ>f+UI(1*{L1rKY3I&jxVuh86QN%@8V1Ix!)aYQIh~653XJDqqn{t7;NbQ_>}* zFjGIV73W~4IzN(~i&HlS-)N54nmdM>FU3Wbzq4EfS5hCRphRNMpY-}Uz@|#(d8HsK zoS^qpAPn>V))9#k2bU-wpDjymQ=$=DtNT0gq|WjjO1F_ucYP^Uoj1NHVwp!OdvStADvow|>^7J5o_Z*cJt==T|n28!OSKzB7VX+FQ zzz2K2$^el4Wn=$T9e?cH8oN>UgajlPFIPG6ymKG8&X&P{Jll_dnF^AZ7u-!;> zesJlX?e#*}uvId_1H)FanvJCUC}@^kWzSVNEm=T{+iqWge?=tew$5VR7`N)>Qbplf zu{jq*K#$_L!9r1Ss3FD&)O5U_JA8OJR>Z0TZ!n?J4{b2^d{D)AhNuH0<4(M8ddTbg z=>(9Si*MWfeYg9@flJ>7Ky&{!?E-7|`R$q93CNTedPx8#*$#yy)cGV*(AS~+inSuN zS(T^{snl2Zxz#-H5-UZ*6XjR@ zeL<5M7pZj)n@$`e^WUpz(Z84$h+=59a%pw$|@z%hh1}Hbk}> z;y04rx(sncbv8LQVu?^49xfklI3%L+uJ7iGl~kq6{Iin1Fg*g1qbsh#La&;#hYh(> zsqwcFIFH6OXcguEs}jo^{J(m;{Ujxz{n7M>-AQN-Wb_s3BsB7$T) zpozSE@o5TBN^YiLkQ9GLf;LO8yK9ptF?(_pj^t`MV!EkD3D?LgvkMj$F{@gun*g?! zCG6N;he29S#yfMjXCYyJ%|~+c!v>BL5SUOC-(kwL14Y8G&z%axY`LnUb7Yjx1Brd;)8vE~vjD|lS+%OF!1(GPc#bIQM>5*j==Oa? ziwHk`^H1r=&NjN@QfCl*ev&?Pp^8ZZKMf_>Ak8L_9LpFT3V@iHLD+Vzf-?3e{Q@-y z)-FEd=ba=PteNq@;7lNU-kw7~02gqN8MtS!Lsb z+NT|X1TjZ-=tBfT z4%n8c;|l&@RX(jxH0%;Y3`KxSEBADL-7O5>3&!qb)kCkLiHE2qmC#i%-Qs_{z*HEc z=c04W+7mO(B|s?ym`Zl|V;GNk#4E&eDj&+wfi6ZXIS2Q|DIz{uh2v-KS-Gt+;6+o> z;9p`2IQagh^{7_`|3)MtoKg-awhzN|wMuYX**$*sJ*$odP0ZXujj#{6jQlHWyomtkzr1a@ivHW?L&riCVlAlp)JbfycHumN#c%Ni)vysVei@!P2 zS>jk8GnXI#E1@73B#h``9rAB5Nq9=72P2WtHS0Nz@A^kT^sg>Zg0)H|mlMsTzNHsB zb9eP2&+3z`*cUjDwhMW!D;Y z? z8DIaK4UYcLUzOD>4^6)j+)m9~>^|gIckXjjn<`jhh`jX%)`iD1oJlQ1s zh2z#@iq%n>1)%(X5lzHG6w3rI0G$ZUmnF}ZjL?9ZtH>-mA*rh}pwd?QH}jcYo$`d= z(|JwDe&8%A;lbVVea!6*QEUE>#~BbTd^4zyhtSX$RJJTP-YopDgy&VjBa0;pc~H$y zJg_K}cw%KZiz%;Gg}@s6p9JK#!b??Aw}ug_^3-lNq9a4^9tNgC4n!hmeLkF@ex+N3 zNH)W99(Ssbvd|FSPh^@dJ|&92xOTh_Wt+$(tUCxD#CLN{l4?-Ax3ft6JwT_eDY%I^ z7-d-D)qES2(6~~DaksyEzKLy5MurW=aZhw<1P4_`B!uE9Gm0(WB1Ik$1XV4!g1Lj z&M*G6FzRLc0Z26ogu7lWAY(RU$m@@||{1J!@KSIw|*Z{ZFu!S8Pz#Y!?GAw%}QEg&Zlp7M(w32d`Ske9fq%sr!! zb39&XynVCU@=PDWFWB5hN-Jt@e!XzDN%^)aQVysskzWnj}Hfr~Z=E~Jl^9js-wO> z8;g&pU@}KrJJoiTZQ0>cZ>%U!vAa@5^i?PHePvNRA_Bg`A~-$|A6-G)OTW07`^MZdg#wZ8^#b*HQpV8qG@Ai72|K0wtLvrpt9` z6JezsVjNLn8}S-b$vR}?&OT<2VR$aYD?_NDhkZ`ejXRWITuNyOW^6~sX z{GNH{%>T@snRCuOqW6g5rPIsLDtQJc?t^Kd=s3d_cu%(oduK9nPMvvSdg5QrggQguJ3f@6^L zhIsw3RB1^p_2b@oHpS#QKTtPFcO+^=(S*luniqvp9;>4yoEYfeZDu`2dy?Fj{&Ps{ zn&*=7@E)d_==AmoH~fd9nmPf*te=x`^`CsT6Z`b#*f447k8c|2m^we`k+9)Yre>}; zSy$}3XlT*tcynJ+5Q(uNPE6}+WrUsz1t)7kJ`Q+ScEJ6;{_f*t)UMcg66v9I3i+6@ zjd~XW&IuVv1Ni?{c+4+7K-wOr%`N@PpExS00l84h0i8lB*rMg14iUQ(X%3kXv_4b= zlZiU@Kq|IwZ&N}wfi|HD17)$hEM7DtRy@i$49dcLAj*xA1SrbpsE1$XBP|4%yxd83 z4tPlSo?%3HUy_FUYgH=q+G^!2giu6=>wKZo_RSCLv;AiE5^3fL_3jHR^9>Y)n^Q7N zfpdF&-qC+q_r+;4-+UiN9If@3e>dQ*g;ng*Zs?rNfu{o-wT7|CV=G`AwHT!Vd|Xc^ z7QH4P$dUEli82qesE_6v?Be}Chn|}h4JaiZkP^G!o@=@$4Ig2z`n%}@Mh;3U(+*(N z#*Hs1SoPGf7A7uPEWg6QwlFr6AWgG9s~uPRxdtoldD4d4-57-j!C;1fnZBYLUlIeD zTN< zQKm|*=s0L5SIs)T;{Us8tP-h|M5ag1+*y06l8ki*y20t_`r$g9!?QQ_g!=IWPo3Oe zIxiNQVZhajF|$Aw`DZf5;&N4myV3$6qE#}vnP}XrR)>FtyVjMZCbh3u?LS`<)GfMj zg}go0i*R3@O?CD$h_e$yNGn<_4>>{%eAK#FV7$UBbe!~5IKqi}|M_sNz&X)vioj(pO#9X-c)UHcWir@~%ihSi5)%^BzA#I&)-2{UWi!{9^ zDgll6c8H8#HE+g=nhKu2d^C$^<4mqnHA7ZjTinn}TC0kQtUgYhKM_@i?eEgZzs}|^ zuI;vb`A(6EPm_LXz^?*lRJN!2W>#RAzSre9~Ue(JL|L?a?uH&;tMy z508nt^$PoN^?j&|M=L!}!AwXZ2|hu6mNE*z`W#!D2qxi2wsCyCoyWRe-bvpR5+uo0 zY#QvDHDGFog$MUAeFm-@Ry4UGHYY!r_jBV%h2 z79r{}PBG&zQclB(qO39Ud4Znc=SZdPwA65;UXeiXCr#iep-_NIh}VQ3MF34P_}qB zmRL1~#`}WOWEUpSP<)Z_Jfb#O@1KbS=fw9JD0a`t!Pr<B;eR(opu1WO4JrU($}n9dtpt{1~%rnGP|~4?zX)a_C})?8Fn0 zBSPE57W(Dgg1?3Ov-#boiH-EE#VyeY=r(SZlG0kn9@HvP-H1%X;_vD7_&!j0laIi8 zn}v$JGpyHo6z?Y@(b32*$x{0CzI-LoH<~QIj;NJw&a8V&G~NEZO_PyXj~}sR|4OLcsC>vYsAb6u+(IIBfg1XZ;$c`7u>qnt=aNWs+KkRJAqgj*i zuzaM0mP771W{uR0tGZD)fI)2J@#~@4^Tptvduu*gKF9cdEP13w`?|3$_g6eha%l^^ z3O@OH=~^GwLbq50<3_Gb!oJRRxlj9+EkRjcpoSVI=*t+Cc!A1L2`ZI)^nv3dV;M0H zsS&m-!ry@-p262rgTk52jk}r`EAqa`j9vhZW$C&pfdya&#A%-%e&;UP-`o|3CL?2R zetmPJQs6$01f=6I^0Ndjd0=I7oy$;gp=(Z#k5^i?=rOO25q3R(R?U4W=MR)B<&FaN%fmn|x8w9#UV7%M4a;&9$qyQfYv!Xl zJUz>nrxjDNp*)se)@No-NL~%)))^?qI9eFOnbfrRGPfgwetu?ynpXL#P_ckv)OJc* zSYrZMa%^KE!&bMZHi;udE2nxbA&At2Pe|NU-Q{It$*V4`YKumOT^SDp;DL%AHZP63 zbGn1JW9Cd&K@0Eo(L}ECm#blqszmkYFkist=7>s?_D{a}htaMpcw`#*b25u_7m(+d zq<=7<#KH~>;;@;br>{Twn;@vo_AIFdv?~%7Pgk1lY4*3~?DZ{qG06j|G4( zzGIo&ucbermWOL9Q}dJiAUzgutTV?FJSG~kpL0`ypk2e-blGQ1)VIBxJhWC4DijNu zBUOxHes_fqGb}Kax=W({?@4UQG3F?1E&>`9Boz31?~982IhSF7UNo;>;frj;`FM0L zi*O(zTa^ZGkWAt+!4z8A?&Q8$1>zvoNa8i5Hvys`y!j9LCDvHh(;AbJ+4c5EynAr;#8q$08_4j*84_l0tWBG}tBWfH-g+buDDytI$McI~ L&1*;D@QeI^&K7Op literal 0 HcmV?d00001 diff --git a/channel/meta/bootSound.btsnd b/channel/meta/bootSound.btsnd new file mode 100644 index 0000000000000000000000000000000000000000..ac07882436ba18e53614027317acf303c5e3bb1d GIT binary patch literal 450076 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 literal 0 HcmV?d00001 diff --git a/channel/meta/bootTvTex.tga b/channel/meta/bootTvTex.tga new file mode 100644 index 0000000000000000000000000000000000000000..02ae2f458fd002c1a56602eba48e89417eb9a93f GIT binary patch literal 2764844 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 z009C72oNAZfB*pk1PBlyK!5-N0t5&UAV7cs0RjXF5FkK+009C72oNAZfB*pk1PBly zK!5-N0t5&UAV7cs0RjXF5FkK+009C72oNAZfB*pk1PBlyK!5-N0t5&UAV7cs0RjXF z5FkK+009C72oNAZfB*pk1PBlyK!5-N0t5&UAV7cs0RjXF5FkK+009C72oNAZfB*pk z1PBlyK!5-N0t5&UAV7cs0RjXF5FkK+009C72oNAZfB*pk1PBlyK!5-N0t5&UAV7cs z0RjXF5FkK+009C72oNAZfB*pk1PBlyK!5-N0t5&UAV7cs0RjXF5FkK+009C72oNAZ zfB*pk1PBlyK!5-N0t5&UAV7cs0RjXF5FkK+009C72oNAZfB*pk1PBlyK!5-N0t5&U zAV7cs0RjXF5FkK+009C72oNAZfB*pk1PBlyK!5-N0t5&UAV7cs0RjXF5FkK+009C7 z2oNAZfB*pk1PBlyK!5-N0t5&UAV7cs0RjXF5FkK+009C72oNAZfB*pk1PBlyK!5-N z0t5&UAV7cs0RjXF5FkK+009C72oNAZfB*pk1PBlyK!5-N0t5&UAV7cs0RjXF5FkK+ z009C72oNAZfB*pk1PBlyK!5-N0t5&UAV7cs0RjXF5FkK+009C72oNAZfB*pk1PBly zK!5-N0t5&UAV7cs0RjXF5FkK+009C72oNAZfB*pk1PBlyK!5-N0t5&UAV7cs0RjXF z5FkK+009C72oNAZfB*pk1PBlyK!5-N0t5&UAV7cs0RjXF5FkK+009C72oNAZfB*pk z1PBlyK!5-N0t5&UAV7cs0RjXF5FkK+009C72oNAZfB*pk1PBlyK!5-N0t5&UAV7cs z0RjXF5FkK+009C72oNAZfB*pk1PBlyK!5-N0t5&UAV7cs0RjXF5FkK+009C72oNAZ zfB*pk1PBlyK!5-N0t5&UAV7cs0RjXF5FkK+009C72oNAZfB*pk1PBlyK!5-N0t5&U zAV7cs0RjXF5FkK+009C72oNAZfB*pk1PBlyK!5-N0t5&UAV7cs0RjXF5FkK+009C7 z2oNAZfB*pk1PBlyK!5-N0t5&UAV7cs0RjXF5FkK+009C72oNAZfB*pk1PBlyK!5-N z0t5&UAV7cs0RjXF5FkK+009C72oNAZfB*pk1PBlyK!5-N0t5&UAV7cs0RjXF5FkK+ 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 z3>YwAz<>b*1`HT5V8DO@0|pEjFkrxd0RsjM7%*VKfB^#r3>YwAz<>b*1`HT5V8DO@ z0|pEjFkrxd0RsjM7%*VKfB^#r3>YwAz<>b*1`HT5V8DO@0|pEjFkrxd0RsjM7%*VK zfB^#r3>YwAz<>b*1`HT5V8DO@0|pEjFkrxd0RsjM7%*VKfB^#r3>YwAz<>b*1`HT5 zV8DO@0|pEjFkrxd0RsjM7%*VKfB^#r3>YwAz<>b*1`HT5V8DO@0|pEjFkrxd0RsjM z7%*VKfB^#r3>YwAz<>b*1`HT5V8DO@0|pEjFkrxd0RsjM7%*VKfB^#r3>YwAz<>b* z1`HT5V8DO@0|pEjFkrxd0RsjM7%*VKfB^#r3>YwAz<>b*1`HT5V8DO@0|pEjFkrxd z0RsjM7%*VKfB^#r3>YwAz<>b*1`HT5V8DO@0|pEjFkrxd0RsjM7%*VKfB^#r3>YwA zz<>b*1`HT5V8DO@0|pEjFkrxd0RsjM7%*VKfB^#r3>YwAz<>b*1`HT5V8DO@0|pEj zFkrxd0RsjM7%*VKfB^#r3>YwAz<>b*1`HT5V8DO@0|pEjFkrxd0RsjM7%*VKfB^#r z3>YwAz<>b*1`HT5V8DO@0|pEjFkrxd0RsjM7%*VKfB^#r3>YwAz<>b*1`HT5V8DO@ z0|pEjFkrxd0RsjM7%*VKfB^#r3>YwAz<>b*1`HT5V8DO@0|pEjFkrxd0RsjM7%*VK zfB^#r3>YwAz<>b*1`HT5V8DO@0|pEjFkrxd0RsjM7%*VKfB^#r3>YwAz<>b*1`HT5 zV8DO@0|pEjFkrxd0RsjM7%*VKfB^#r3>YwAz<>b*1`HT5V8DO@0|pEjFkrxd0RsjM z7%*VKfB^#r3>YwAz<>b*1`HT5V8DO@0|pEjFkrxd0RsjM7%*VKfB^#r3>YwAz<>b* z1`HT5V8DO@0|pEjFkrxd0RsjM7%*VKfB^#r3>YwAz<>b*1`HT5V8DO@0|pEjFkrxd z0RsjM7%*VKfB^#r3>YwAz<>b*1`HT5V8DO@0|pEjFkrxd0RsjM7%*VKfB^#r3>YwA zz<>b*1`HT5V8DO@0|pEjFkrxd0RsjM7%*VKfB^#r3>YwAz<>b*1`HT5V8DO@0|pEj zFkrxd0RsjM7%*VKfB^#r3>YwAz<>b*1`HT5V8DO@0|pEjFkrxd0RsjM7%*VKfB^#r z3>YwAz<>b*1`HT5V8DO@0|pEjFkrxd0RsjM7%*VKfB^#r3>YwAz<>b*1`HT5V8DO@ z0|pEjFkrxd0RsjM7%*VKfB^#r3>YwAz<>b*1`HT5V8DO@0|pEjFkrxd0RsjM7%*VK zfB^#r3>YwAz<>b*1`HT5V8DO@0|pEjFkrxd0RsjM7%*VKfB^#r3>YwAz<>b*1`HT5 zV8DO@0|pEjFkrxd0RsjM7%*VKfB^#r3>YwAz<>b*1`HT5V8DO@0|pEjFkrxd0RsjM z7%*VKfB^#r3>YwAz<>b*1`HT5V8DO@0|pEjFkrxd0RsjM7%*VKfB^#r3>YwAz<>b* z1`HT5V8DO@0|pEjFkrxd0RsjM7%*VKfB^#r3>YwAz<>b*1`HT5V8DO@0|pEjFkrxd z0RsjM7%*VKfB^#r3>YwAz<>b*1`HT5V8DO@0|pEjFkrxd0RsjM7%*VKfB^#r3>YwA iz<>b*1`HT5V8DO@0|pHIGEla0&v^66s~_K)EoxbOYOSvT literal 0 HcmV?d00001 diff --git a/channel/meta/iconTex.tga b/channel/meta/iconTex.tga new file mode 100644 index 0000000000000000000000000000000000000000..1cac4f1559c559353c56fe750a880ebb8b659f64 GIT binary patch literal 65580 zcmeI4-)|IE6vsC_`2_w6raTJ7rbGs!l|Wk4g5A9)KGiPVYewv)n`Elpo zIp5DY_sktSx!j`M%ugX#$UXAV#d947!v`<`126ysFaQHE00S@p126ysFaQHE00S@p z126ysFaQHE00S@p126ysFaQHE00S@p126ysFaQHE00S@p126ysFaQHE00S@p126ys zFaQHE00S@p126ysFaQHE00Y%B&>D0bZQJl<7vILn==VXiwGXe4{@Kk-=$~C}s?Ft5 z&PRXr*JgnHUt7iwjdpt1bju1ijk@js*?T;3SlqsO6Lscvor(UnjkhTCu4WtbM}OZu zs-FA9`Gx#n(|L*bub=oId1aG%si)L7yf|taUpwz*NymTFu5ZoS*4-u6+&W|y2RGEM zp?SjbMd%yNxi;-(}(YuV2&8^W3m<$0=t#>w{jC3;tENhl8t5-=S~P)=0B| z^q=Jl{qMiaA^uC>X=%n^+SexjiGO?kU;FePv-*WGFN;(Et$g{k(??_e6VniUSz=3r zakDh|Lfsw>K4AW@@_l|B{h#O@b^N^|C^~iCqTsG`p3SW0cG@{wvwtc7SK~|cU)XB} z=wDjvN$hLJU)tA3|N7DYlt}U~F4{@DJl-Yqo!E)^!b+*kf&n zr`P$em)MfvnpqX>P0ehdh1+SzZIu3{+&1#f6;qs?ifqy~ntM$M6 z))=LGjN<>a+er6;{Kl|H`^bK9crj zF}^E}NxBc>KN=I2e4WMP=pRjM$!}TIx6+uT`-oHLRnu1L+qeFcp8wmMpEs9oO*&T1 znCx>uI&{pbDZ_UmmHfI;j!PQYKG52h`bK}fbsdRGNdqmt?dwW?qd)rltP7L>li@^) zK|4;hwxzy_|73KPa=o-q(m+FRsUM#>56^k3zv$FpLqi3p&bxf;y7wBTG@hHk{N}W$ z{)@imJC`HL-{@c4SSS8xS(bPt{_n4a%#GWmewX}B{1g8^3^4!eadPUjys>SdZ`dSl zk01NV*yf{scnF-+;Ncp>(eZE>t=b=CP+pO{Yr^kft>m;_Nxc1#g{Of5={-1sS zTaV9wlKuzwbs8TV+~R%{rhWYuv-7~XV|^F?F}B5t|2N-w+x-6bpO*dQtl!P|{CfPz zxUucivCoZdAHK8K@x@qiVg6l@q;;Hq()Yje&kT6~jZhr@M@Nd@TF=LTy}z$}z*%R0 zclsNraeVY3w?+Tj&dXV23H{OEel{Tg*AEj%-^)ASLEN^r-|Rm->18e7-7`Lx-*>|K zyYs?Zhs}>yCQIzvRsZ+DcH3}!&yIfQe!_dqTHej_cqYE?aB3(!N6c(X|Igfa-|NTE zIsI&G?)9z-XT~u1--)m4Cw8?MLjU?^2>sE2ZcZ)tyKkE=Lmgm~K+wvXDdt2K!wyeng2d>&sNB{r; literal 0 HcmV?d00001 diff --git a/channel/meta/meta.xml b/channel/meta/meta.xml new file mode 100644 index 0000000..d6ba535 --- /dev/null +++ b/channel/meta/meta.xml @@ -0,0 +1,140 @@ + +

+ 1 + WUP-N-RWRE + WUP + 0001 + + 0 + 00000000 + 00000000 + 00000000 + 00000000 + 00000000 + 00000004 + 00000000 + 1 + 0 + 0005000046425244 + 00004252 + 0000000000000000 + 000500101000400A + 0000000000000000 + 0000000001790000 + 0000000000000000 + 0000000000000000 + 0000000000000000 + 0 + 00000000 + 0000000000000000 + 1 + 0 + 0 + 0 + 0 + FFFFFFFF + 128 + 128 + 192 + 128 + 128 + 192 + 128 + 128 + 128 + 128 + 128 + 128 + 192 + 192 + 192 + 192 + 1 + 0 + 1 + 0 + 1 + 0 + + 0 + 1 + 1 + 0 + 0 + 00010001 + 00000000 + 00000000 + 00000000 + 00000000 + 00000000 + 00000003 + 00000000 + Flappy Bird + Flappy Bird + Flappy Bird + Flappy Bird + Flappy Bird + Flappy Bird + Flappy Bird + Flappy Bird + Flappy Bird + Flappy Bird + Flappy Bird + Flappy Bird + Flappy Bird + Flappy Bird + Flappy Bird + Flappy Bird + Flappy Bird + Flappy Bird + Flappy Bird + Flappy Bird + Flappy Bird + Flappy Bird + Flappy Bird + Flappy Bird + rw-r-r_0644 + rw-r-r_0644 + rw-r-r_0644 + rw-r-r_0644 + rw-r-r_0644 + rw-r-r_0644 + rw-r-r_0644 + rw-r-r_0644 + rw-r-r_0644 + rw-r-r_0644 + rw-r-r_0644 + rw-r-r_0644 + 00000000 + 00000000 + 00000000 + 00000000 + 00000000 + 00000000 + 00000000 + 00000000 + 00000000 + 00000000 + 00000000 + 00000000 + 00000000 + 00000000 + 00000000 + 00000000 + 00000000 + 00000000 + 00000000 + 00000000 + 00000000 + 00000000 + 00000000 + 00000000 + 00000000 + 00000000 + 00000000 + 00000000 + 00000000 + 00000000 + 00000000 + 00000000 + diff --git a/filelist.sh b/filelist.sh index 87cbee1..15addd3 100755 --- a/filelist.sh +++ b/filelist.sh @@ -42,15 +42,13 @@ cat < $outFile #ifndef _FILELIST_H_ #define _FILELIST_H_ -#include - typedef struct _RecourceFile { - const char *filename; - const u8 *DefaultFile; - const u32 &DefaultFileSize; - u8 *CustomFile; - u32 CustomFileSize; + const char *filename; + const unsigned char *DefaultFile; + const unsigned int &DefaultFileSize; + unsigned char *CustomFile; + unsigned int CustomFileSize; } RecourceFile; EOF @@ -59,8 +57,8 @@ for i in ${files[@]} do filename=${i%.*} extension=${i##*.} - echo 'extern const u8 '$filename'_'$extension'[];' >> $outFile - echo 'extern const u32 '$filename'_'$extension'_size;' >> $outFile + echo 'extern const unsigned char '$filename'_'$extension'[];' >> $outFile + echo 'extern const unsigned int '$filename'_'$extension'_size;' >> $outFile echo '' >> $outFile done diff --git a/src/Application.cpp b/src/Application.cpp index 51c01d4..8d3d2f2 100644 --- a/src/Application.cpp +++ b/src/Application.cpp @@ -14,24 +14,30 @@ * You should have received a copy of the GNU General Public License * along with this program. If not, see . ****************************************************************************/ +#include +#include +#include +#include #include "Application.h" #include "common/common.h" -#include "dynamic_libs/os_functions.h" #include "gui/FreeTypeGX.h" #include "gui/VPadController.h" #include "gui/WPadController.h" #include "resources/Resources.h" #include "sounds/SoundHandler.hpp" +#include "system/memory.h" #include "utils/logger.h" Application *Application::applicationInstance = NULL; bool Application::exitApplication = false; +bool Application::quitRequest = false; Application::Application() : CThread(CThread::eAttributeAffCore1 | CThread::eAttributePinnedAff, 0, 0x20000) , bgMusic(NULL) , video(NULL) , mainWindow(NULL) + , fontSystem(NULL) , exitCode(EXIT_RELAUNCH_ON_LOAD) { controller[0] = new VPadController(GuiTrigger::CHANNEL_1); @@ -41,16 +47,18 @@ Application::Application() controller[4] = new WPadController(GuiTrigger::CHANNEL_5); //! create bgMusic - /* - bgMusic = new GuiSound(Resources::GetFile("bgMusic.ogg"), Resources::GetFileSize("bgMusic.ogg")); - bgMusic->SetLoop(true); - bgMusic->Play(); - bgMusic->SetVolume(50);*/ +// bgMusic = new GuiSound(Resources::GetFile("bgMusic.ogg"), Resources::GetFileSize("bgMusic.ogg")); +// bgMusic->SetLoop(true); +// bgMusic->Play(); +// bgMusic->SetVolume(50); exitApplication = false; + + ProcUIInit(OSSavesDone_ReadyToRelease); } -Application::~Application(){ +Application::~Application() +{ log_printf("Destroy music\n"); delete bgMusic; @@ -61,7 +69,6 @@ Application::~Application(){ delete controller[i]; log_printf("Destroy async deleter\n"); - AsyncDeleter::triggerDeleteProcess(); AsyncDeleter::destroyInstance(); log_printf("Clear resources\n"); @@ -69,9 +76,12 @@ Application::~Application(){ log_printf("Stop sound handler\n"); SoundHandler::DestroyInstance(); + + ProcUIShutdown(); } -int Application::exec(){ +int Application::exec() +{ //! start main GX2 thread resumeThread(); //! now wait for thread to finish @@ -80,7 +90,15 @@ int Application::exec(){ return exitCode; } -void Application::fadeOut(){ +void Application::quit(int code) +{ + exitCode = code; + exitApplication = true; + quitRequest = true; +} + +void Application::fadeOut() +{ GuiImage fadeOut(video->getTvWidth(), video->getTvHeight(), (GX2Color){ 0, 0, 0, 255 }); for(int i = 0; i < 255; i += 10) @@ -94,9 +112,9 @@ void Application::fadeOut(){ video->prepareDrcRendering(); mainWindow->drawDrc(video); - GX2SetDepthOnlyControl(GX2_DISABLE, GX2_DISABLE, GX2_COMPARE_ALWAYS); + GX2SetDepthOnlyControl(GX2_DISABLE, GX2_DISABLE, GX2_COMPARE_FUNC_ALWAYS); fadeOut.draw(video); - GX2SetDepthOnlyControl(GX2_ENABLE, GX2_ENABLE, GX2_COMPARE_LEQUAL); + GX2SetDepthOnlyControl(GX2_ENABLE, GX2_ENABLE, GX2_COMPARE_FUNC_LEQUAL); video->drcDrawDone(); @@ -105,9 +123,9 @@ void Application::fadeOut(){ mainWindow->drawTv(video); - GX2SetDepthOnlyControl(GX2_DISABLE, GX2_DISABLE, GX2_COMPARE_ALWAYS); + GX2SetDepthOnlyControl(GX2_DISABLE, GX2_DISABLE, GX2_COMPARE_FUNC_ALWAYS); fadeOut.draw(video); - GX2SetDepthOnlyControl(GX2_ENABLE, GX2_ENABLE, GX2_COMPARE_LEQUAL); + GX2SetDepthOnlyControl(GX2_ENABLE, GX2_ENABLE, GX2_COMPARE_FUNC_LEQUAL); video->tvDrawDone(); @@ -127,36 +145,100 @@ void Application::fadeOut(){ video->drcEnable(false); } -void Application::executeThread(void){ - log_printf("Initialize video\n"); - video = new CVideo(GX2_TV_SCAN_MODE_720P, GX2_DRC_SINGLE); +bool Application::procUI(void) +{ + bool executeProcess = false; - log_printf("Video size %i x %i\n", video->getTvWidth(), video->getTvHeight()); + switch(ProcUIProcessMessages(true)) + { + case PROCUI_STATUS_EXITING: + { + log_printf("PROCUI_STATUS_EXITING\n"); + exitCode = EXIT_SUCCESS; + exitApplication = true; + break; + } + case PROCUI_STATUS_RELEASE_FOREGROUND: + { + log_printf("PROCUI_STATUS_RELEASE_FOREGROUND\n"); + if(video != NULL) + { + // we can turn of the screen but we don't need to and it will display the last image + video->tvEnable(true); + video->drcEnable(true); - //! setup default Font - log_printf("Initialize main font system\n"); - FreeTypeGX *fontSystem = new FreeTypeGX(Resources::GetFile("font.ttf"), Resources::GetFileSize("font.ttf"), true); - GuiText::setPresetFont(fontSystem); + log_printf("delete fontSystem\n"); + delete fontSystem; + fontSystem = NULL; - log_printf("Initialize main window\n"); + log_printf("delete video\n"); + delete video; + video = NULL; - mainWindow = new MainWindow(video->getTvWidth(), video->getTvHeight()); + log_printf("deinitialze memory\n"); + memoryRelease(); + ProcUIDrawDoneRelease(); + } + else + { + ProcUIDrawDoneRelease(); + } + break; + } + case PROCUI_STATUS_IN_FOREGROUND: + { + if(!quitRequest) + { + if(video == NULL) + { + log_printf("PROCUI_STATUS_IN_FOREGROUND\n"); + log_printf("initialze memory\n"); + memoryInitialize(); + log_printf("Initialize video\n"); + video = new CVideo(GX2_TV_SCAN_MODE_720P, GX2_DRC_RENDER_MODE_SINGLE); + log_printf("Video size %i x %i\n", video->getTvWidth(), video->getTvHeight()); + + //! setup default Font + log_printf("Initialize main font system\n"); + FreeTypeGX *fontSystem = new FreeTypeGX(Resources::GetFile("font.ttf"), Resources::GetFileSize("font.ttf"), true); + GuiText::setPresetFont(fontSystem); + + if(mainWindow == NULL) + { + log_printf("Initialize main window\n"); + mainWindow = new MainWindow(video->getTvWidth(), video->getTvHeight()); + } + + } + executeProcess = true; + } + break; + } + case PROCUI_STATUS_IN_BACKGROUND: + default: + break; + } + + return executeProcess; +} + +void Application::executeThread(void) +{ log_printf("Entering main loop\n"); //! main GX2 loop (60 Hz cycle with max priority on core 1) while(!exitApplication) { + if(procUI() == false) + continue; + //! Read out inputs for(int i = 0; i < 5; i++) { if(controller[i]->update(video->getTvWidth(), video->getTvHeight()) == false) continue; - if(controller[i]->data.buttons_d & VPAD_BUTTON_HOME){ - exitApplication = true; - } - //! update controller states mainWindow->update(controller[i]); } @@ -190,9 +272,24 @@ void Application::executeThread(void){ AsyncDeleter::triggerDeleteProcess(); } - fadeOut(); + //! in case we exit to a homebrew let's smoothly fade out + if(video) + { + fadeOut(); + } + log_printf("delete mainWindow\n"); delete mainWindow; + mainWindow = NULL; + + log_printf("delete fontSystem\n"); delete fontSystem; + fontSystem = NULL; + + log_printf("delete video\n"); delete video; + video = NULL; + + log_printf("deinitialze memory\n"); + memoryRelease(); } diff --git a/src/Application.h b/src/Application.h index 9abbafd..46dc8d9 100644 --- a/src/Application.h +++ b/src/Application.h @@ -21,6 +21,9 @@ #include "video/CVideo.h" #include "system/CThread.h" +// forward declaration +class FreeTypeGX; + class Application : public CThread { public: @@ -50,22 +53,24 @@ public: int exec(void); void fadeOut(void); - void quit(int code) { - exitCode = code; - exitApplication = true; - } + void quit(int code); + private: Application(); virtual ~Application(); + bool procUI(void); + static Application *applicationInstance; static bool exitApplication; + static bool quitRequest; void executeThread(void); GuiSound *bgMusic; CVideo *video; MainWindow *mainWindow; + FreeTypeGX *fontSystem; GuiController *controller[5]; int exitCode; }; diff --git a/src/common/common.h b/src/common/common.h index 7d224c8..5e353eb 100644 --- a/src/common/common.h +++ b/src/common/common.h @@ -7,8 +7,10 @@ extern "C" { #include "os_defs.h" +#define HBL_VERSION_INT 200 + #define CAFE_OS_SD_PATH "/vol/external01" -#define SD_PATH "sd:" +#define SD_PATH "fs:" #define WIIU_PATH "/wiiu" /* Macros for libs */ @@ -40,11 +42,19 @@ extern "C" { #define ELF_DATA_ADDR (*(volatile unsigned int*)(MEM_BASE + 0x1300 + 0x00)) #define ELF_DATA_SIZE (*(volatile unsigned int*)(MEM_BASE + 0x1300 + 0x04)) +#define HBL_CHANNEL_OFFSET (0x1300 + 0x08) +#define HBL_CHANNEL (*(volatile unsigned int*)(MEM_BASE + HBL_CHANNEL_OFFSET)) +#define RPX_MAX_SIZE (*(volatile unsigned int*)(MEM_BASE + 0x1300 + 0x0C)) +#define RPX_MAX_CODE_SIZE (*(volatile unsigned int*)(MEM_BASE + 0x1300 + 0x10)) #define MAIN_ENTRY_ADDR (*(volatile unsigned int*)(MEM_BASE + 0x1400 + 0x00)) +#define OS_FIRMWARE_OFFSET (0x1400 + 0x04) #define OS_FIRMWARE (*(volatile unsigned int*)(MEM_BASE + 0x1400 + 0x04)) #define OS_SPECIFICS ((OsSpecifics*)(MEM_BASE + 0x1500)) +#define MEM_AREA_TABLE ((s_mem_area*)(MEM_BASE + 0x1600)) +#define APP_BASE_MEM ((unsigned char*)(MEM_BASE + 0x2000)) + #ifndef EXIT_SUCCESS #define EXIT_SUCCESS 0 #endif diff --git a/src/common/gx2_ext.h b/src/common/gx2_ext.h new file mode 100644 index 0000000..2746298 --- /dev/null +++ b/src/common/gx2_ext.h @@ -0,0 +1,177 @@ +#ifndef __GX2_EXTENSION_H +#define __GX2_EXTENSION_H + +#ifdef __cplusplus +extern "C" { +#endif + +#include +#include +#include +#include +#include +#include +#include +#include + +#define GX2_FALSE 0 +#define GX2_TRUE 1 +#define GX2_DISABLE 0 +#define GX2_ENABLE 1 + +#define GX2_COMMAND_BUFFER_SIZE 0x400000 +#define GX2_SCAN_BUFFER_ALIGNMENT 0x1000 +#define GX2_CONTEXT_STATE_ALIGNMENT 0x100 +#define GX2_SHADER_ALIGNMENT 0x100 +#define GX2_VERTEX_BUFFER_ALIGNMENT 0x40 +#define GX2_INDEX_BUFFER_ALIGNMENT 0x20 + +#define GX2_AA_BUFFER_CLEAR_VALUE 0xCC + +#define GX2_COMP_SEL_NONE 0x04040405 +#define GX2_COMP_SEL_X001 0x00040405 +#define GX2_COMP_SEL_XY01 0x00010405 +#define GX2_COMP_SEL_XYZ1 0x00010205 +#define GX2_COMP_SEL_XYZW 0x00010203 +#define GX2_COMP_SEL_XXXX 0x00000000 +#define GX2_COMP_SEL_YYYY 0x01010101 +#define GX2_COMP_SEL_ZZZZ 0x02020202 +#define GX2_COMP_SEL_WWWW 0x03030303 +#define GX2_COMP_SEL_WZYX 0x03020100 +#define GX2_COMP_SEL_WXYZ 0x03000102 + +static const u32 attribute_dest_comp_selector[20] = { + GX2_COMP_SEL_X001, GX2_COMP_SEL_XY01, GX2_COMP_SEL_X001, GX2_COMP_SEL_X001, GX2_COMP_SEL_XY01, GX2_COMP_SEL_X001, + GX2_COMP_SEL_X001, GX2_COMP_SEL_XY01, GX2_COMP_SEL_XY01, GX2_COMP_SEL_XYZ1, GX2_COMP_SEL_XYZW, GX2_COMP_SEL_XYZW, + GX2_COMP_SEL_XY01, GX2_COMP_SEL_XY01, GX2_COMP_SEL_XYZW, GX2_COMP_SEL_XYZW, GX2_COMP_SEL_XYZ1, GX2_COMP_SEL_XYZ1, + GX2_COMP_SEL_XYZW, GX2_COMP_SEL_XYZW +}; + +static const u32 texture_comp_selector[54] = { + GX2_COMP_SEL_NONE, GX2_COMP_SEL_X001, GX2_COMP_SEL_XY01, GX2_COMP_SEL_NONE, GX2_COMP_SEL_NONE, GX2_COMP_SEL_X001, + GX2_COMP_SEL_X001, GX2_COMP_SEL_XY01, GX2_COMP_SEL_XYZ1, GX2_COMP_SEL_XYZ1, GX2_COMP_SEL_XYZW, GX2_COMP_SEL_XYZW, + GX2_COMP_SEL_WZYX, GX2_COMP_SEL_X001, GX2_COMP_SEL_X001, GX2_COMP_SEL_XY01, GX2_COMP_SEL_XY01, GX2_COMP_SEL_NONE, + GX2_COMP_SEL_NONE, GX2_COMP_SEL_NONE, GX2_COMP_SEL_NONE, GX2_COMP_SEL_NONE, GX2_COMP_SEL_XYZ1, GX2_COMP_SEL_NONE, + GX2_COMP_SEL_NONE, GX2_COMP_SEL_XYZW, GX2_COMP_SEL_XYZW, GX2_COMP_SEL_WZYX, GX2_COMP_SEL_XY01, GX2_COMP_SEL_XY01, + GX2_COMP_SEL_XY01, GX2_COMP_SEL_XYZW, GX2_COMP_SEL_XYZW, GX2_COMP_SEL_NONE, GX2_COMP_SEL_XYZW, GX2_COMP_SEL_XYZW, + GX2_COMP_SEL_NONE, GX2_COMP_SEL_NONE, GX2_COMP_SEL_NONE, GX2_COMP_SEL_XYZ1, GX2_COMP_SEL_XYZ1, GX2_COMP_SEL_X001, + GX2_COMP_SEL_XY01, GX2_COMP_SEL_XYZ1, GX2_COMP_SEL_NONE, GX2_COMP_SEL_NONE, GX2_COMP_SEL_NONE, GX2_COMP_SEL_XYZ1, + GX2_COMP_SEL_XYZ1, GX2_COMP_SEL_XYZW, GX2_COMP_SEL_XYZW, GX2_COMP_SEL_XYZW, GX2_COMP_SEL_X001, GX2_COMP_SEL_XY01 +}; + +typedef struct _GX2Color { + u8 r, g, b, a; +} GX2Color; + +typedef struct _GX2ColorF32 { + f32 r, g, b, a; +} GX2ColorF32; + +static inline void GX2InitDepthBuffer(GX2DepthBuffer *depthBuffer, GX2SurfaceDim dim, u32 width, u32 height, u32 depth, GX2SurfaceFormat format, GX2AAMode aa) +{ + depthBuffer->surface.dim = dim; + depthBuffer->surface.width = width; + depthBuffer->surface.height = height; + depthBuffer->surface.depth = depth; + depthBuffer->surface.mipLevels = 1; + depthBuffer->surface.format = format; + depthBuffer->surface.aa = aa; + depthBuffer->surface.use = (GX2SurfaceUse)(((format==GX2_SURFACE_FORMAT_UNORM_R24_X8) || (format==GX2_SURFACE_FORMAT_FLOAT_D24_S8)) ? + GX2_SURFACE_USE_DEPTH_BUFFER : (GX2_SURFACE_USE_DEPTH_BUFFER | GX2_SURFACE_USE_TEXTURE)); + depthBuffer->surface.tileMode = GX2_TILE_MODE_DEFAULT; + depthBuffer->surface.swizzle = 0; + depthBuffer->viewMip = 0; + depthBuffer->viewFirstSlice = 0; + depthBuffer->viewNumSlices = depth; + depthBuffer->depthClear = 1.0f; + depthBuffer->stencilClear = 0; + depthBuffer->hiZPtr = NULL; + depthBuffer->hiZSize = 0; + GX2CalcSurfaceSizeAndAlignment(&depthBuffer->surface); + GX2InitDepthBufferRegs(depthBuffer); +} + +static inline void GX2InitColorBuffer(GX2ColorBuffer *colorBuffer, GX2SurfaceDim dim, u32 width, u32 height, u32 depth, GX2SurfaceFormat format, GX2AAMode aa) +{ + colorBuffer->surface.dim = dim; + colorBuffer->surface.width = width; + colorBuffer->surface.height = height; + colorBuffer->surface.depth = depth; + colorBuffer->surface.mipLevels = 1; + colorBuffer->surface.format = format; + colorBuffer->surface.aa = aa; + colorBuffer->surface.use = GX2_SURFACE_USE_TEXTURE_COLOR_BUFFER_TV; + colorBuffer->surface.imageSize = 0; + colorBuffer->surface.image = NULL; + colorBuffer->surface.mipmapSize = 0; + colorBuffer->surface.mipmaps = NULL; + colorBuffer->surface.tileMode = GX2_TILE_MODE_DEFAULT; + colorBuffer->surface.swizzle = 0; + colorBuffer->surface.alignment = 0; + colorBuffer->surface.pitch = 0; + u32 i; + for(i = 0; i < 13; i++) + colorBuffer->surface.mipLevelOffset[i] = 0; + colorBuffer->viewMip = 0; + colorBuffer->viewFirstSlice = 0; + colorBuffer->viewNumSlices = depth; + colorBuffer->aaBuffer = NULL; + colorBuffer->aaSize = 0; + for(i = 0; i < 5; i++) + colorBuffer->regs[i] = 0; + + GX2CalcSurfaceSizeAndAlignment(&colorBuffer->surface); + GX2InitColorBufferRegs(colorBuffer); +} + +static inline void GX2InitAttribStream(GX2AttribStream* attr, u32 location, u32 buffer, u32 offset, GX2AttribFormat format) +{ + attr->location = location; + attr->buffer = buffer; + attr->offset = offset; + attr->format = format; + attr->type = GX2_ATTRIB_INDEX_PER_VERTEX; + attr->aluDivisor = 0; + attr->mask = attribute_dest_comp_selector[format & 0xff]; + attr->endianSwap = GX2_ENDIAN_SWAP_DEFAULT; +} + +static inline void GX2InitTexture(GX2Texture *tex, u32 width, u32 height, u32 depth, u32 mipLevels, GX2SurfaceFormat format, GX2SurfaceDim dim, GX2TileMode tile) +{ + tex->surface.dim = dim; + tex->surface.width = width; + tex->surface.height = height; + tex->surface.depth = depth; + tex->surface.mipLevels = mipLevels; + tex->surface.format = format; + tex->surface.aa = GX2_AA_MODE1X; + tex->surface.use = GX2_SURFACE_USE_TEXTURE; + tex->surface.imageSize = 0; + tex->surface.image = NULL; + tex->surface.mipmapSize = 0; + tex->surface.mipmaps = NULL; + tex->surface.tileMode = tile; + tex->surface.swizzle = 0; + tex->surface.alignment = 0; + tex->surface.pitch = 0; + u32 i; + for(i = 0; i < 13; i++) + tex->surface.mipLevelOffset[i] = 0; + tex->viewFirstMip = 0; + tex->viewNumMips = mipLevels; + tex->viewFirstSlice = 0; + tex->viewNumSlices = depth; + tex->compMap = texture_comp_selector[format & 0x3f]; + for(i = 0; i < 5; i++) + tex->regs[i] = 0; + + GX2CalcSurfaceSizeAndAlignment(&tex->surface); + GX2InitTextureRegs(tex); +} + +#ifdef __cplusplus +} +#endif + +#endif /* COMMON_H */ + diff --git a/src/common/os_defs.h b/src/common/os_defs.h index 48a4c8f..b92c527 100644 --- a/src/common/os_defs.h +++ b/src/common/os_defs.h @@ -16,8 +16,23 @@ typedef struct _OsSpecifics unsigned int addr_KernSyscallTbl3; unsigned int addr_KernSyscallTbl4; unsigned int addr_KernSyscallTbl5; + + int (*LiWaitIopComplete)(int, int *); + int (*LiWaitIopCompleteWithInterrupts)(int, int *); + unsigned int addr_LiWaitOneChunk; + unsigned int addr_PrepareTitle_hook; + unsigned int addr_sgIsLoadingBuffer; + unsigned int addr_gDynloadInitialized; + unsigned int orig_LiWaitOneChunkInstr; } OsSpecifics; +typedef struct _s_mem_area +{ + unsigned int address; + unsigned int size; + struct _s_mem_area* next; +} s_mem_area; + #ifdef __cplusplus } #endif diff --git a/src/common/types.h b/src/common/types.h index 3435e56..c1eb26c 100644 --- a/src/common/types.h +++ b/src/common/types.h @@ -1,7 +1,7 @@ #ifndef TYPES_H #define TYPES_H -#include +#include #endif /* TYPES_H */ diff --git a/src/dynamic_libs/README.md b/src/dynamic_libs/README.md deleted file mode 100644 index be82302..0000000 --- a/src/dynamic_libs/README.md +++ /dev/null @@ -1,2 +0,0 @@ -# dynamic_libs -Dynamic libs for WiiU homebrew diff --git a/src/dynamic_libs/acp_functions.c b/src/dynamic_libs/acp_functions.c deleted file mode 100644 index eb931f8..0000000 --- a/src/dynamic_libs/acp_functions.c +++ /dev/null @@ -1,40 +0,0 @@ -/**************************************************************************** - * Copyright (C) 2015 - * by Dimok - * - * This software is provided 'as-is', without any express or implied - * warranty. In no event will the authors be held liable for any - * damages arising from the use of this software. - * - * Permission is granted to anyone to use this software for any - * purpose, including commercial applications, and to alter it and - * redistribute it freely, subject to the following restrictions: - * - * 1. The origin of this software must not be misrepresented; you - * must not claim that you wrote the original software. If you use - * this software in a product, an acknowledgment in the product - * documentation would be appreciated but is not required. - * - * 2. Altered source versions must be plainly marked as such, and - * must not be misrepresented as being the original software. - * - * 3. This notice may not be removed or altered from any source - * distribution. - ***************************************************************************/ -#include "os_functions.h" -#include "acp_functions.h" - -unsigned int acp_handle __attribute__((section(".data"))) = 0; - -EXPORT_DECL(void, GetMetaXml, void * _ACPMetaXml); - -void InitAcquireACP(void) -{ - OSDynLoad_Acquire("nn_acp.rpl", &acp_handle); -} - -void InitACPFunctionPointers(void) -{ - InitAcquireACP(); - OSDynLoad_FindExport(acp_handle,0,"GetMetaXml__Q2_2nn3acpFP11_ACPMetaXml",&GetMetaXml); -} diff --git a/src/dynamic_libs/acp_functions.h b/src/dynamic_libs/acp_functions.h deleted file mode 100644 index dc1822d..0000000 --- a/src/dynamic_libs/acp_functions.h +++ /dev/null @@ -1,42 +0,0 @@ -/**************************************************************************** - * Copyright (C) 2015 - * by Dimok - * - * This software is provided 'as-is', without any express or implied - * warranty. In no event will the authors be held liable for any - * damages arising from the use of this software. - * - * Permission is granted to anyone to use this software for any - * purpose, including commercial applications, and to alter it and - * redistribute it freely, subject to the following restrictions: - * - * 1. The origin of this software must not be misrepresented; you - * must not claim that you wrote the original software. If you use - * this software in a product, an acknowledgment in the product - * documentation would be appreciated but is not required. - * - * 2. Altered source versions must be plainly marked as such, and - * must not be misrepresented as being the original software. - * - * 3. This notice may not be removed or altered from any source - * distribution. - ***************************************************************************/ -#ifndef __ACP_FUNCTIONS_H_ -#define __ACP_FUNCTIONS_H_ - -#ifdef __cplusplus -extern "C" { -#endif - -#include - -extern unsigned int acp_handle; - -void InitACPFunctionPointers(void); -void InitAcquireACP(void); - -#ifdef __cplusplus -} -#endif - -#endif // __VPAD_FUNCTIONS_H_ diff --git a/src/dynamic_libs/aoc_functions.c b/src/dynamic_libs/aoc_functions.c deleted file mode 100644 index e74306d..0000000 --- a/src/dynamic_libs/aoc_functions.c +++ /dev/null @@ -1,58 +0,0 @@ -/**************************************************************************** - * Copyright (C) 2015 - * by Dimok - * - * This software is provided 'as-is', without any express or implied - * warranty. In no event will the authors be held liable for any - * damages arising from the use of this software. - * - * Permission is granted to anyone to use this software for any - * purpose, including commercial applications, and to alter it and - * redistribute it freely, subject to the following restrictions: - * - * 1. The origin of this software must not be misrepresented; you - * must not claim that you wrote the original software. If you use - * this software in a product, an acknowledgment in the product - * documentation would be appreciated but is not required. - * - * 2. Altered source versions must be plainly marked as such, and - * must not be misrepresented as being the original software. - * - * 3. This notice may not be removed or altered from any source - * distribution. - ***************************************************************************/ -#include "os_functions.h" -#include "aoc_functions.h" - -unsigned int aoc_handle __attribute__((section(".data"))) = 0; - -EXPORT_DECL(s32, AOC_Initialize, void); -EXPORT_DECL(s32, AOC_Finalize, void); -EXPORT_DECL(u32, AOC_CalculateWorkBufferSize, u32 num_titles); -EXPORT_DECL(s32, AOC_ListTitle, u32 * num_titles, void * titles, u32 max_titles, void * buffer, u32 buffer_size); -EXPORT_DECL(s32, AOC_OpenTitle, char* aoc_path, void * title, void * buffer, u32 buffer_size); -EXPORT_DECL(s32, AOC_CloseTitle, void * title); -EXPORT_DECL(s32, AOC_DeleteContent, u64 title_id, u16 contentIndexes[], u32 numberOfContent, void* buffer, u32 buffer_size); -EXPORT_DECL(s32, AOC_GetPurchaseInfo, u32 * bResult, u64 title_id, u16 contentIndexes[], u32 numberOfContent, void * buffer, u32 buffer_size); - -void InitAcquireAoc(void) -{ - OSDynLoad_Acquire("nn_aoc.rpl", &aoc_handle); -} - -void InitAocFunctionPointers(void) -{ - InitAcquireAoc(); - if(aoc_handle == 0) - return; - - //! assigning those is not mandatory and it does not always work to load them - OSDynLoad_FindExport(aoc_handle, 0, "AOC_Initialize", &AOC_Initialize); - OSDynLoad_FindExport(aoc_handle, 0, "AOC_Finalize", &AOC_Finalize); - OSDynLoad_FindExport(aoc_handle, 0, "AOC_CalculateWorkBufferSize", &AOC_CalculateWorkBufferSize); - OSDynLoad_FindExport(aoc_handle, 0, "AOC_ListTitle", &AOC_ListTitle); - OSDynLoad_FindExport(aoc_handle, 0, "AOC_OpenTitle", &AOC_OpenTitle); - OSDynLoad_FindExport(aoc_handle, 0, "AOC_CloseTitle", &AOC_CloseTitle); - OSDynLoad_FindExport(aoc_handle, 0, "AOC_DeleteContent", &AOC_DeleteContent); - OSDynLoad_FindExport(aoc_handle, 0, "AOC_GetPurchaseInfo", &AOC_GetPurchaseInfo); -} diff --git a/src/dynamic_libs/aoc_functions.h b/src/dynamic_libs/aoc_functions.h deleted file mode 100644 index efca771..0000000 --- a/src/dynamic_libs/aoc_functions.h +++ /dev/null @@ -1,58 +0,0 @@ -/**************************************************************************** - * Copyright (C) 2015 - * by Dimok - * - * This software is provided 'as-is', without any express or implied - * warranty. In no event will the authors be held liable for any - * damages arising from the use of this software. - * - * Permission is granted to anyone to use this software for any - * purpose, including commercial applications, and to alter it and - * redistribute it freely, subject to the following restrictions: - * - * 1. The origin of this software must not be misrepresented; you - * must not claim that you wrote the original software. If you use - * this software in a product, an acknowledgment in the product - * documentation would be appreciated but is not required. - * - * 2. Altered source versions must be plainly marked as such, and - * must not be misrepresented as being the original software. - * - * 3. This notice may not be removed or altered from any source - * distribution. - ***************************************************************************/ -#ifndef __AOC_FUNCTIONS_H_ -#define __AOC_FUNCTIONS_H_ - -#ifdef __cplusplus -extern "C" { -#endif - -extern unsigned int aoc_handle; - -#define AOC_TITLE_SIZE 104 - -typedef struct { - u64 title_ID; - u32 group_ID; - u16 version; - char path[88]; -} AOC_TitleListType; - - -void InitAocFunctionPointers(void); -void InitAcquireAoc(void); - -extern s32 (* AOC_Initialize)(void); -extern s32 (* AOC_Finalize)(void); -extern u32 (* AOC_CalculateWorkBufferSize)(u32 num_titles); -extern s32 (* AOC_ListTitle)(u32 * num_titles, void * titles, u32 max_titles, void * buffer, u32 buffer_size); -extern s32 (* AOC_OpenTitle)(char* aoc_path, void * title, void * buffer, u32 buffer_size); -extern s32 (* AOC_CloseTitle)(void * title); -extern s32 (* AOC_DeleteContent)(u64 title_id, u16 contentIndexes[], u32 numberOfContent, void * buffer, u32 buffer_size); -extern s32 (* AOC_GetPurchaseInfo)(u32 * bResult, u64 title_id, u16 contentIndexes[], u32 numberOfContent, void * buffer, u32 buffer_size); -#ifdef __cplusplus -} -#endif - -#endif // __AOC_FUNCTIONS_H_ diff --git a/src/dynamic_libs/ax_functions.c b/src/dynamic_libs/ax_functions.c deleted file mode 100644 index e517f6d..0000000 --- a/src/dynamic_libs/ax_functions.c +++ /dev/null @@ -1,118 +0,0 @@ -/**************************************************************************** - * Copyright (C) 2015 - * by Dimok - * - * This software is provided 'as-is', without any express or implied - * warranty. In no event will the authors be held liable for any - * damages arising from the use of this software. - * - * Permission is granted to anyone to use this software for any - * purpose, including commercial applications, and to alter it and - * redistribute it freely, subject to the following restrictions: - * - * 1. The origin of this software must not be misrepresented; you - * must not claim that you wrote the original software. If you use - * this software in a product, an acknowledgment in the product - * documentation would be appreciated but is not required. - * - * 2. Altered source versions must be plainly marked as such, and - * must not be misrepresented as being the original software. - * - * 3. This notice may not be removed or altered from any source - * distribution. - ***************************************************************************/ -#include "common/common.h" -#include "os_functions.h" -#include "ax_functions.h" - -unsigned int sound_handle __attribute__((section(".data"))) = 0; - -EXPORT_DECL(void, AXInitWithParams, u32 * params); -EXPORT_DECL(void, AXInit, void); -EXPORT_DECL(void, AXQuit, void); -EXPORT_DECL(u32, AXGetInputSamplesPerSec, void); -EXPORT_DECL(u32, AXGetInputSamplesPerFrame, void); -EXPORT_DECL(s32, AXVoiceBegin, void *v); -EXPORT_DECL(s32, AXVoiceEnd, void *v); -EXPORT_DECL(void, AXSetVoiceType, void *v, u16 type); -EXPORT_DECL(void, AXSetVoiceOffsets, void *v, const void *buf); -EXPORT_DECL(void, AXSetVoiceSrcType, void *v, u32 type); -EXPORT_DECL(void, AXSetVoiceVe, void *v, const void *vol); -EXPORT_DECL(s32, AXSetVoiceDeviceMix, void *v, s32 device, u32 id, void *mix); -EXPORT_DECL(void, AXSetVoiceState, void *v, u16 state); -EXPORT_DECL(void, AXSetVoiceSrc, void *v, const void *src); -EXPORT_DECL(s32, AXSetVoiceSrcRatio, void *v,f32 ratio) -EXPORT_DECL(void *, AXAcquireVoice, u32 prio, void * callback, u32 arg); -EXPORT_DECL(void, AXFreeVoice, void *v); -EXPORT_DECL(void, AXRegisterFrameCallback, void * callback); -EXPORT_DECL(u32, AXGetVoiceLoopCount, void *v); -EXPORT_DECL(void, AXSetVoiceEndOffset, void *v, u32 offset); -EXPORT_DECL(void, AXSetVoiceLoopOffset, void *v, u32 offset); - -void InitAcquireAX(void) -{ - unsigned int *funcPointer = 0; - - if(OS_FIRMWARE >= 400) - { - AXInit = 0; - - OSDynLoad_Acquire("sndcore2.rpl", &sound_handle); - OS_FIND_EXPORT(sound_handle, AXInitWithParams); - OS_FIND_EXPORT(sound_handle, AXGetInputSamplesPerSec); - } - else - { - AXInitWithParams = 0; - AXGetInputSamplesPerSec = 0; - - OSDynLoad_Acquire("snd_core.rpl", &sound_handle); - OS_FIND_EXPORT(sound_handle, AXInit); - } -} - -void InitAXFunctionPointers(void) -{ - unsigned int *funcPointer = 0; - - InitAcquireAX(); - - OS_FIND_EXPORT(sound_handle, AXQuit); - OS_FIND_EXPORT(sound_handle, AXVoiceBegin); - OS_FIND_EXPORT(sound_handle, AXVoiceEnd); - OS_FIND_EXPORT(sound_handle, AXSetVoiceType); - OS_FIND_EXPORT(sound_handle, AXSetVoiceOffsets); - OS_FIND_EXPORT(sound_handle, AXSetVoiceSrcType); - OS_FIND_EXPORT(sound_handle, AXSetVoiceVe); - OS_FIND_EXPORT(sound_handle, AXSetVoiceDeviceMix); - OS_FIND_EXPORT(sound_handle, AXSetVoiceState); - OS_FIND_EXPORT(sound_handle, AXSetVoiceSrc); - OS_FIND_EXPORT(sound_handle, AXSetVoiceSrcRatio); - OS_FIND_EXPORT(sound_handle, AXAcquireVoice); - OS_FIND_EXPORT(sound_handle, AXFreeVoice); - OS_FIND_EXPORT(sound_handle, AXRegisterFrameCallback); - OS_FIND_EXPORT(sound_handle, AXGetVoiceLoopCount); - OS_FIND_EXPORT(sound_handle, AXSetVoiceEndOffset); - OS_FIND_EXPORT(sound_handle, AXSetVoiceLoopOffset); -} - -void ProperlyEndTransitionAudio(void) -{ - bool (* check_os_audio_transition_flag_old)(void); - void (* AXInit_old)(void); - void (* AXQuit_old)(void); - - unsigned int *funcPointer = 0; - unsigned int sound_handle; - OSDynLoad_Acquire("snd_core.rpl", &sound_handle); - - OS_FIND_EXPORT_EX(sound_handle, check_os_audio_transition_flag, check_os_audio_transition_flag_old); - OS_FIND_EXPORT_EX(sound_handle, AXInit, AXInit_old); - OS_FIND_EXPORT_EX(sound_handle, AXQuit, AXQuit_old); - - if (check_os_audio_transition_flag_old()) - { - AXInit_old(); - AXQuit_old(); - } -} diff --git a/src/dynamic_libs/ax_functions.h b/src/dynamic_libs/ax_functions.h deleted file mode 100644 index 086346f..0000000 --- a/src/dynamic_libs/ax_functions.h +++ /dev/null @@ -1,64 +0,0 @@ -/**************************************************************************** - * Copyright (C) 2015 - * by Dimok - * - * This software is provided 'as-is', without any express or implied - * warranty. In no event will the authors be held liable for any - * damages arising from the use of this software. - * - * Permission is granted to anyone to use this software for any - * purpose, including commercial applications, and to alter it and - * redistribute it freely, subject to the following restrictions: - * - * 1. The origin of this software must not be misrepresented; you - * must not claim that you wrote the original software. If you use - * this software in a product, an acknowledgment in the product - * documentation would be appreciated but is not required. - * - * 2. Altered source versions must be plainly marked as such, and - * must not be misrepresented as being the original software. - * - * 3. This notice may not be removed or altered from any source - * distribution. - ***************************************************************************/ -#ifndef __AX_FUNCTIONS_H_ -#define __AX_FUNCTIONS_H_ - -#ifdef __cplusplus -extern "C" { -#endif - -#include - -extern unsigned int sound_handle; - -void InitAXFunctionPointers(void); -void InitAcquireAX(void); -void ProperlyEndTransitionAudio(void); - -extern void (* AXInitWithParams)(u32 * params); -extern void (* AXInit)(void); -extern void (* AXQuit)(void); -extern u32 (* AXGetInputSamplesPerSec)(void); -extern s32 (* AXVoiceBegin)(void *v); -extern s32 (* AXVoiceEnd)(void *v); -extern void (* AXSetVoiceType)(void *v, u16 type); -extern void (* AXSetVoiceOffsets)(void *v, const void *buf); -extern void (* AXSetVoiceSrcType)(void *v, u32 type); -extern void (* AXSetVoiceVe)(void *v, const void *vol); -extern s32 (* AXSetVoiceDeviceMix)(void *v, s32 device, u32 id, void *mix); -extern void (* AXSetVoiceState)(void *v, u16 state); -extern void (* AXSetVoiceSrc)(void *v, const void *src); -extern s32 (* AXSetVoiceSrcRatio)(void *v, f32 ratio); -extern void * (* AXAcquireVoice)(u32 prio, void * callback, u32 arg); -extern void (* AXFreeVoice)(void *v); -extern void (* AXRegisterFrameCallback)(void * callback); -extern u32 (* AXGetVoiceLoopCount)(void * v); -extern void (* AXSetVoiceEndOffset)(void * v, u32 offset); -extern void (* AXSetVoiceLoopOffset)(void * v, u32 offset); - -#ifdef __cplusplus -} -#endif - -#endif // __VPAD_FUNCTIONS_H_ diff --git a/src/dynamic_libs/curl_functions.c b/src/dynamic_libs/curl_functions.c deleted file mode 100644 index d828cdb..0000000 --- a/src/dynamic_libs/curl_functions.c +++ /dev/null @@ -1,54 +0,0 @@ -/**************************************************************************** - * Copyright (C) 2015 - * by Dimok - * - * This software is provided 'as-is', without any express or implied - * warranty. In no event will the authors be held liable for any - * damages arising from the use of this software. - * - * Permission is granted to anyone to use this software for any - * purpose, including commercial applications, and to alter it and - * redistribute it freely, subject to the following restrictions: - * - * 1. The origin of this software must not be misrepresented; you - * must not claim that you wrote the original software. If you use - * this software in a product, an acknowledgment in the product - * documentation would be appreciated but is not required. - * - * 2. Altered source versions must be plainly marked as such, and - * must not be misrepresented as being the original software. - * - * 3. This notice may not be removed or altered from any source - * distribution. - ***************************************************************************/ -#include "os_functions.h" -#include "curl_functions.h" - -unsigned int libcurl_handle __attribute__((section(".data"))) = 0; - -EXPORT_DECL(CURLcode, n_curl_global_init, long flags); -EXPORT_DECL(CURL *, n_curl_easy_init, void); -EXPORT_DECL(CURLcode, n_curl_easy_setopt, CURL *curl, CURLoption option, ...); -EXPORT_DECL(CURLcode, n_curl_easy_perform, CURL *curl); -EXPORT_DECL(void, n_curl_easy_cleanup, CURL *curl); -EXPORT_DECL(CURLcode, n_curl_easy_getinfo, CURL *curl, CURLINFO info, ...); - -void InitAcquireCurl(void) -{ - OSDynLoad_Acquire("nlibcurl", &libcurl_handle); -} - -void InitCurlFunctionPointers(void) -{ - InitAcquireCurl(); - unsigned int *funcPointer = 0; - - OS_FIND_EXPORT_EX(libcurl_handle, curl_global_init, n_curl_global_init); - OS_FIND_EXPORT_EX(libcurl_handle, curl_easy_init, n_curl_easy_init); - OS_FIND_EXPORT_EX(libcurl_handle, curl_easy_setopt, n_curl_easy_setopt); - OS_FIND_EXPORT_EX(libcurl_handle, curl_easy_perform, n_curl_easy_perform); - OS_FIND_EXPORT_EX(libcurl_handle, curl_easy_cleanup, n_curl_easy_cleanup); - OS_FIND_EXPORT_EX(libcurl_handle, curl_easy_getinfo, n_curl_easy_getinfo); - - n_curl_global_init(CURL_GLOBAL_ALL); -} diff --git a/src/dynamic_libs/curl_functions.h b/src/dynamic_libs/curl_functions.h deleted file mode 100644 index e40740b..0000000 --- a/src/dynamic_libs/curl_functions.h +++ /dev/null @@ -1,51 +0,0 @@ -/**************************************************************************** - * Copyright (C) 2015 - * by Dimok - * - * This software is provided 'as-is', without any express or implied - * warranty. In no event will the authors be held liable for any - * damages arising from the use of this software. - * - * Permission is granted to anyone to use this software for any - * purpose, including commercial applications, and to alter it and - * redistribute it freely, subject to the following restrictions: - * - * 1. The origin of this software must not be misrepresented; you - * must not claim that you wrote the original software. If you use - * this software in a product, an acknowledgment in the product - * documentation would be appreciated but is not required. - * - * 2. Altered source versions must be plainly marked as such, and - * must not be misrepresented as being the original software. - * - * 3. This notice may not be removed or altered from any source - * distribution. - ***************************************************************************/ -#ifndef __CURL_FUNCTIONS_H_ -#define __CURL_FUNCTIONS_H_ - -#ifdef __cplusplus -extern "C" { -#endif - -#include -#include "socket_functions.h" -typedef int socklen_t; -#include -#include - -void InitCurlFunctionPointers(void); -void InitAcquireCurl(void); - -extern CURLcode (* n_curl_global_init)(long flags); -extern CURL * (* n_curl_easy_init)(void); -extern CURLcode (* n_curl_easy_setopt)(CURL *curl, CURLoption option, ...); -extern CURLcode (* n_curl_easy_perform)(CURL *curl); -extern void (* n_curl_easy_cleanup)(CURL *curl); -extern CURLcode (* n_curl_easy_getinfo)(CURL *curl, CURLINFO info, ...); - -#ifdef __cplusplus -} -#endif - -#endif // __CURL_FUNCTIONS_H_ diff --git a/src/dynamic_libs/exports.h b/src/dynamic_libs/exports.h new file mode 100644 index 0000000..53ba488 --- /dev/null +++ b/src/dynamic_libs/exports.h @@ -0,0 +1,26 @@ +#ifndef __EXPORTS_H_ +#define __EXPORTS_H_ + +#include +#include + +#define EXPORT_DECL(res, func, ...) res (* func)(__VA_ARGS__) __attribute__((section(".data"))) = 0; +#define EXPORT_VAR(type, var) type var __attribute__((section(".data"))); + + +#define EXPORT_FUNC_WRITE(func, val) *(u32*)(((u32)&func) + 0) = (u32)val + +#define OS_FIND_EXPORT(handle, func) funcPointer = 0; \ + OSDynLoad_FindExport(handle, 0, # func, (void**) &funcPointer); \ + if(!funcPointer) \ + OSFatal("Function " # func " is NULL"); \ + EXPORT_FUNC_WRITE(func, funcPointer); + +#define OS_FIND_EXPORT_EX(handle, func, func_p) \ + funcPointer = 0; \ + OSDynLoad_FindExport(handle, 0, # func, (void**) &funcPointer); \ + if(!funcPointer) \ + OSFatal("Function " # func " is NULL"); \ + EXPORT_FUNC_WRITE(func_p, funcPointer); + +#endif diff --git a/src/dynamic_libs/fs_defs.h b/src/dynamic_libs/fs_defs.h deleted file mode 100644 index 1b1bc41..0000000 --- a/src/dynamic_libs/fs_defs.h +++ /dev/null @@ -1,61 +0,0 @@ -#ifndef FS_DEFS_H -#define FS_DEFS_H - -#include - -#ifdef __cplusplus -extern "C" { -#endif - - -/* FS defines and types */ -#define FS_MAX_LOCALPATH_SIZE 511 -#define FS_MAX_MOUNTPATH_SIZE 128 -#define FS_MAX_FULLPATH_SIZE (FS_MAX_LOCALPATH_SIZE + FS_MAX_MOUNTPATH_SIZE) -#define FS_MAX_ARGPATH_SIZE FS_MAX_FULLPATH_SIZE - -#define FS_STATUS_OK 0 -#define FS_RET_UNSUPPORTED_CMD 0x0400 -#define FS_RET_NO_ERROR 0x0000 -#define FS_RET_ALL_ERROR (unsigned int)(-1) - -#define FS_STAT_FLAG_IS_DIRECTORY 0x80000000 - -/* max length of file/dir name */ -#define FS_MAX_ENTNAME_SIZE 256 - -#define FS_SOURCETYPE_EXTERNAL 0 -#define FS_SOURCETYPE_HFIO 1 - -#define FS_MOUNT_SOURCE_SIZE 0x300 -#define FS_CLIENT_SIZE 0x1700 -#define FS_CMD_BLOCK_SIZE 0xA80 - -typedef struct -{ - uint32_t flag; - uint32_t permission; - uint32_t owner_id; - uint32_t group_id; - uint32_t size; - uint32_t alloc_size; - uint64_t quota_size; - uint32_t ent_id; - uint64_t ctime; - uint64_t mtime; - uint8_t attributes[48]; -} __attribute__((packed)) FSStat; - -typedef struct -{ - FSStat stat; - char name[FS_MAX_ENTNAME_SIZE]; -} FSDirEntry; - - -#ifdef __cplusplus -} -#endif - -#endif /* FS_DEFS_H */ - diff --git a/src/dynamic_libs/fs_functions.c b/src/dynamic_libs/fs_functions.c deleted file mode 100644 index 08a4fb6..0000000 --- a/src/dynamic_libs/fs_functions.c +++ /dev/null @@ -1,131 +0,0 @@ -/**************************************************************************** - * Copyright (C) 2015 - * by Dimok - * - * This software is provided 'as-is', without any express or implied - * warranty. In no event will the authors be held liable for any - * damages arising from the use of this software. - * - * Permission is granted to anyone to use this software for any - * purpose, including commercial applications, and to alter it and - * redistribute it freely, subject to the following restrictions: - * - * 1. The origin of this software must not be misrepresented; you - * must not claim that you wrote the original software. If you use - * this software in a product, an acknowledgment in the product - * documentation would be appreciated but is not required. - * - * 2. Altered source versions must be plainly marked as such, and - * must not be misrepresented as being the original software. - * - * 3. This notice may not be removed or altered from any source - * distribution. - ***************************************************************************/ -#include "fs_functions.h" -#include "os_functions.h" - -EXPORT_DECL(int, FSInit, void); -EXPORT_DECL(int, FSShutdown, void); -EXPORT_DECL(int, FSAddClientEx, void *pClient, int unk_zero_param, int errHandling); -EXPORT_DECL(int, FSDelClient, void *pClient); -EXPORT_DECL(void, FSInitCmdBlock, void *pCmd); -EXPORT_DECL(int, FSGetMountSource, void *pClient, void *pCmd, int type, void *source, int errHandling); - -EXPORT_DECL(int, FSMount, void *pClient, void *pCmd, void *source, char *target, uint32_t bytes, int errHandling); -EXPORT_DECL(int, FSUnmount, void *pClient, void *pCmd, const char *target, int errHandling); - -EXPORT_DECL(int, FSGetStat, void *pClient, void *pCmd, const char *path, FSStat *stats, int errHandling); -EXPORT_DECL(int, FSGetStatAsync, void *pClient, void *pCmd, const char *path, void *stats, int error, void *asyncParams); -EXPORT_DECL(int, FSRename, void *pClient, void *pCmd, const char *oldPath, const char *newPath, int error); -EXPORT_DECL(int, FSRenameAsync, void *pClient, void *pCmd, const char *oldPath, const char *newPath, int error, void *asyncParams); -EXPORT_DECL(int, FSRemove, void *pClient, void *pCmd, const char *path, int error); -EXPORT_DECL(int, FSRemoveAsync, void *pClient, void *pCmd, const char *path, int error, void *asyncParams); -EXPORT_DECL(int, FSFlushQuota, void *pClient, void *pCmd, const char* path, int error); -EXPORT_DECL(int, FSFlushQuotaAsync, void *pClient, void *pCmd, const char *path, int error, void *asyncParams); -EXPORT_DECL(int, FSGetFreeSpaceSize, void *pClient, void *pCmd, const char *path, uint64_t *returnedFreeSize, int error); -EXPORT_DECL(int, FSGetFreeSpaceSizeAsync, void *pClient, void *pCmd, const char *path, uint64_t *returnedFreeSize, int error, void *asyncParams); -EXPORT_DECL(int, FSRollbackQuota, void *pClient, void *pCmd, const char *path, int error); -EXPORT_DECL(int, FSRollbackQuotaAsync, void *pClient, void *pCmd, const char *path, int error, void *asyncParams); - -EXPORT_DECL(int, FSOpenDir, void *pClient, void *pCmd, const char *path, int *dh, int errHandling); -EXPORT_DECL(int, FSOpenDirAsync, void *pClient, void* pCmd, const char *path, int *handle, int error, void *asyncParams); -EXPORT_DECL(int, FSReadDir, void *pClient, void *pCmd, int dh, FSDirEntry *dir_entry, int errHandling); -EXPORT_DECL(int, FSRewindDir, void *pClient, void *pCmd, int dh, int errHandling); -EXPORT_DECL(int, FSCloseDir, void *pClient, void *pCmd, int dh, int errHandling); -EXPORT_DECL(int, FSChangeDir, void *pClient, void *pCmd, const char *path, int errHandling); -EXPORT_DECL(int, FSChangeDirAsync, void *pClient, void *pCmd, const char *path, int error, void *asyncParams); -EXPORT_DECL(int, FSMakeDir, void *pClient, void *pCmd, const char *path, int errHandling); -EXPORT_DECL(int, FSMakeDirAsync, void *pClient, void *pCmd, const char *path, int error, void *asyncParams); - -EXPORT_DECL(int, FSOpenFile, void *pClient, void *pCmd, const char *path, const char *mode, int *fd, int errHandling); -EXPORT_DECL(int, FSOpenFileAsync, void *pClient, void *pCmd, const char *path, const char *mode, int *handle, int error, const void *asyncParams); -EXPORT_DECL(int, FSReadFile, void *pClient, void *pCmd, void *buffer, int size, int count, int fd, int flag, int errHandling); -EXPORT_DECL(int, FSCloseFile, void *pClient, void *pCmd, int fd, int errHandling); - -EXPORT_DECL(int, FSFlushFile, void *pClient, void *pCmd, int fd, int error); -EXPORT_DECL(int, FSTruncateFile, void *pClient, void *pCmd, int fd, int error); -EXPORT_DECL(int, FSGetStatFile, void *pClient, void *pCmd, int fd, void *buffer, int error); -EXPORT_DECL(int, FSSetPosFile, void *pClient, void *pCmd, int fd, int pos, int error); -EXPORT_DECL(int, FSWriteFile, void *pClient, void *pCmd, const void *source, int block_size, int block_count, int fd, int flag, int error); - -EXPORT_DECL(int, FSBindMount, void *pClient, void *pCmd, char *source, char *target, int error); -EXPORT_DECL(int, FSBindUnmount, void *pClient, void *pCmd, char *target, int error); - -EXPORT_DECL(int, FSMakeQuota, void *pClient, void *pCmd, const char *path,u32 mode, u64 size, int errHandling); -EXPORT_DECL(int, FSMakeQuotaAsync ,void *pClient, void *pCmd, const char *path,u32 mode, u64 size, int errHandling,const void *asyncParams); - -void InitFSFunctionPointers(void) -{ - unsigned int *funcPointer = 0; - - OS_FIND_EXPORT(coreinit_handle, FSInit); - OS_FIND_EXPORT(coreinit_handle, FSShutdown); - OS_FIND_EXPORT(coreinit_handle, FSAddClientEx); - OS_FIND_EXPORT(coreinit_handle, FSDelClient); - OS_FIND_EXPORT(coreinit_handle, FSInitCmdBlock); - OS_FIND_EXPORT(coreinit_handle, FSGetMountSource); - - OS_FIND_EXPORT(coreinit_handle, FSMount); - OS_FIND_EXPORT(coreinit_handle, FSUnmount); - - OS_FIND_EXPORT(coreinit_handle, FSGetStat); - OS_FIND_EXPORT(coreinit_handle, FSGetStatAsync); - OS_FIND_EXPORT(coreinit_handle, FSRename); - OS_FIND_EXPORT(coreinit_handle, FSRenameAsync); - OS_FIND_EXPORT(coreinit_handle, FSRemove); - OS_FIND_EXPORT(coreinit_handle, FSRemoveAsync); - OS_FIND_EXPORT(coreinit_handle, FSFlushQuota); - OS_FIND_EXPORT(coreinit_handle, FSFlushQuotaAsync); - OS_FIND_EXPORT(coreinit_handle, FSGetFreeSpaceSize); - OS_FIND_EXPORT(coreinit_handle, FSGetFreeSpaceSizeAsync); - OS_FIND_EXPORT(coreinit_handle, FSRollbackQuota); - OS_FIND_EXPORT(coreinit_handle, FSRollbackQuotaAsync); - - OS_FIND_EXPORT(coreinit_handle, FSOpenDir); - OS_FIND_EXPORT(coreinit_handle, FSOpenDirAsync); - OS_FIND_EXPORT(coreinit_handle, FSReadDir); - OS_FIND_EXPORT(coreinit_handle, FSRewindDir); - OS_FIND_EXPORT(coreinit_handle, FSCloseDir); - OS_FIND_EXPORT(coreinit_handle, FSChangeDir); - OS_FIND_EXPORT(coreinit_handle, FSChangeDirAsync); - OS_FIND_EXPORT(coreinit_handle, FSMakeDir); - OS_FIND_EXPORT(coreinit_handle, FSMakeDirAsync); - - - OS_FIND_EXPORT(coreinit_handle, FSOpenFile); - OS_FIND_EXPORT(coreinit_handle, FSOpenFileAsync); - OS_FIND_EXPORT(coreinit_handle, FSReadFile); - OS_FIND_EXPORT(coreinit_handle, FSCloseFile); - - OS_FIND_EXPORT(coreinit_handle, FSFlushFile); - OS_FIND_EXPORT(coreinit_handle, FSTruncateFile); - OS_FIND_EXPORT(coreinit_handle, FSGetStatFile); - OS_FIND_EXPORT(coreinit_handle, FSSetPosFile); - OS_FIND_EXPORT(coreinit_handle, FSWriteFile); - - OS_FIND_EXPORT(coreinit_handle, FSBindMount); - OS_FIND_EXPORT(coreinit_handle, FSBindUnmount); - - OS_FIND_EXPORT(coreinit_handle, FSMakeQuota); - OS_FIND_EXPORT(coreinit_handle, FSMakeQuotaAsync); -} diff --git a/src/dynamic_libs/fs_functions.h b/src/dynamic_libs/fs_functions.h deleted file mode 100644 index d024655..0000000 --- a/src/dynamic_libs/fs_functions.h +++ /dev/null @@ -1,95 +0,0 @@ -/**************************************************************************** - * Copyright (C) 2015 - * by Dimok - * - * This software is provided 'as-is', without any express or implied - * warranty. In no event will the authors be held liable for any - * damages arising from the use of this software. - * - * Permission is granted to anyone to use this software for any - * purpose, including commercial applications, and to alter it and - * redistribute it freely, subject to the following restrictions: - * - * 1. The origin of this software must not be misrepresented; you - * must not claim that you wrote the original software. If you use - * this software in a product, an acknowledgment in the product - * documentation would be appreciated but is not required. - * - * 2. Altered source versions must be plainly marked as such, and - * must not be misrepresented as being the original software. - * - * 3. This notice may not be removed or altered from any source - * distribution. - ***************************************************************************/ -#ifndef __FS_FUNCTIONS_H_ -#define __FS_FUNCTIONS_H_ - -#ifdef __cplusplus -extern "C" { -#endif - -#include -#include "fs_defs.h" - -void InitFSFunctionPointers(void); - -extern int (* FSInit)(void); -extern int (* FSShutdown)(void); -extern int (* FSAddClientEx)(void *pClient, int unk_zero_param, int errHandling); -extern int (* FSDelClient)(void *pClient); -extern void (* FSInitCmdBlock)(void *pCmd); -extern int (* FSGetMountSource)(void *pClient, void *pCmd, int type, void *source, int errHandling); - -extern int (* FSMount)(void *pClient, void *pCmd, void *source, char *target, uint32_t bytes, int errHandling); -extern int (* FSUnmount)(void *pClient, void *pCmd, const char *target, int errHandling); -extern int (* FSRename)(void *pClient, void *pCmd, const char *oldPath, const char *newPath, int error); -extern int (* FSRenameAsync)(void *pClient, void *pCmd, const char *oldPath, const char *newPath, int error, void *asyncParams); -extern int (* FSRemove)(void *pClient, void *pCmd, const char *path, int error); -extern int (* FSRemoveAsync)(void *pClient, void *pCmd, const char *path, int error, void *asyncParams); - -extern int (* FSGetStat)(void *pClient, void *pCmd, const char *path, FSStat *stats, int errHandling); -extern int (* FSGetStatAsync)(void *pClient, void *pCmd, const char *path, void *stats, int error, void *asyncParams); -extern int (* FSRename)(void *pClient, void *pCmd, const char *oldPath, const char *newPath, int error); -extern int (* FSRenameAsync)(void *pClient, void *pCmd, const char *oldPath, const char *newPath, int error, void *asyncParams); -extern int (* FSRemove)(void *pClient, void *pCmd, const char *path, int error); -extern int (* FSRemoveAsync)(void *pClient, void *pCmd, const char *path, int error, void *asyncParams); -extern int (* FSFlushQuota)(void *pClient, void *pCmd, const char* path, int error); -extern int (* FSFlushQuotaAsync)(void *pClient, void *pCmd, const char *path, int error, void *asyncParams); -extern int (* FSGetFreeSpaceSize)(void *pClient, void *pCmd, const char *path, uint64_t *returnedFreeSize, int error); -extern int (* FSGetFreeSpaceSizeAsync)(void *pClient, void *pCmd, const char *path, uint64_t *returnedFreeSize, int error, void *asyncParams); -extern int (* FSRollbackQuota)(void *pClient, void *pCmd, const char *path, int error); -extern int (* FSRollbackQuotaAsync)(void *pClient, void *pCmd, const char *path, int error, void *asyncParams); - -extern int (* FSOpenDir)(void *pClient, void *pCmd, const char *path, int *dh, int errHandling); -extern int (* FSOpenDirAsync)(void *pClient, void* pCmd, const char *path, int *handle, int error, void *asyncParams); -extern int (* FSReadDir)(void *pClient, void *pCmd, int dh, FSDirEntry *dir_entry, int errHandling); -extern int (* FSRewindDir)(void *pClient, void *pCmd, int dh, int errHandling); -extern int (* FSCloseDir)(void *pClient, void *pCmd, int dh, int errHandling); -extern int (* FSChangeDir)(void *pClient, void *pCmd, const char *path, int errHandling); -extern int (* FSChangeDirAsync)(void *pClient, void *pCmd, const char *path, int error, void *asyncParams); -extern int (* FSMakeDir)(void *pClient, void *pCmd, const char *path, int errHandling); -extern int (* FSMakeDirAsync)(void *pClient, void *pCmd, const char *path, int error, void *asyncParams); - -extern int (* FSOpenFile)(void *pClient, void *pCmd, const char *path, const char *mode, int *fd, int errHandling); -extern int (* FSOpenFileAsync)(void *pClient, void *pCmd, const char *path, const char *mode, int *handle, int error, const void *asyncParams); -extern int (* FSReadFile)(void *pClient, void *pCmd, void *buffer, int size, int count, int fd, int flag, int errHandling); -extern int (* FSCloseFile)(void *pClient, void *pCmd, int fd, int errHandling); - -extern int (* FSFlushFile)(void *pClient, void *pCmd, int fd, int error); -extern int (* FSTruncateFile)(void *pClient, void *pCmd, int fd, int error); -extern int (* FSGetStatFile)(void *pClient, void *pCmd, int fd, void *buffer, int error); -extern int (* FSSetPosFile)(void *pClient, void *pCmd, int fd, int pos, int error); -extern int (* FSWriteFile)(void *pClient, void *pCmd, const void *source, int block_size, int block_count, int fd, int flag, int error); - -extern int (* FSBindMount)(void *pClient, void *pCmd, char *source, char *target, int error); -extern int (* FSBindUnmount)(void *pClient, void *pCmd, char *target, int error); - -extern int (* FSMakeQuota)( void *pClient, void *pCmd, const char *path,u32 mode, u64 size, int errHandling); -extern int (* FSMakeQuotaAsync)(void *pClient, void *pCmd, const char *path,u32 mode, u64 size, int errHandling,const void *asyncParams); - - -#ifdef __cplusplus -} -#endif - -#endif // __FS_FUNCTIONS_H_ diff --git a/src/dynamic_libs/gx2_functions.c b/src/dynamic_libs/gx2_functions.c deleted file mode 100644 index a34807e..0000000 --- a/src/dynamic_libs/gx2_functions.c +++ /dev/null @@ -1,173 +0,0 @@ -/**************************************************************************** - * Copyright (C) 2015 - * by Dimok - * - * This software is provided 'as-is', without any express or implied - * warranty. In no event will the authors be held liable for any - * damages arising from the use of this software. - * - * Permission is granted to anyone to use this software for any - * purpose, including commercial applications, and to alter it and - * redistribute it freely, subject to the following restrictions: - * - * 1. The origin of this software must not be misrepresented; you - * must not claim that you wrote the original software. If you use - * this software in a product, an acknowledgment in the product - * documentation would be appreciated but is not required. - * - * 2. Altered source versions must be plainly marked as such, and - * must not be misrepresented as being the original software. - * - * 3. This notice may not be removed or altered from any source - * distribution. - ***************************************************************************/ -#include "os_functions.h" -#include "gx2_types.h" - -unsigned int gx2_handle __attribute__((section(".data"))) = 0; - -EXPORT_DECL(void, GX2Init, u32 * init_attribs); -EXPORT_DECL(void, GX2Shutdown, void); -EXPORT_DECL(void, GX2Flush, void); -EXPORT_DECL(s32, GX2GetMainCoreId, void) ; -EXPORT_DECL(s32, GX2DrawDone, void); -EXPORT_DECL(void, GX2ClearColor, GX2ColorBuffer *colorBuffer, f32 r, f32 g, f32 b, f32 a); -EXPORT_DECL(void, GX2SetViewport, f32 x, f32 y, f32 w, f32 h, f32 nearZ, f32 farZ); -EXPORT_DECL(void, GX2SetScissor, u32 x_orig, u32 y_orig, u32 wd, u32 ht); -EXPORT_DECL(void, GX2SetContextState, const GX2ContextState* state); -EXPORT_DECL(void, GX2DrawEx, s32 primitive_type, u32 count, u32 first_vertex, u32 instances_count); -EXPORT_DECL(void, GX2DrawIndexedEx, s32 primitive_type, u32 count, s32 index_format, const void* idx, u32 first_vertex, u32 instances_count); -EXPORT_DECL(void, GX2ClearDepthStencilEx, GX2DepthBuffer *depthBuffer, f32 depth_value, u8 stencil_value, s32 clear_mode); -EXPORT_DECL(void, GX2SetClearDepthStencil, GX2DepthBuffer *depthBuffer, f32 depth_value, u8 stencil_value); -EXPORT_DECL(void, GX2CopyColorBufferToScanBuffer, const GX2ColorBuffer *colorBuffer, s32 scan_target); -EXPORT_DECL(void, GX2SwapScanBuffers, void); -EXPORT_DECL(void, GX2SetTVEnable, s32 enable); -EXPORT_DECL(void, GX2SetSwapInterval, u32 swap_interval); -EXPORT_DECL(u32, GX2GetSwapInterval, void); -EXPORT_DECL(void, GX2WaitForVsync, void); -EXPORT_DECL(void, GX2CalcTVSize, s32 tv_render_mode, s32 format, s32 buffering_mode, u32 * size, s32 * scale_needed); -EXPORT_DECL(void, GX2Invalidate, s32 invalidate_type, void * ptr, u32 buffer_size); -EXPORT_DECL(void, GX2SetTVBuffer, void *buffer, u32 buffer_size, s32 tv_render_mode, s32 format, s32 buffering_mode); -EXPORT_DECL(void, GX2CalcSurfaceSizeAndAlignment, GX2Surface *surface); -EXPORT_DECL(void, GX2InitDepthBufferRegs, GX2DepthBuffer *depthBuffer); -EXPORT_DECL(void, GX2InitColorBufferRegs, GX2ColorBuffer *colorBuffer); -EXPORT_DECL(void, GX2CalcColorBufferAuxInfo, GX2ColorBuffer *colorBuffer, u32 *size, u32 *align); -EXPORT_DECL(void, GX2CalcDepthBufferHiZInfo, GX2DepthBuffer *depthBuffer, u32 *size, u32 *align); -EXPORT_DECL(void, GX2InitDepthBufferHiZEnable, GX2DepthBuffer *depthBuffer, s32 hiZ_enable); -EXPORT_DECL(void, GX2SetupContextStateEx, GX2ContextState* state, s32 enable_profiling); -EXPORT_DECL(void, GX2SetColorBuffer, const GX2ColorBuffer *colorBuffer, s32 target); -EXPORT_DECL(void, GX2SetDepthBuffer, const GX2DepthBuffer *depthBuffer); -EXPORT_DECL(void, GX2SetAttribBuffer, u32 attr_index, u32 attr_size, u32 stride, const void* attr); -EXPORT_DECL(void, GX2InitTextureRegs, GX2Texture *texture); -EXPORT_DECL(void, GX2InitSampler, GX2Sampler *sampler, s32 tex_clamp, s32 min_mag_filter); -EXPORT_DECL(u32, GX2CalcFetchShaderSizeEx, u32 num_attrib, s32 fetch_shader_type, s32 tessellation_mode); -EXPORT_DECL(void, GX2InitFetchShaderEx, GX2FetchShader* fs, void* fs_buffer, u32 count, const GX2AttribStream* attribs, s32 fetch_shader_type, s32 tessellation_mode); -EXPORT_DECL(void, GX2SetFetchShader, const GX2FetchShader* fs); -EXPORT_DECL(void, GX2SetVertexUniformReg, u32 offset, u32 count, const void *values); -EXPORT_DECL(void, GX2SetPixelUniformReg, u32 offset, u32 count, const void *values); -EXPORT_DECL(void, GX2SetPixelTexture, const GX2Texture *texture, u32 texture_hw_location); -EXPORT_DECL(void, GX2SetVertexTexture, const GX2Texture *texture, u32 texture_hw_location); -EXPORT_DECL(void, GX2SetPixelSampler, const GX2Sampler *sampler, u32 sampler_hw_location); -EXPORT_DECL(void, GX2SetVertexSampler, const GX2Sampler *sampler, u32 sampler_hw_location); -EXPORT_DECL(void, GX2SetPixelShader, const GX2PixelShader* pixelShader); -EXPORT_DECL(void, GX2SetVertexShader, const GX2VertexShader* vertexShader); -EXPORT_DECL(void, GX2InitSamplerZMFilter, GX2Sampler *sampler, s32 z_filter, s32 mip_filter); -EXPORT_DECL(void, GX2SetColorControl, s32 lop, u8 blend_enable_mask, s32 enable_multi_write, s32 enable_color_buffer); -EXPORT_DECL(void, GX2SetDepthOnlyControl, s32 enable_depth, s32 enable_depth_write, s32 depth_comp_function); -EXPORT_DECL(void, GX2SetBlendControl, s32 target, s32 color_src_blend, s32 color_dst_blend, s32 color_combine, s32 separate_alpha_blend, s32 alpha_src_blend, s32 alpha_dst_blend, s32 alpha_combine); -EXPORT_DECL(void, GX2CalcDRCSize, s32 drc_mode, s32 format, s32 buffering_mode, u32 *size, s32 *scale_needed); -EXPORT_DECL(void, GX2SetDRCBuffer, void *buffer, u32 buffer_size, s32 drc_mode, s32 surface_format, s32 buffering_mode); -EXPORT_DECL(void, GX2SetDRCScale, u32 width, u32 height); -EXPORT_DECL(void, GX2SetDRCEnable, s32 enable); -EXPORT_DECL(void, GX2SetPolygonControl, s32 front_face_mode, s32 cull_front, s32 cull_back, s32 enable_mode, s32 mode_font, s32 mode_back, s32 poly_offset_front, s32 poly_offset_back, s32 point_line_offset); -EXPORT_DECL(void, GX2SetCullOnlyControl, s32 front_face_mode, s32 cull_front, s32 cull_back); -EXPORT_DECL(void, GX2SetDepthStencilControl, s32 enable_depth_test, s32 enable_depth_write, s32 depth_comp_function, s32 stencil_test_enable, s32 back_stencil_enable, - s32 font_stencil_func, s32 front_stencil_z_pass, s32 front_stencil_z_fail, s32 front_stencil_fail, - s32 back_stencil_func, s32 back_stencil_z_pass, s32 back_stencil_z_fail, s32 back_stencil_fail); -EXPORT_DECL(void, GX2SetStencilMask, u8 mask_front, u8 write_mask_front, u8 ref_front, u8 mask_back, u8 write_mask_back, u8 ref_back); -EXPORT_DECL(void, GX2SetLineWidth, f32 width); -EXPORT_DECL(void, GX2SetTVGamma, f32 val); -EXPORT_DECL(void, GX2SetDRCGamma, f32 gam); -EXPORT_DECL(s32, GX2GetSystemTVScanMode, void); -EXPORT_DECL(s32, GX2GetSystemDRCScanMode, void); -EXPORT_DECL(void, GX2RSetAllocator, void * (* allocFunc)(u32, u32, u32), void (* freeFunc)(u32, void*)); -EXPORT_DECL(void, GX2CopySurface, GX2Surface * srcSurface,u32 srcMip,u32 srcSlice,GX2Surface * dstSurface,u32 dstMip,u32 dstSlice ); - -EXPORT_DECL(void, GX2ClearBuffersEx, GX2ColorBuffer * colorBuffer,GX2DepthBuffer * depthBuffer,f32 r, f32 g, f32 b, f32 a,f32 depthValue,u8 stencilValue,int clearFlags); - -void InitAcquireGX2(void) -{ - OSDynLoad_Acquire("gx2.rpl", &gx2_handle); -} - -void InitGX2FunctionPointers(void) -{ - unsigned int *funcPointer = 0; - InitAcquireGX2(); - - OS_FIND_EXPORT(gx2_handle, GX2Init); - OS_FIND_EXPORT(gx2_handle, GX2Shutdown); - OS_FIND_EXPORT(gx2_handle, GX2Flush); - OS_FIND_EXPORT(gx2_handle, GX2GetMainCoreId); - OS_FIND_EXPORT(gx2_handle, GX2DrawDone); - OS_FIND_EXPORT(gx2_handle, GX2ClearColor); - OS_FIND_EXPORT(gx2_handle, GX2SetViewport); - OS_FIND_EXPORT(gx2_handle, GX2SetScissor); - OS_FIND_EXPORT(gx2_handle, GX2SetContextState); - OS_FIND_EXPORT(gx2_handle, GX2DrawEx); - OS_FIND_EXPORT(gx2_handle, GX2DrawIndexedEx); - OS_FIND_EXPORT(gx2_handle, GX2ClearDepthStencilEx); - OS_FIND_EXPORT(gx2_handle, GX2CopyColorBufferToScanBuffer); - OS_FIND_EXPORT(gx2_handle, GX2SwapScanBuffers); - OS_FIND_EXPORT(gx2_handle, GX2SetTVEnable); - OS_FIND_EXPORT(gx2_handle, GX2SetSwapInterval); - OS_FIND_EXPORT(gx2_handle, GX2GetSwapInterval); - OS_FIND_EXPORT(gx2_handle, GX2WaitForVsync); - OS_FIND_EXPORT(gx2_handle, GX2CalcTVSize); - OS_FIND_EXPORT(gx2_handle, GX2Invalidate); - OS_FIND_EXPORT(gx2_handle, GX2SetTVBuffer); - OS_FIND_EXPORT(gx2_handle, GX2CalcSurfaceSizeAndAlignment); - OS_FIND_EXPORT(gx2_handle, GX2InitDepthBufferRegs); - OS_FIND_EXPORT(gx2_handle, GX2InitColorBufferRegs); - OS_FIND_EXPORT(gx2_handle, GX2CalcColorBufferAuxInfo); - OS_FIND_EXPORT(gx2_handle, GX2CalcDepthBufferHiZInfo); - OS_FIND_EXPORT(gx2_handle, GX2InitDepthBufferHiZEnable); - OS_FIND_EXPORT(gx2_handle, GX2SetupContextStateEx); - OS_FIND_EXPORT(gx2_handle, GX2SetColorBuffer); - OS_FIND_EXPORT(gx2_handle, GX2SetDepthBuffer); - OS_FIND_EXPORT(gx2_handle, GX2SetAttribBuffer); - OS_FIND_EXPORT(gx2_handle, GX2InitTextureRegs); - OS_FIND_EXPORT(gx2_handle, GX2InitSampler); - OS_FIND_EXPORT(gx2_handle, GX2CalcFetchShaderSizeEx); - OS_FIND_EXPORT(gx2_handle, GX2InitFetchShaderEx); - OS_FIND_EXPORT(gx2_handle, GX2SetFetchShader); - OS_FIND_EXPORT(gx2_handle, GX2SetVertexUniformReg); - OS_FIND_EXPORT(gx2_handle, GX2SetPixelUniformReg); - OS_FIND_EXPORT(gx2_handle, GX2SetPixelTexture); - OS_FIND_EXPORT(gx2_handle, GX2SetVertexTexture); - OS_FIND_EXPORT(gx2_handle, GX2SetPixelSampler); - OS_FIND_EXPORT(gx2_handle, GX2SetVertexSampler); - OS_FIND_EXPORT(gx2_handle, GX2SetPixelShader); - OS_FIND_EXPORT(gx2_handle, GX2SetVertexShader); - OS_FIND_EXPORT(gx2_handle, GX2InitSamplerZMFilter); - OS_FIND_EXPORT(gx2_handle, GX2SetColorControl); - OS_FIND_EXPORT(gx2_handle, GX2SetDepthOnlyControl); - OS_FIND_EXPORT(gx2_handle, GX2SetBlendControl); - OS_FIND_EXPORT(gx2_handle, GX2CalcDRCSize); - OS_FIND_EXPORT(gx2_handle, GX2SetDRCBuffer); - OS_FIND_EXPORT(gx2_handle, GX2SetDRCScale); - OS_FIND_EXPORT(gx2_handle, GX2SetDRCEnable); - OS_FIND_EXPORT(gx2_handle, GX2SetPolygonControl); - OS_FIND_EXPORT(gx2_handle, GX2SetCullOnlyControl); - OS_FIND_EXPORT(gx2_handle, GX2SetDepthStencilControl); - OS_FIND_EXPORT(gx2_handle, GX2SetStencilMask); - OS_FIND_EXPORT(gx2_handle, GX2SetLineWidth); - OS_FIND_EXPORT(gx2_handle, GX2SetDRCGamma); - OS_FIND_EXPORT(gx2_handle, GX2SetTVGamma); - OS_FIND_EXPORT(gx2_handle, GX2GetSystemTVScanMode); - OS_FIND_EXPORT(gx2_handle, GX2GetSystemDRCScanMode); - OS_FIND_EXPORT(gx2_handle, GX2RSetAllocator); - OS_FIND_EXPORT(gx2_handle, GX2CopySurface); - OS_FIND_EXPORT(gx2_handle, GX2ClearBuffersEx); - OS_FIND_EXPORT(gx2_handle, GX2SetClearDepthStencil); -} diff --git a/src/dynamic_libs/gx2_functions.h b/src/dynamic_libs/gx2_functions.h deleted file mode 100644 index 0b06826..0000000 --- a/src/dynamic_libs/gx2_functions.h +++ /dev/null @@ -1,211 +0,0 @@ -/**************************************************************************** - * Copyright (C) 2015 - * by Dimok - * - * This software is provided 'as-is', without any express or implied - * warranty. In no event will the authors be held liable for any - * damages arising from the use of this software. - * - * Permission is granted to anyone to use this software for any - * purpose, including commercial applications, and to alter it and - * redistribute it freely, subject to the following restrictions: - * - * 1. The origin of this software must not be misrepresented; you - * must not claim that you wrote the original software. If you use - * this software in a product, an acknowledgment in the product - * documentation would be appreciated but is not required. - * - * 2. Altered source versions must be plainly marked as such, and - * must not be misrepresented as being the original software. - * - * 3. This notice may not be removed or altered from any source - * distribution. - ***************************************************************************/ -#ifndef __GX2_FUNCTIONS_H_ -#define __GX2_FUNCTIONS_H_ - -#ifdef __cplusplus -extern "C" { -#endif - -#include "gx2_types.h" - -extern unsigned int gx2_handle; - -void InitGX2FunctionPointers(void); -void InitAcquireGX2(void); - -extern void (* GX2Init)(u32 * init_attribs); -extern void (* GX2Shutdown)(void); -extern void (* GX2Flush)(void); -extern s32 (* GX2GetMainCoreId)(void) ; -extern s32 (* GX2DrawDone)(void); -extern void (* GX2ClearColor)(GX2ColorBuffer *colorBuffer, f32 r, f32 g, f32 b, f32 a); -extern void (* GX2SetViewport)(f32 x, f32 y, f32 w, f32 h, f32 nearZ, f32 farZ); -extern void (* GX2SetScissor)(u32 x_orig, u32 y_orig, u32 wd, u32 ht); -extern void (* GX2SetContextState)(const GX2ContextState* state); -extern void (* GX2DrawEx)(s32 primitive_type, u32 count, u32 first_vertex, u32 instances_count); -extern void (* GX2DrawIndexedEx)(s32 primitive_type, u32 count, s32 index_format, const void* idx, u32 first_vertex, u32 instances_count); -extern void (* GX2ClearDepthStencilEx)(GX2DepthBuffer *depthBuffer, f32 depth_value, u8 stencil_value, s32 clear_mode); -extern void (* GX2SetClearDepthStencil)(GX2DepthBuffer *depthBuffer, f32 depth_value, u8 stencil_value); -extern void (* GX2CopyColorBufferToScanBuffer)(const GX2ColorBuffer *colorBuffer, s32 scan_target); -extern void (* GX2SwapScanBuffers)(void); -extern void (* GX2SetTVEnable)(s32 enable); -extern void (* GX2SetSwapInterval)(u32 swap_interval); -extern u32 (* GX2GetSwapInterval)(void); -extern void (* GX2WaitForVsync)(void); -extern void (* GX2CalcTVSize)(s32 tv_render_mode, s32 format, s32 buffering_mode, u32 * size, s32 * scale_needed); -extern void (* GX2Invalidate)(s32 invalidate_type, void * ptr, u32 buffer_size); -extern void (* GX2SetTVBuffer)(void *buffer, u32 buffer_size, s32 tv_render_mode, s32 format, s32 buffering_mode); -extern void (* GX2CalcSurfaceSizeAndAlignment)(GX2Surface *surface); -extern void (* GX2InitDepthBufferRegs)(GX2DepthBuffer *depthBuffer); -extern void (* GX2InitColorBufferRegs)(GX2ColorBuffer *colorBuffer); -extern void (* GX2CalcColorBufferAuxInfo)(GX2ColorBuffer *colorBuffer, u32 *size, u32 *align); -extern void (* GX2CalcDepthBufferHiZInfo)(GX2DepthBuffer *depthBuffer, u32 *size, u32 *align); -extern void (* GX2InitDepthBufferHiZEnable)(GX2DepthBuffer *depthBuffer, s32 hiZ_enable); -extern void (* GX2SetupContextStateEx)(GX2ContextState* state, s32 enable_profiling); -extern void (* GX2SetColorBuffer)(const GX2ColorBuffer *colorBuffer, s32 target); -extern void (* GX2SetDepthBuffer)(const GX2DepthBuffer *depthBuffer); -extern void (* GX2SetAttribBuffer)(u32 attr_index, u32 attr_size, u32 stride, const void* attr); -extern void (* GX2InitTextureRegs)(GX2Texture *texture); -extern void (* GX2InitSampler)(GX2Sampler *sampler, s32 tex_clamp, s32 min_mag_filter); -extern u32 (* GX2CalcFetchShaderSizeEx)(u32 num_attrib, s32 fetch_shader_type, s32 tessellation_mode); -extern void (* GX2InitFetchShaderEx)(GX2FetchShader* fs, void* fs_buffer, u32 count, const GX2AttribStream* attribs, s32 fetch_shader_type, s32 tessellation_mode); -extern void (* GX2SetFetchShader)(const GX2FetchShader* fs); -extern void (* GX2SetVertexUniformReg)(u32 offset, u32 count, const void *values); -extern void (* GX2SetPixelUniformReg)(u32 offset, u32 count, const void *values); -extern void (* GX2SetPixelTexture)(const GX2Texture *texture, u32 texture_hw_location); -extern void (* GX2SetVertexTexture)(const GX2Texture *texture, u32 texture_hw_location); -extern void (* GX2SetPixelSampler)(const GX2Sampler *sampler, u32 sampler_hw_location); -extern void (* GX2SetVertexSampler)(const GX2Sampler *sampler, u32 sampler_hw_location); -extern void (* GX2SetPixelShader)(const GX2PixelShader* pixelShader); -extern void (* GX2SetVertexShader)(const GX2VertexShader* vertexShader); -extern void (* GX2InitSamplerZMFilter)(GX2Sampler *sampler, s32 z_filter, s32 mip_filter); -extern void (* GX2SetColorControl)(s32 lop, u8 blend_enable_mask, s32 enable_multi_write, s32 enable_color_buffer); -extern void (* GX2SetDepthOnlyControl)(s32 enable_depth, s32 enable_depth_write, s32 depth_comp_function); -extern void (* GX2SetBlendControl)(s32 target, s32 color_src_blend, s32 color_dst_blend, s32 color_combine, s32 separate_alpha_blend, s32 alpha_src_blend, s32 alpha_dst_blend, s32 alpha_combine); -extern void (* GX2CalcDRCSize)(s32 drc_mode, s32 format, s32 buffering_mode, u32 *size, s32 *scale_needed); -extern void (* GX2SetDRCBuffer)(void *buffer, u32 buffer_size, s32 drc_mode, s32 surface_format, s32 buffering_mode); -extern void (* GX2SetDRCScale)(u32 width, u32 height); -extern void (* GX2SetDRCEnable)(s32 enable); -extern void (* GX2SetPolygonControl)(s32 front_face_mode, s32 cull_front, s32 cull_back, s32 enable_mode, s32 mode_font, s32 mode_back, s32 poly_offset_front, s32 poly_offset_back, s32 point_line_offset); -extern void (* GX2SetCullOnlyControl)(s32 front_face_mode, s32 cull_front, s32 cull_back); -extern void (* GX2SetDepthStencilControl)(s32 enable_depth_test, s32 enable_depth_write, s32 depth_comp_function, s32 stencil_test_enable, s32 back_stencil_enable, - s32 font_stencil_func, s32 front_stencil_z_pass, s32 front_stencil_z_fail, s32 front_stencil_fail, - s32 back_stencil_func, s32 back_stencil_z_pass, s32 back_stencil_z_fail, s32 back_stencil_fail); -extern void (* GX2SetStencilMask)(u8 mask_front, u8 write_mask_front, u8 ref_front, u8 mask_back, u8 write_mask_back, u8 ref_back); -extern void (* GX2SetLineWidth)(f32 width); -extern void (* GX2SetTVGamma)(f32 val); -extern void (* GX2SetDRCGamma)(f32 val); -extern s32 (* GX2GetSystemTVScanMode)(void); -extern s32 (* GX2GetSystemDRCScanMode)(void); -extern void (* GX2RSetAllocator)(void * (*allocFunc)(u32, u32, u32), void (*freeFunc)(u32, void*)); -extern void (* GX2CopySurface)(GX2Surface * srcSurface,u32 srcMip,u32 srcSlice,GX2Surface * dstSurface,u32 dstMip,u32 dstSlice ); -extern void (* GX2ClearBuffersEx)(GX2ColorBuffer * colorBuffer,GX2DepthBuffer * depthBuffer,f32 r, f32 g, f32 b, f32 a,f32 depthValue,u8 stencilValue,int clearFlags); - -static inline void GX2InitDepthBuffer(GX2DepthBuffer *depthBuffer, s32 dimension, u32 width, u32 height, u32 depth, s32 format, s32 aa) -{ - depthBuffer->surface.dimension = dimension; - depthBuffer->surface.width = width; - depthBuffer->surface.height = height; - depthBuffer->surface.depth = depth; - depthBuffer->surface.num_mips = 1; - depthBuffer->surface.format = format; - depthBuffer->surface.aa = aa; - depthBuffer->surface.use = ((format==GX2_SURFACE_FORMAT_D_D24_S8_UNORM) || (format==GX2_SURFACE_FORMAT_D_D24_S8_FLOAT)) ? GX2_SURFACE_USE_DEPTH_BUFFER : GX2_SURFACE_USE_DEPTH_BUFFER_TEXTURE; - depthBuffer->surface.tile = GX2_TILE_MODE_DEFAULT; - depthBuffer->surface.swizzle = 0; - depthBuffer->view_mip = 0; - depthBuffer->view_first_slice = 0; - depthBuffer->view_slices_count = depth; - depthBuffer->clear_depth = 1.0f; - depthBuffer->clear_stencil = 0; - depthBuffer->hiZ_data = NULL; - depthBuffer->hiZ_size = 0; - GX2CalcSurfaceSizeAndAlignment(&depthBuffer->surface); - GX2InitDepthBufferRegs(depthBuffer); -} - -static inline void GX2InitColorBuffer(GX2ColorBuffer *colorBuffer, s32 dimension, u32 width, u32 height, u32 depth, s32 format, s32 aa) -{ - colorBuffer->surface.dimension = dimension; - colorBuffer->surface.width = width; - colorBuffer->surface.height = height; - colorBuffer->surface.depth = depth; - colorBuffer->surface.num_mips = 1; - colorBuffer->surface.format = format; - colorBuffer->surface.aa = aa; - colorBuffer->surface.use = GX2_SURFACE_USE_COLOR_BUFFER_TEXTURE_FTV; - colorBuffer->surface.image_size = 0; - colorBuffer->surface.image_data = NULL; - colorBuffer->surface.mip_size = 0; - colorBuffer->surface.mip_data = NULL; - colorBuffer->surface.tile = GX2_TILE_MODE_DEFAULT; - colorBuffer->surface.swizzle = 0; - colorBuffer->surface.align = 0; - colorBuffer->surface.pitch = 0; - u32 i; - for(i = 0; i < 13; i++) - colorBuffer->surface.mip_offset[i] = 0; - colorBuffer->view_mip = 0; - colorBuffer->view_first_slice = 0; - colorBuffer->view_slices_count = depth; - colorBuffer->aux_data = NULL; - colorBuffer->aux_size = 0; - for(i = 0; i < 5; i++) - colorBuffer->regs[i] = 0; - - GX2CalcSurfaceSizeAndAlignment(&colorBuffer->surface); - GX2InitColorBufferRegs(colorBuffer); -} - -static inline void GX2InitAttribStream(GX2AttribStream* attr, u32 location, u32 buffer, u32 offset, s32 format) -{ - attr->location = location; - attr->buffer = buffer; - attr->offset = offset; - attr->format = format; - attr->index_type = 0; - attr->divisor = 0; - attr->destination_selector = attribute_dest_comp_selector[format & 0xff]; - attr->endian_swap = GX2_ENDIANSWAP_DEFAULT; -} - -static inline void GX2InitTexture(GX2Texture *tex, u32 width, u32 height, u32 depth, u32 num_mips, s32 format, s32 dimension, s32 tile) -{ - tex->surface.dimension = dimension; - tex->surface.width = width; - tex->surface.height = height; - tex->surface.depth = depth; - tex->surface.num_mips = num_mips; - tex->surface.format = format; - tex->surface.aa = GX2_AA_MODE_1X; - tex->surface.use = GX2_SURFACE_USE_TEXTURE; - tex->surface.image_size = 0; - tex->surface.image_data = NULL; - tex->surface.mip_size = 0; - tex->surface.mip_data = NULL; - tex->surface.tile = tile; - tex->surface.swizzle = 0; - tex->surface.align = 0; - tex->surface.pitch = 0; - u32 i; - for(i = 0; i < 13; i++) - tex->surface.mip_offset[i] = 0; - tex->view_first_mip = 0; - tex->view_mips_count = num_mips; - tex->view_first_slice = 0; - tex->view_slices_count = depth; - tex->component_selector = texture_comp_selector[format & 0x3f]; - for(i = 0; i < 5; i++) - tex->regs[i] = 0; - - GX2CalcSurfaceSizeAndAlignment(&tex->surface); - GX2InitTextureRegs(tex); -} - -#ifdef __cplusplus -} -#endif - -#endif // __GX2_FUNCTIONS_H_ diff --git a/src/dynamic_libs/gx2_types.h b/src/dynamic_libs/gx2_types.h deleted file mode 100644 index e292318..0000000 --- a/src/dynamic_libs/gx2_types.h +++ /dev/null @@ -1,699 +0,0 @@ -/**************************************************************************** - * Copyright (C) 2015 - * by Dimok - * - * This software is provided 'as-is', without any express or implied - * warranty. In no event will the authors be held liable for any - * damages arising from the use of this software. - * - * Permission is granted to anyone to use this software for any - * purpose, including commercial applications, and to alter it and - * redistribute it freely, subject to the following restrictions: - * - * 1. The origin of this software must not be misrepresented; you - * must not claim that you wrote the original software. If you use - * this software in a product, an acknowledgment in the product - * documentation would be appreciated but is not required. - * - * 2. Altered source versions must be plainly marked as such, and - * must not be misrepresented as being the original software. - * - * 3. This notice may not be removed or altered from any source - * distribution. - ***************************************************************************/ -#ifndef _GX2_TYPES_H_ -#define _GX2_TYPES_H_ - -#ifdef __cplusplus -extern "C" { -#endif - -#include - -//!----------------------------------------------------------------------------------------------------------------------- -//! Constants -//!----------------------------------------------------------------------------------------------------------------------- -#define GX2_COMMAND_BUFFER_SIZE 0x400000 -#define GX2_SCAN_BUFFER_ALIGNMENT 0x1000 -#define GX2_SHADER_ALIGNMENT 0x100 -#define GX2_CONTEXT_STATE_ALIGNMENT 0x100 -#define GX2_DISPLAY_LIST_ALIGNMENT 0x20 -#define GX2_VERTEX_BUFFER_ALIGNMENT 0x40 -#define GX2_INDEX_BUFFER_ALIGNMENT 0x20 - -#define GX2_CONTEXT_STATE_SIZE 0xA100 - -#define GX2_AUX_BUFFER_CLEAR_VALUE 0xCC - -//!----------------------------------------------------------------------------------------------------------------------- -//! Common -//!----------------------------------------------------------------------------------------------------------------------- -#define GX2_FALSE 0 -#define GX2_TRUE 1 -#define GX2_DISABLE 0 -#define GX2_ENABLE 1 - -//!----------------------------------------------------------------------------------------------------------------------- -//! GX2InitAttrib -//!----------------------------------------------------------------------------------------------------------------------- -#define GX2_INIT_ATTRIB_NULL 0 -#define GX2_INIT_ATTRIB_CB_BASE 1 -#define GX2_INIT_ATTRIB_CB_SIZE 2 -#define GX2_INIT_ATTRIB_ARGC 7 -#define GX2_INIT_ATTRIB_ARGV 8 - -//!----------------------------------------------------------------------------------------------------------------------- -//! GX2 compare functions -//!----------------------------------------------------------------------------------------------------------------------- -#define GX2_COMPARE_NEVER 0 -#define GX2_COMPARE_LESS 1 -#define GX2_COMPARE_EQUAL 2 -#define GX2_COMPARE_LEQUAL 3 -#define GX2_COMPARE_GREATER 4 -#define GX2_COMPARE_NOTEQUAL 5 -#define GX2_COMPARE_GEQUAL 6 -#define GX2_COMPARE_ALWAYS 7 - -//!----------------------------------------------------------------------------------------------------------------------- -//! GX2 stencil functions -//!----------------------------------------------------------------------------------------------------------------------- -#define GX2_STENCIL_KEEP 0 -#define GX2_STENCIL_ZERO 1 -#define GX2_STENCIL_REPLACE 2 -#define GX2_STENCIL_INCR 3 -#define GX2_STENCIL_DECR 4 -#define GX2_STENCIL_INVERT 5 -#define GX2_STENCIL_INCR_WRAP 6 -#define GX2_STENCIL_DECR_WRAP 7 - -//!----------------------------------------------------------------------------------------------------------------------- -//! GX2 logic op functions -//!----------------------------------------------------------------------------------------------------------------------- -#define GX2_LOGIC_OP_CLEAR 0x00 -#define GX2_LOGIC_OP_NOR 0x11 -#define GX2_LOGIC_OP_INVAND 0x22 -#define GX2_LOGIC_OP_INVCOPY 0x33 -#define GX2_LOGIC_OP_REVAND 0x44 -#define GX2_LOGIC_OP_INV 0x55 -#define GX2_LOGIC_OP_XOR 0x66 -#define GX2_LOGIC_OP_NAND 0x77 -#define GX2_LOGIC_OP_AND 0x88 -#define GX2_LOGIC_OP_EQUIV 0x99 -#define GX2_LOGIC_OP_NOOP 0xAA -#define GX2_LOGIC_OP_INVOR 0xBB -#define GX2_LOGIC_OP_COPY 0xCC -#define GX2_LOGIC_OP_REVOR 0xDD -#define GX2_LOGIC_OP_OR 0xEE -#define GX2_LOGIC_OP_SET 0xFF - -//!----------------------------------------------------------------------------------------------------------------------- -//! GX2 blend combination functions -//!----------------------------------------------------------------------------------------------------------------------- -#define GX2_BLEND_COMBINE_ADD 0x00 -#define GX2_BLEND_COMBINE_SRC_MINUS_DST 0x01 -#define GX2_BLEND_COMBINE_MIN 0x02 -#define GX2_BLEND_COMBINE_MAX 0x03 -#define GX2_BLEND_COMBINE_DST_MINUS_SRC 0x04 - -//!----------------------------------------------------------------------------------------------------------------------- -//! GX2 blend functions -//!----------------------------------------------------------------------------------------------------------------------- -#define GX2_BLEND_ZERO 0x00 -#define GX2_BLEND_ONE 0x01 -#define GX2_BLEND_SRC_ALPHA 0x04 -#define GX2_BLEND_ONE_MINUS_SRC_ALPHA 0x05 - -//!----------------------------------------------------------------------------------------------------------------------- -//! GX2 render targets -//!----------------------------------------------------------------------------------------------------------------------- -#define GX2_RENDER_TARGET_0 0 -#define GX2_RENDER_TARGET_1 1 -#define GX2_RENDER_TARGET_2 2 -#define GX2_RENDER_TARGET_3 3 -#define GX2_RENDER_TARGET_4 4 -#define GX2_RENDER_TARGET_5 5 -#define GX2_RENDER_TARGET_6 6 -#define GX2_RENDER_TARGET_7 7 - -//!----------------------------------------------------------------------------------------------------------------------- -//! GX2 cull modes -//!----------------------------------------------------------------------------------------------------------------------- -#define GX2_FRONT_FACE_CCW 0 -#define GX2_FRONT_FACE_CW 1 -//!----------------------------------------------------------------------------------------------------------------------- -//! GX2 polygon modes -//!----------------------------------------------------------------------------------------------------------------------- -#define GX2_POLYGON_MODE_POINT 0 -#define GX2_POLYGON_MODE_LINE 1 -#define GX2_POLYGON_MODE_TRIANGLE 2 - -//!----------------------------------------------------------------------------------------------------------------------- -//! GX2 special states -//!----------------------------------------------------------------------------------------------------------------------- -#define GX2_SPECIAL_STATE_CLEAR 0 -#define GX2_SPECIAL_STATE_CLEAR_HIZ 1 -#define GX2_SPECIAL_STATE_COPY 2 -#define GX2_SPECIAL_STATE_EXPAND_COLOR 3 -#define GX2_SPECIAL_STATE_EXPAND_DEPTH 4 -#define GX2_SPECIAL_STATE_CONVERT_DEPTH 5 -#define GX2_SPECIAL_STATE_CONVERT_AADEPTH 6 -#define GX2_SPECIAL_STATE_RESOLVE_COLOR 7 -#define GX2_SPECIAL_STATE_CLEAR_COLOR_AS_DEPTH 8 - -//!----------------------------------------------------------------------------------------------------------------------- -//! GX2 attribute formats -//!----------------------------------------------------------------------------------------------------------------------- -#define GX2_ATTRIB_FORMAT_8_UNORM 0x00000000 -#define GX2_ATTRIB_FORMAT_4_4_UNORM 0x00000001 -#define GX2_ATTRIB_FORMAT_16_UNORM 0x00000002 -#define GX2_ATTRIB_FORMAT_8_8_UNORM 0x00000004 -#define GX2_ATTRIB_FORMAT_16_16_UNORM 0x00000007 -#define GX2_ATTRIB_FORMAT_8_8_8_8_UNORM 0x0000000A -#define GX2_ATTRIB_FORMAT_10_10_10_2_UNORM 0x0000000B -#define GX2_ATTRIB_FORMAT_16_16_16_16_UNORM 0x0000000E - -#define GX2_ATTRIB_FORMAT_8_UINT 0x00000100 -#define GX2_ATTRIB_FORMAT_16_UINT 0x00000102 -#define GX2_ATTRIB_FORMAT_8_8_UINT 0x00000104 -#define GX2_ATTRIB_FORMAT_32_UINT 0x00000105 -#define GX2_ATTRIB_FORMAT_16_16_UINT 0x00000107 -#define GX2_ATTRIB_FORMAT_8_8_8_8_UINT 0x0000010A -#define GX2_ATTRIB_FORMAT_10_10_10_2_UINT 0x0000010B -#define GX2_ATTRIB_FORMAT_32_32_UINT 0x0000010C -#define GX2_ATTRIB_FORMAT_16_16_16_16_UINT 0x0000010E -#define GX2_ATTRIB_FORMAT_32_32_32_UINT 0x00000110 -#define GX2_ATTRIB_FORMAT_32_32_32_32_UINT 0x00000112 - -#define GX2_ATTRIB_FORMAT_8_SNORM 0x00000200 -#define GX2_ATTRIB_FORMAT_16_SNORM 0x00000202 -#define GX2_ATTRIB_FORMAT_8_8_SNORM 0x00000204 -#define GX2_ATTRIB_FORMAT_16_16_SNORM 0x00000207 -#define GX2_ATTRIB_FORMAT_8_8_8_8_SNORM 0x0000020A -#define GX2_ATTRIB_FORMAT_10_10_10_2_SNORM 0x0000020B -#define GX2_ATTRIB_FORMAT_16_16_16_16_SNORM 0x0000020E - -#define GX2_ATTRIB_FORMAT_8_SINT 0x00000300 -#define GX2_ATTRIB_FORMAT_16_SINT 0x00000303 -#define GX2_ATTRIB_FORMAT_8_8_SINT 0x00000304 -#define GX2_ATTRIB_FORMAT_32_SINT 0x00000305 -#define GX2_ATTRIB_FORMAT_16_16_SINT 0x00000307 -#define GX2_ATTRIB_FORMAT_8_8_8_8_SINT 0x0000030A -#define GX2_ATTRIB_FORMAT_10_10_10_2_SINT 0x0000030B -#define GX2_ATTRIB_FORMAT_32_32_SINT 0x0000030C -#define GX2_ATTRIB_FORMAT_16_16_16_16_SINT 0x0000030E -#define GX2_ATTRIB_FORMAT_32_32_32_SINT 0x00000310 -#define GX2_ATTRIB_FORMAT_32_32_32_32_SINT 0x00000312 - -#define GX2_ATTRIB_FORMAT_8_UINT_TO_FLOAT 0x00000800 -#define GX2_ATTRIB_FORMAT_16_UINT_TO_FLOAT 0x00000802 -#define GX2_ATTRIB_FORMAT_16_FLOAT 0x00000803 -#define GX2_ATTRIB_FORMAT_8_8_UINT_TO_FLOAT 0x00000804 -#define GX2_ATTRIB_FORMAT_32_FLOAT 0x00000806 -#define GX2_ATTRIB_FORMAT_16_16_UINT_TO_FLOAT 0x00000807 -#define GX2_ATTRIB_FORMAT_16_16_FLOAT 0x00000808 -#define GX2_ATTRIB_FORMAT_10_11_11_FLOAT 0x00000809 -#define GX2_ATTRIB_FORMAT_8_8_8_8_UINT_TO_FLOAT 0x0000080A -#define GX2_ATTRIB_FORMAT_32_32_FLOAT 0x0000080D -#define GX2_ATTRIB_FORMAT_16_16_16_16_UINT_TO_FLOAT 0x0000080E -#define GX2_ATTRIB_FORMAT_16_16_16_16_FLOAT 0x0000080F -#define GX2_ATTRIB_FORMAT_32_32_32_FLOAT 0x00000811 -#define GX2_ATTRIB_FORMAT_32_32_32_32_FLOAT 0x00000813 - -#define GX2_ATTRIB_FORMAT_8_SINT_TO_FLOAT 0x00000A00 -#define GX2_ATTRIB_FORMAT_16_SINT_TO_FLOAT 0x00000A02 -#define GX2_ATTRIB_FORMAT_8_8_SINT_TO_FLOAT 0x00000A04 -#define GX2_ATTRIB_FORMAT_16_16_SINT_TO_FLOAT 0x00000A07 -#define GX2_ATTRIB_FORMAT_8_8_8_8_SINT_TO_FLOAT 0x00000A0A -#define GX2_ATTRIB_FORMAT_16_16_16_16_SINT_TO_FLOAT 0x00000A0E - -//!----------------------------------------------------------------------------------------------------------------------- -//! GX2 shader modes -//!----------------------------------------------------------------------------------------------------------------------- -#define GX2_SHADER_MODE_UNIFORM_REGISTER 0 -#define GX2_SHADER_MODE_UNIFORM_BLOCK 1 -#define GX2_SHADER_MODE_GEOMETRY_SHADER 2 -#define GX2_SHADER_MODE_COMPUTE_SHADER 3 - -//!----------------------------------------------------------------------------------------------------------------------- -//! GX2 shader modes -//!----------------------------------------------------------------------------------------------------------------------- -#define GX2_COMP_SEL_NONE 0x04040405 -#define GX2_COMP_SEL_X001 0x00040405 -#define GX2_COMP_SEL_XY01 0x00010405 -#define GX2_COMP_SEL_XYZ1 0x00010205 -#define GX2_COMP_SEL_XYZW 0x00010203 -#define GX2_COMP_SEL_XXXX 0x00000000 -#define GX2_COMP_SEL_YYYY 0x01010101 -#define GX2_COMP_SEL_ZZZZ 0x02020202 -#define GX2_COMP_SEL_WWWW 0x03030303 -#define GX2_COMP_SEL_WZYX 0x03020100 -#define GX2_COMP_SEL_WXYZ 0x03000102 - -//!----------------------------------------------------------------------------------------------------------------------- -//! GX2 variable types -//!----------------------------------------------------------------------------------------------------------------------- -#define GX2_VAR_TYPE_VOID 0 -#define GX2_VAR_TYPE_BOOL 1 -#define GX2_VAR_TYPE_INT 2 -#define GX2_VAR_TYPE_UINT 3 -#define GX2_VAR_TYPE_FLOAT 4 -#define GX2_VAR_TYPE_DOUBLE 5 -#define GX2_VAR_TYPE_VEC2 9 -#define GX2_VAR_TYPE_VEC3 10 -#define GX2_VAR_TYPE_VEC4 11 -#define GX2_VAR_TYPE_MAT2 21 -#define GX2_VAR_TYPE_MAT3 25 -#define GX2_VAR_TYPE_MAT4 29 - -//!----------------------------------------------------------------------------------------------------------------------- -//! GX2 sample types -//!----------------------------------------------------------------------------------------------------------------------- -#define GX2_SAMPLER_TYPE_2D 1 - - -//!----------------------------------------------------------------------------------------------------------------------- -//! GX2 index formats -//!----------------------------------------------------------------------------------------------------------------------- -#define GX2_INDEX_FORMAT_U16 4 -#define GX2_INDEX_FORMAT_U32 9 - -//!----------------------------------------------------------------------------------------------------------------------- -//! GX2 primitive types -//!----------------------------------------------------------------------------------------------------------------------- -#define GX2_PRIMITIVE_POINTS 0x01 -#define GX2_PRIMITIVE_LINES 0x02 -#define GX2_PRIMITIVE_LINE_STRIP 0x03 -#define GX2_PRIMITIVE_TRIANGLES 0x04 -#define GX2_PRIMITIVE_TRIANGLE_FAN 0x05 -#define GX2_PRIMITIVE_TRIANGLE_STRIP 0x06 -#define GX2_PRIMITIVE_RECTS 0x11 -#define GX2_PRIMITIVE_QUADS 0x13 -#define GX2_PRIMITIVE_QUAD_STRIP 0x14 - -//!----------------------------------------------------------------------------------------------------------------------- -//! GX2 clear modes -//!----------------------------------------------------------------------------------------------------------------------- -#define GX2_CLEAR_DEPTH 0x01 -#define GX2_CLEAR_STENCIL 0x02 -#define GX2_CLEAR_BOTH (GX2_CLEAR_DEPTH | GX2_CLEAR_STENCIL) - -//!----------------------------------------------------------------------------------------------------------------------- -//! GX2 surface formats -//!----------------------------------------------------------------------------------------------------------------------- -#define GX2_SURFACE_FORMAT_TC_R8_UNORM 0x00000001 -#define GX2_SURFACE_FORMAT_T_R4_G4_UNORM 0x00000002 -#define GX2_SURFACE_FORMAT_TCD_R16_UNORM 0x00000005 -#define GX2_SURFACE_FORMAT_TC_R8_G8_UNORM 0x00000007 -#define GX2_SURFACE_FORMAT_TCS_R5_G6_B5_UNORM 0x00000008 -#define GX2_SURFACE_FORMAT_TC_R5_G5_B5_A1_UNORM 0x0000000a -#define GX2_SURFACE_FORMAT_TC_R4_G4_B4_A4_UNORM 0x0000000b -#define GX2_SURFACE_FORMAT_TC_A1_B5_G5_R5_UNORM 0x0000000c -#define GX2_SURFACE_FORMAT_TC_R16_G16_UNORM 0x0000000f -#define GX2_SURFACE_FORMAT_D_D24_S8_UNORM 0x00000011 -#define GX2_SURFACE_FORMAT_T_R24_UNORM_X8 0x00000011 -#define GX2_SURFACE_FORMAT_TCS_R10_G10_B10_A2_UNORM 0x00000019 -#define GX2_SURFACE_FORMAT_TCS_R8_G8_B8_A8_UNORM 0x0000001a -#define GX2_SURFACE_FORMAT_TCS_A2_B10_G10_R10_UNORM 0x0000001b -#define GX2_SURFACE_FORMAT_TC_R16_G16_B16_A16_UNORM 0x0000001f -#define GX2_SURFACE_FORMAT_T_BC1_UNORM 0x00000031 -#define GX2_SURFACE_FORMAT_T_BC2_UNORM 0x00000032 -#define GX2_SURFACE_FORMAT_T_BC3_UNORM 0x00000033 -#define GX2_SURFACE_FORMAT_T_BC4_UNORM 0x00000034 -#define GX2_SURFACE_FORMAT_T_BC5_UNORM 0x00000035 -#define GX2_SURFACE_FORMAT_T_NV12_UNORM 0x00000081 - -#define GX2_SURFACE_FORMAT_TC_R8_UINT 0x00000101 -#define GX2_SURFACE_FORMAT_TC_R16_UINT 0x00000105 -#define GX2_SURFACE_FORMAT_TC_R8_G8_UINT 0x00000107 -#define GX2_SURFACE_FORMAT_TC_R32_UINT 0x0000010d -#define GX2_SURFACE_FORMAT_TC_R16_G16_UINT 0x0000010f -#define GX2_SURFACE_FORMAT_T_X24_G8_UINT 0x00000111 -#define GX2_SURFACE_FORMAT_TC_R10_G10_B10_A2_UINT 0x00000119 -#define GX2_SURFACE_FORMAT_TC_R8_G8_B8_A8_UINT 0x0000011a -#define GX2_SURFACE_FORMAT_TC_A2_B10_G10_R10_UINT 0x0000011b -#define GX2_SURFACE_FORMAT_T_X32_G8_UINT_X24 0x0000011c -#define GX2_SURFACE_FORMAT_TC_R32_G32_UINT 0x0000011d -#define GX2_SURFACE_FORMAT_TC_R16_G16_B16_A16_UINT 0x0000011f -#define GX2_SURFACE_FORMAT_TC_R32_G32_B32_A32_UINT 0x00000122 - -#define GX2_SURFACE_FORMAT_TC_R8_SNORM 0x00000201 -#define GX2_SURFACE_FORMAT_TC_R16_SNORM 0x00000205 -#define GX2_SURFACE_FORMAT_TC_R8_G8_SNORM 0x00000207 -#define GX2_SURFACE_FORMAT_TC_R16_G16_SNORM 0x0000020f -#define GX2_SURFACE_FORMAT_T_R10_G10_B10_A2_SNORM 0x00000219 -#define GX2_SURFACE_FORMAT_TC_R10_G10_B10_A2_SNORM 0x00000219 -#define GX2_SURFACE_FORMAT_TC_R8_G8_B8_A8_SNORM 0x0000021a -#define GX2_SURFACE_FORMAT_TC_R16_G16_B16_A16_SNORM 0x0000021f -#define GX2_SURFACE_FORMAT_T_BC4_SNORM 0x00000234 -#define GX2_SURFACE_FORMAT_T_BC5_SNORM 0x00000235 - -#define GX2_SURFACE_FORMAT_TC_R8_SINT 0x00000301 -#define GX2_SURFACE_FORMAT_TC_R16_SINT 0x00000305 -#define GX2_SURFACE_FORMAT_TC_R8_G8_SINT 0x00000307 -#define GX2_SURFACE_FORMAT_TC_R32_SINT 0x0000030d -#define GX2_SURFACE_FORMAT_TC_R16_G16_SINT 0x0000030f -#define GX2_SURFACE_FORMAT_TC_R10_G10_B10_A2_SINT 0x00000319 -#define GX2_SURFACE_FORMAT_TC_R8_G8_B8_A8_SINT 0x0000031a -#define GX2_SURFACE_FORMAT_TC_R32_G32_SINT 0x0000031d -#define GX2_SURFACE_FORMAT_TC_R16_G16_B16_A16_SINT 0x0000031f -#define GX2_SURFACE_FORMAT_TC_R32_G32_B32_A32_SINT 0x00000322 - -#define GX2_SURFACE_FORMAT_TCS_R8_G8_B8_A8_SRGB 0x0000041a -#define GX2_SURFACE_FORMAT_T_BC1_SRGB 0x00000431 -#define GX2_SURFACE_FORMAT_T_BC2_SRGB 0x00000432 -#define GX2_SURFACE_FORMAT_T_BC3_SRGB 0x00000433 - -#define GX2_SURFACE_FORMAT_TC_R16_FLOAT 0x00000806 -#define GX2_SURFACE_FORMAT_TCD_R32_FLOAT 0x0000080e -#define GX2_SURFACE_FORMAT_TC_R16_G16_FLOAT 0x00000810 -#define GX2_SURFACE_FORMAT_D_D24_S8_FLOAT 0x00000811 -#define GX2_SURFACE_FORMAT_TC_R11_G11_B10_FLOAT 0x00000816 -#define GX2_SURFACE_FORMAT_D_D32_FLOAT_S8_UINT_X24 0x0000081c -#define GX2_SURFACE_FORMAT_T_R32_FLOAT_X8_X24 0x0000081c -#define GX2_SURFACE_FORMAT_TC_R32_G32_FLOAT 0x0000081e -#define GX2_SURFACE_FORMAT_TC_R16_G16_B16_A16_FLOAT 0x00000820 -#define GX2_SURFACE_FORMAT_TC_R32_G32_B32_A32_FLOAT 0x00000823 - -//!----------------------------------------------------------------------------------------------------------------------- -//! GX2 tile modes -//!----------------------------------------------------------------------------------------------------------------------- -#define GX2_TILE_MODE_DEFAULT 0x00000000 -#define GX2_TILE_MODE_LINEAR_ALIGNED 0x00000001 - -//!----------------------------------------------------------------------------------------------------------------------- -//! GX2 surface use -//!----------------------------------------------------------------------------------------------------------------------- -#define GX2_SURFACE_USE_TEXTURE 0x00000001 -#define GX2_SURFACE_USE_COLOR_BUFFER 0x00000002 -#define GX2_SURFACE_USE_DEPTH_BUFFER 0x00000004 -#define GX2_SURFACE_USE_SCAN_BUFFER 0x00000008 -#define GX2_SURFACE_USE_FTV 0x80000000 -#define GX2_SURFACE_USE_COLOR_BUFFER_TEXTURE (GX2_SURFACE_USE_COLOR_BUFFER | GX2_SURFACE_USE_TEXTURE) -#define GX2_SURFACE_USE_DEPTH_BUFFER_TEXTURE (GX2_SURFACE_USE_DEPTH_BUFFER | GX2_SURFACE_USE_TEXTURE) -#define GX2_SURFACE_USE_COLOR_BUFFER_FTV (GX2_SURFACE_USE_COLOR_BUFFER | GX2_SURFACE_USE_FTV) -#define GX2_SURFACE_USE_COLOR_BUFFER_TEXTURE_FTV (GX2_SURFACE_USE_COLOR_BUFFER_TEXTURE | GX2_SURFACE_USE_FTV) - -//!----------------------------------------------------------------------------------------------------------------------- -//! GX2 surface dim -//!----------------------------------------------------------------------------------------------------------------------- -#define GX2_SURFACE_DIM_1D 0x00000000 -#define GX2_SURFACE_DIM_2D 0x00000001 -#define GX2_SURFACE_DIM_3D 0x00000002 -#define GX2_SURFACE_DIM_CUBE 0x00000003 -#define GX2_SURFACE_DIM_1D_ARRAY 0x00000004 -#define GX2_SURFACE_DIM_2D_ARRAY 0x00000005 -#define GX2_SURFACE_DIM_2D_MSAA 0x00000006 -#define GX2_SURFACE_DIM_2D_MSAA_ARRAY 0x00000007 - -//!----------------------------------------------------------------------------------------------------------------------- -//! GX2 AA modes -//!----------------------------------------------------------------------------------------------------------------------- -#define GX2_AA_MODE_1X 0x00000000 -#define GX2_AA_MODE_2X 0x00000001 -#define GX2_AA_MODE_4X 0x00000002 -#define GX2_AA_MODE_8X 0x00000003 - -//!----------------------------------------------------------------------------------------------------------------------- -//! GX2 texture clamp -//!----------------------------------------------------------------------------------------------------------------------- -#define GX2_TEX_CLAMP_WRAP 0x00000000 -#define GX2_TEX_CLAMP_MIRROR 0x00000001 -#define GX2_TEX_CLAMP_CLAMP 0x00000002 -#define GX2_TEX_CLAMP_MIRROR_ONCE 0x00000003 -#define GX2_TEX_CLAMP_CLAMP_HALF_BORDER 0x00000004 -#define GX2_TEX_CLAMP_MIRROR_ONCE_HALF_BORDER 0x00000005 -#define GX2_TEX_CLAMP_CLAMP_BORDER 0x00000006 -#define GX2_TEX_CLAMP_MIRROR_ONCE_BORDER 0x00000007 - -//!----------------------------------------------------------------------------------------------------------------------- -//! GX2 texture filter -//!----------------------------------------------------------------------------------------------------------------------- -#define GX2_TEX_XY_FILTER_POINT 0x00000000 -#define GX2_TEX_XY_FILTER_BILINEAR 0x00000001 - -//!----------------------------------------------------------------------------------------------------------------------- -//! GX2 TV scan modes -//!----------------------------------------------------------------------------------------------------------------------- -#define GX2_TV_SCAN_MODE_NONE 0x00000000 -#define GX2_TV_SCAN_MODE_576I 0x00000001 -#define GX2_TV_SCAN_MODE_480I 0x00000002 -#define GX2_TV_SCAN_MODE_480P 0x00000003 -#define GX2_TV_SCAN_MODE_720P 0x00000004 -#define GX2_TV_SCAN_MODE_1080I 0x00000006 -#define GX2_TV_SCAN_MODE_1080P 0x00000007 - -//!----------------------------------------------------------------------------------------------------------------------- -//! GX2 TV render modes -//!----------------------------------------------------------------------------------------------------------------------- -#define GX2_TV_RENDER_480_NARROW 0x00000001 -#define GX2_TV_RENDER_480_WIDE 0x00000002 -#define GX2_TV_RENDER_720 0x00000003 -#define GX2_TV_RENDER_1080 0x00000005 - -//!----------------------------------------------------------------------------------------------------------------------- -//! GX2 DRC render modes -//!----------------------------------------------------------------------------------------------------------------------- -#define GX2_DRC_NONE 0x00000000 -#define GX2_DRC_SINGLE 0x00000001 -#define GX2_DRC_DOUBLE 0x00000002 -#define GX2_DRC_SINGLE_30HZ 0x00000004 - -//!----------------------------------------------------------------------------------------------------------------------- -//! GX2 buffering mode -//!----------------------------------------------------------------------------------------------------------------------- -#define GX2_BUFFERING_SINGLE 0x00000001 -#define GX2_BUFFERING_DOUBLE 0x00000002 -#define GX2_BUFFERING_TRIPLE 0x00000003 -#define GX2_BUFFERING_QUAD -//!----------------------------------------------------------------------------------------------------------------------- -//! GX2 scan targets -//!----------------------------------------------------------------------------------------------------------------------- -#define GX2_SCAN_TARGET_TV 0x00000001 -#define GX2_SCAN_TARGET_DRC_FIRST 0x00000004 -#define GX2_SCAN_TARGET_DRC_SECOND 0x00000008 - -//!----------------------------------------------------------------------------------------------------------------------- -//! GX2 invalidate types -//!----------------------------------------------------------------------------------------------------------------------- -#define GX2_INVALIDATE_ATTRIB_BUFFER 0x00000001 -#define GX2_INVALIDATE_TEXTURE 0x00000002 -#define GX2_INVALIDATE_UNIFORM_BLOCK 0x00000004 -#define GX2_INVALIDATE_SHADER 0x00000008 -#define GX2_INVALIDATE_COLOR_BUFFER 0x00000010 -#define GX2_INVALIDATE_DEPTH_BUFFER 0x00000020 -#define GX2_INVALIDATE_CPU 0x00000040 -#define GX2_INVALIDATE_CPU_ATTRIB_BUFFER (GX2_INVALIDATE_CPU | GX2_INVALIDATE_ATTRIB_BUFFER) -#define GX2_INVALIDATE_CPU_TEXTURE (GX2_INVALIDATE_CPU | GX2_INVALIDATE_TEXTURE) -#define GX2_INVALIDATE_CPU_UNIFORM_BLOCK (GX2_INVALIDATE_CPU | GX2_INVALIDATE_UNIFORM_BLOCK) -#define GX2_INVALIDATE_CPU_SHADER (GX2_INVALIDATE_CPU | GX2_INVALIDATE_SHADER) - -//!----------------------------------------------------------------------------------------------------------------------- -//! GX2 swap modes -//!----------------------------------------------------------------------------------------------------------------------- -#define GX2_ENDIANSWAP_DEFAULT 0x00000003 - -//!----------------------------------------------------------------------------------------------------------------------- -//! GX2 tessellation modes -//!----------------------------------------------------------------------------------------------------------------------- -#define GX2_TESSELLATION_MODE_DISCRETE 0x00000000 -#define GX2_TESSELLATION_MODE_CONTINUOUS 0x00000001 -#define GX2_TESSELLATION_MODE_ADAPTIVE 0x00000002 - -//!----------------------------------------------------------------------------------------------------------------------- -//! GX2 fetch shader types -//!----------------------------------------------------------------------------------------------------------------------- -#define GX2_FETCH_SHADER_TESSELATION_NONE 0x00000000 -#define GX2_FETCH_SHADER_TESSELATION_LINES 0x00000001 -#define GX2_FETCH_SHADER_TESSELATION_TRIANGLES 0x00000002 -#define GX2_FETCH_SHADER_TESSELATION_QUADS 0x00000003 - - -typedef struct _GX2ContextState { - u8 data[GX2_CONTEXT_STATE_SIZE]; -} GX2ContextState; - -typedef struct _GX2Surface { - s32 dimension; - u32 width; - u32 height; - u32 depth; - u32 num_mips; - s32 format; - s32 aa; - s32 use; - u32 image_size; - void *image_data; - u32 mip_size; - void *mip_data; - s32 tile; - u32 swizzle; - u32 align; - u32 pitch; - u32 mip_offset[13]; -} GX2Surface; - -typedef struct _GX2ColorBuffer { - GX2Surface surface; - u32 view_mip; - u32 view_first_slice; - u32 view_slices_count; - void *aux_data; - u32 aux_size; - u32 regs[5]; -} GX2ColorBuffer; - -typedef struct _GX2DepthBuffer { - GX2Surface surface; - u32 view_mip; - u32 view_first_slice; - u32 view_slices_count; - void *hiZ_data; - u32 hiZ_size; - f32 clear_depth; - u32 clear_stencil; - u32 regs[7]; -} GX2DepthBuffer; - - -typedef struct _GX2Texture { - GX2Surface surface; - u32 view_first_mip; - u32 view_mips_count; - u32 view_first_slice; - u32 view_slices_count; - u32 component_selector; - u32 regs[5]; -} GX2Texture; - - -typedef struct _GX2Sampler { - u32 regs[3]; -} GX2Sampler; - -typedef struct _GX2AttribStream { - u32 location; - u32 buffer; - u32 offset; - s32 format; - s32 index_type; - u32 divisor; - u32 destination_selector; - s32 endian_swap; -} GX2AttribStream; - -typedef struct _GX2FetchShader { - s32 type; - u32 reg; - u32 shader_size; - void *shader_program; - u32 attributes_count; - u32 divisor[3]; -} GX2FetchShader; - -typedef struct _GX2AttribVar -{ - const char *name; - s32 var_type; - u32 array_count; - u32 location; -} GX2AttribVar; - - -typedef struct _GX2UniformBlock { - const char *name; - u32 location; - u32 block_size; -} GX2UniformBlock; - -typedef struct _GX2UniformInitialValue { - f32 value[4]; - u32 offset; -} GX2UniformInitialValue; - -typedef struct _GX2SamplerVar -{ - const char *name; - s32 sampler_type; - u32 location; -} GX2SamplerVar; - -typedef struct _GX2UniformVar -{ - const char *name; - s32 var_type; - u32 array_count; - u32 offset; - u32 block_index; -} GX2UniformVar; - -typedef struct _GX2VertexShader { - u32 regs[52]; - u32 shader_size; - void *shader_data; - s32 shader_mode; - u32 uniform_blocks_count; - GX2UniformBlock *uniform_block; - u32 uniform_vars_count; - GX2UniformVar *uniform_var; - u32 initial_values_count; - GX2UniformInitialValue *initial_value; - u32 loops_count; - void *loops_data; - u32 sampler_vars_count; - GX2SamplerVar *sampler_var; - u32 attribute_vars_count; - GX2AttribVar *attribute_var; - u32 data[6]; - u32 shader_program_buffer[16]; -} GX2VertexShader; - -typedef struct _GX2PixelShader { - u32 regs[41]; - u32 shader_size; - void *shader_data; - s32 shader_mode; - u32 uniform_blocks_count; - GX2UniformBlock *uniform_block; - u32 uniform_vars_count; - GX2UniformVar *uniform_var; - u32 initial_values_count; - GX2UniformInitialValue *initial_value; - u32 loops_count; - void *loops_data; - u32 sampler_vars_count; - GX2SamplerVar *sampler_var; - u32 shader_program_buffer[16]; -} GX2PixelShader; - -static const u32 attribute_dest_comp_selector[20] = { - GX2_COMP_SEL_X001, GX2_COMP_SEL_XY01, GX2_COMP_SEL_X001, GX2_COMP_SEL_X001, GX2_COMP_SEL_XY01, GX2_COMP_SEL_X001, - GX2_COMP_SEL_X001, GX2_COMP_SEL_XY01, GX2_COMP_SEL_XY01, GX2_COMP_SEL_XYZ1, GX2_COMP_SEL_XYZW, GX2_COMP_SEL_XYZW, - GX2_COMP_SEL_XY01, GX2_COMP_SEL_XY01, GX2_COMP_SEL_XYZW, GX2_COMP_SEL_XYZW, GX2_COMP_SEL_XYZ1, GX2_COMP_SEL_XYZ1, - GX2_COMP_SEL_XYZW, GX2_COMP_SEL_XYZW -}; - -static const u32 texture_comp_selector[54] = { - GX2_COMP_SEL_NONE, GX2_COMP_SEL_X001, GX2_COMP_SEL_XY01, GX2_COMP_SEL_NONE, GX2_COMP_SEL_NONE, GX2_COMP_SEL_X001, - GX2_COMP_SEL_X001, GX2_COMP_SEL_XY01, GX2_COMP_SEL_XYZ1, GX2_COMP_SEL_XYZ1, GX2_COMP_SEL_XYZW, GX2_COMP_SEL_XYZW, - GX2_COMP_SEL_WZYX, GX2_COMP_SEL_X001, GX2_COMP_SEL_X001, GX2_COMP_SEL_XY01, GX2_COMP_SEL_XY01, GX2_COMP_SEL_NONE, - GX2_COMP_SEL_NONE, GX2_COMP_SEL_NONE, GX2_COMP_SEL_NONE, GX2_COMP_SEL_NONE, GX2_COMP_SEL_XYZ1, GX2_COMP_SEL_NONE, - GX2_COMP_SEL_NONE, GX2_COMP_SEL_XYZW, GX2_COMP_SEL_XYZW, GX2_COMP_SEL_WZYX, GX2_COMP_SEL_XY01, GX2_COMP_SEL_XY01, - GX2_COMP_SEL_XY01, GX2_COMP_SEL_XYZW, GX2_COMP_SEL_XYZW, GX2_COMP_SEL_NONE, GX2_COMP_SEL_XYZW, GX2_COMP_SEL_XYZW, - GX2_COMP_SEL_NONE, GX2_COMP_SEL_NONE, GX2_COMP_SEL_NONE, GX2_COMP_SEL_XYZ1, GX2_COMP_SEL_XYZ1, GX2_COMP_SEL_X001, - GX2_COMP_SEL_XY01, GX2_COMP_SEL_XYZ1, GX2_COMP_SEL_NONE, GX2_COMP_SEL_NONE, GX2_COMP_SEL_NONE, GX2_COMP_SEL_XYZ1, - GX2_COMP_SEL_XYZ1, GX2_COMP_SEL_XYZW, GX2_COMP_SEL_XYZW, GX2_COMP_SEL_XYZW, GX2_COMP_SEL_X001, GX2_COMP_SEL_XY01 -}; - -typedef struct _GX2Color { - u8 r, g, b, a; -} GX2Color; - -typedef struct _GX2ColorF32 { - f32 r, g, b, a; -} GX2ColorF32; - -#ifdef __cplusplus -} -#endif - -#endif diff --git a/src/dynamic_libs/os_functions.c b/src/dynamic_libs/os_functions.c deleted file mode 100644 index 734e2e5..0000000 --- a/src/dynamic_libs/os_functions.c +++ /dev/null @@ -1,326 +0,0 @@ -/**************************************************************************** - * Copyright (C) 2015 - * by Dimok - * - * This software is provided 'as-is', without any express or implied - * warranty. In no event will the authors be held liable for any - * damages arising from the use of this software. - * - * Permission is granted to anyone to use this software for any - * purpose, including commercial applications, and to alter it and - * redistribute it freely, subject to the following restrictions: - * - * 1. The origin of this software must not be misrepresented; you - * must not claim that you wrote the original software. If you use - * this software in a product, an acknowledgment in the product - * documentation would be appreciated but is not required. - * - * 2. Altered source versions must be plainly marked as such, and - * must not be misrepresented as being the original software. - * - * 3. This notice may not be removed or altered from any source - * distribution. - ***************************************************************************/ -#include "common/common.h" -#include "os_functions.h" - -unsigned int coreinit_handle __attribute__((section(".data"))) = 0; - -//!---------------------------------------------------------------------------------------------------------------------------------------------------------------------------- -//! Lib handle functions -//!---------------------------------------------------------------------------------------------------------------------------------------------------------------------------- -EXPORT_DECL(int, OSDynLoad_Acquire, const char* rpl, u32 *handle); -EXPORT_DECL(int, OSDynLoad_FindExport, u32 handle, int isdata, const char *symbol, void *address); - -//!---------------------------------------------------------------------------------------------------------------------------------------------------------------------------- -//! Security functions -//!---------------------------------------------------------------------------------------------------------------------------------------------------------------------------- -EXPORT_DECL(int, OSGetSecurityLevel, void); - -//!---------------------------------------------------------------------------------------------------------------------------------------------------------------------------- -//! Thread functions -//!---------------------------------------------------------------------------------------------------------------------------------------------------------------------------- -EXPORT_DECL(int, OSCreateThread, void *thread, s32 (*callback)(s32, void*), s32 argc, void *args, u32 stack, u32 stack_size, s32 priority, u32 attr); -EXPORT_DECL(int, OSResumeThread, void *thread); -EXPORT_DECL(int, OSSuspendThread, void *thread); -EXPORT_DECL(int, OSIsThreadTerminated, void *thread); -EXPORT_DECL(int, OSIsThreadSuspended, void *thread); -EXPORT_DECL(int, OSSetThreadPriority, void * thread, int priority); -EXPORT_DECL(int, OSJoinThread, void * thread, int * ret_val); -EXPORT_DECL(void, OSDetachThread, void * thread); -EXPORT_DECL(void, OSSleepTicks, u64 ticks); -EXPORT_DECL(u64, OSGetTick, void); -EXPORT_DECL(u64, OSGetTime, void); -EXPORT_DECL(void, OSTicksToCalendarTime, u64 time, OSCalendarTime * calendarTime); - - -//!---------------------------------------------------------------------------------------------------------------------------------------------------------------------------- -//! Mutex functions -//!---------------------------------------------------------------------------------------------------------------------------------------------------------------------------- -EXPORT_DECL(void, OSInitMutex, void* mutex); -EXPORT_DECL(void, OSLockMutex, void* mutex); -EXPORT_DECL(void, OSUnlockMutex, void* mutex); -EXPORT_DECL(int, OSTryLockMutex, void* mutex); - -//!---------------------------------------------------------------------------------------------------------------------------------------------------------------------------- -//! System functions -//!---------------------------------------------------------------------------------------------------------------------------------------------------------------------------- -EXPORT_DECL(u64, OSGetTitleID, void); -EXPORT_DECL(void, OSGetArgcArgv, int* argc, char*** argv); -EXPORT_DECL(void, __Exit, void); -EXPORT_DECL(void, OSFatal, const char* msg); -EXPORT_DECL(void, OSSetExceptionCallback, u8 exceptionType, exception_callback newCallback); -EXPORT_DECL(void, DCFlushRange, const void *addr, u32 length); -EXPORT_DECL(void, ICInvalidateRange, const void *addr, u32 length); -EXPORT_DECL(void*, OSEffectiveToPhysical, const void*); -EXPORT_DECL(int, __os_snprintf, char* s, int n, const char * format, ...); -EXPORT_DECL(int *, __gh_errno_ptr, void); - -EXPORT_DECL(void, OSScreenInit, void); -EXPORT_DECL(unsigned int, OSScreenGetBufferSizeEx, unsigned int bufferNum); -EXPORT_DECL(int, OSScreenSetBufferEx, unsigned int bufferNum, void * addr); -EXPORT_DECL(int, OSScreenClearBufferEx, unsigned int bufferNum, unsigned int temp); -EXPORT_DECL(int, OSScreenFlipBuffersEx, unsigned int bufferNum); -EXPORT_DECL(int, OSScreenPutFontEx, unsigned int bufferNum, unsigned int posX, unsigned int posY, const char * buffer); -EXPORT_DECL(int, OSScreenEnableEx, unsigned int bufferNum, int enable); - -//!---------------------------------------------------------------------------------------------------------------------------------------------------------------------------- -//! Memory functions -//!---------------------------------------------------------------------------------------------------------------------------------------------------------------------------- -EXPORT_VAR(unsigned int *, pMEMAllocFromDefaultHeapEx); -EXPORT_VAR(unsigned int *, pMEMAllocFromDefaultHeap); -EXPORT_VAR(unsigned int *, pMEMFreeToDefaultHeap); - -EXPORT_DECL(int, MEMGetBaseHeapHandle, int mem_arena); -EXPORT_DECL(unsigned int, MEMGetAllocatableSizeForFrmHeapEx, int heap, int align); -EXPORT_DECL(void *, MEMAllocFromFrmHeapEx, int heap, unsigned int size, int align); -EXPORT_DECL(void, MEMFreeToFrmHeap, int heap, int mode); -EXPORT_DECL(void *, MEMAllocFromExpHeapEx, int heap, unsigned int size, int align); -EXPORT_DECL(int , MEMCreateExpHeapEx, void* address, unsigned int size, unsigned short flags); -EXPORT_DECL(void *, MEMDestroyExpHeap, int heap); -EXPORT_DECL(void, MEMFreeToExpHeap, int heap, void* ptr); - -//!---------------------------------------------------------------------------------------------------------------------------------------------------------------------------- -//! MCP functions -//!---------------------------------------------------------------------------------------------------------------------------------------------------------------------------- -EXPORT_DECL(int, MCP_Open, void); -EXPORT_DECL(int, MCP_Close, int handle); -EXPORT_DECL(int, MCP_GetOwnTitleInfo, int handle, void * data); - -//!---------------------------------------------------------------------------------------------------------------------------------------------------------------------------- -//! Loader functions (not real rpl) -//!---------------------------------------------------------------------------------------------------------------------------------------------------------------------------- -EXPORT_DECL(int, LiWaitIopComplete, int unknown_syscall_arg_r3, int * remaining_bytes); -EXPORT_DECL(int, LiWaitIopCompleteWithInterrupts, int unknown_syscall_arg_r3, int * remaining_bytes); -EXPORT_DECL(void, addr_LiWaitOneChunk, void); -EXPORT_DECL(void, addr_sgIsLoadingBuffer, void); -EXPORT_DECL(void, addr_gDynloadInitialized, void); - -//!---------------------------------------------------------------------------------------------------------------------------------------------------------------------------- -//! Kernel function addresses -//!---------------------------------------------------------------------------------------------------------------------------------------------------------------------------- -EXPORT_DECL(void, addr_PrepareTitle_hook, void); - -//!---------------------------------------------------------------------------------------------------------------------------------------------------------------------------- -//! Other function addresses -//!---------------------------------------------------------------------------------------------------------------------------------------------------------------------------- -EXPORT_DECL(void, DCInvalidateRange, void *buffer, uint32_t length); - -//!---------------------------------------------------------------------------------------------------------------------------------------------------------------------------- -//! Energy Saver functions -//!---------------------------------------------------------------------------------------------------------------------------------------------------------------------------- -//Burn-in Reduction -EXPORT_DECL(int, IMEnableDim,void); -EXPORT_DECL(int, IMDisableDim,void); -EXPORT_DECL(int, IMIsDimEnabled,int * result); -//Auto power down -EXPORT_DECL(int, IMEnableAPD,void); -EXPORT_DECL(int, IMDisableAPD,void); -EXPORT_DECL(int, IMIsAPDEnabled,int * result); -EXPORT_DECL(int, IMIsAPDEnabledBySysSettings,int * result); - -void InitAcquireOS(void) -{ - //!---------------------------------------------------------------------------------------------------------------------------------------------------------------------------- - //! Lib handle functions - //!---------------------------------------------------------------------------------------------------------------------------------------------------------------------------- - EXPORT_FUNC_WRITE(OSDynLoad_Acquire, (int (*)(const char*, unsigned *))OS_SPECIFICS->addr_OSDynLoad_Acquire); - EXPORT_FUNC_WRITE(OSDynLoad_FindExport, (int (*)(u32, int, const char *, void *))OS_SPECIFICS->addr_OSDynLoad_FindExport); - - OSDynLoad_Acquire("coreinit.rpl", &coreinit_handle); -} - -void InitOSFunctionPointers(void) -{ - unsigned int *funcPointer = 0; - - InitAcquireOS(); - - //!---------------------------------------------------------------------------------------------------------------------------------------------------------------------------- - //! Security functions - //!---------------------------------------------------------------------------------------------------------------------------------------------------------------------------- - OS_FIND_EXPORT(coreinit_handle, OSGetSecurityLevel); - //!---------------------------------------------------------------------------------------------------------------------------------------------------------------------------- - //! System functions - //!---------------------------------------------------------------------------------------------------------------------------------------------------------------------------- - OS_FIND_EXPORT(coreinit_handle, OSFatal); - OS_FIND_EXPORT(coreinit_handle, OSGetTitleID); - OS_FIND_EXPORT(coreinit_handle, OSGetArgcArgv); - OS_FIND_EXPORT(coreinit_handle, OSSetExceptionCallback); - OS_FIND_EXPORT(coreinit_handle, DCFlushRange); - OS_FIND_EXPORT(coreinit_handle, ICInvalidateRange); - OS_FIND_EXPORT(coreinit_handle, OSEffectiveToPhysical); - OS_FIND_EXPORT(coreinit_handle, __os_snprintf); - OS_FIND_EXPORT(coreinit_handle, __gh_errno_ptr); - - OSDynLoad_FindExport(coreinit_handle, 0, "_Exit", &__Exit); - - OS_FIND_EXPORT(coreinit_handle, OSScreenInit); - OS_FIND_EXPORT(coreinit_handle, OSScreenGetBufferSizeEx); - OS_FIND_EXPORT(coreinit_handle, OSScreenSetBufferEx); - OS_FIND_EXPORT(coreinit_handle, OSScreenClearBufferEx); - OS_FIND_EXPORT(coreinit_handle, OSScreenFlipBuffersEx); - OS_FIND_EXPORT(coreinit_handle, OSScreenPutFontEx); - OS_FIND_EXPORT(coreinit_handle, OSScreenEnableEx); - //!---------------------------------------------------------------------------------------------------------------------------------------------------------------------------- - //! Thread functions - //!---------------------------------------------------------------------------------------------------------------------------------------------------------------------------- - OS_FIND_EXPORT(coreinit_handle, OSCreateThread); - OS_FIND_EXPORT(coreinit_handle, OSResumeThread); - OS_FIND_EXPORT(coreinit_handle, OSSuspendThread); - OS_FIND_EXPORT(coreinit_handle, OSIsThreadTerminated); - OS_FIND_EXPORT(coreinit_handle, OSIsThreadSuspended); - OS_FIND_EXPORT(coreinit_handle, OSJoinThread); - OS_FIND_EXPORT(coreinit_handle, OSSetThreadPriority); - OS_FIND_EXPORT(coreinit_handle, OSDetachThread); - OS_FIND_EXPORT(coreinit_handle, OSSleepTicks); - OS_FIND_EXPORT(coreinit_handle, OSGetTick); - OS_FIND_EXPORT(coreinit_handle, OSGetTime); - OS_FIND_EXPORT(coreinit_handle, OSTicksToCalendarTime); - - //!---------------------------------------------------------------------------------------------------------------------------------------------------------------------------- - //! Mutex functions - //!---------------------------------------------------------------------------------------------------------------------------------------------------------------------------- - OS_FIND_EXPORT(coreinit_handle, OSInitMutex); - OS_FIND_EXPORT(coreinit_handle, OSLockMutex); - OS_FIND_EXPORT(coreinit_handle, OSUnlockMutex); - OS_FIND_EXPORT(coreinit_handle, OSTryLockMutex); - //!---------------------------------------------------------------------------------------------------------------------------------------------------------------------------- - //! MCP functions - //!---------------------------------------------------------------------------------------------------------------------------------------------------------------------------- - OS_FIND_EXPORT(coreinit_handle, MCP_Open); - OS_FIND_EXPORT(coreinit_handle, MCP_Close); - OS_FIND_EXPORT(coreinit_handle, MCP_GetOwnTitleInfo); - - //!---------------------------------------------------------------------------------------------------------------------------------------------------------------------------- - //! Memory functions - //!---------------------------------------------------------------------------------------------------------------------------------------------------------------------------- - OSDynLoad_FindExport(coreinit_handle, 1, "MEMAllocFromDefaultHeapEx", &pMEMAllocFromDefaultHeapEx); - OSDynLoad_FindExport(coreinit_handle, 1, "MEMAllocFromDefaultHeap", &pMEMAllocFromDefaultHeap); - OSDynLoad_FindExport(coreinit_handle, 1, "MEMFreeToDefaultHeap", &pMEMFreeToDefaultHeap); - - OS_FIND_EXPORT(coreinit_handle, MEMGetBaseHeapHandle); - OS_FIND_EXPORT(coreinit_handle, MEMGetAllocatableSizeForFrmHeapEx); - OS_FIND_EXPORT(coreinit_handle, MEMAllocFromFrmHeapEx); - OS_FIND_EXPORT(coreinit_handle, MEMFreeToFrmHeap); - OS_FIND_EXPORT(coreinit_handle, MEMAllocFromExpHeapEx); - OS_FIND_EXPORT(coreinit_handle, MEMCreateExpHeapEx); - OS_FIND_EXPORT(coreinit_handle, MEMDestroyExpHeap); - OS_FIND_EXPORT(coreinit_handle, MEMFreeToExpHeap); - - //!---------------------------------------------------------------------------------------------------------------------------------------------------------------------------- - //! Other function addresses - //!---------------------------------------------------------------------------------------------------------------------------------------------------------------------------- - OS_FIND_EXPORT(coreinit_handle, DCInvalidateRange); - - //!---------------------------------------------------------------------------------------------------------------------------------------------------------------------------- - //! Energy Saver functions - //!---------------------------------------------------------------------------------------------------------------------------------------------------------------------------- - //Burn-in Reduction - OS_FIND_EXPORT(coreinit_handle, IMEnableDim); - OS_FIND_EXPORT(coreinit_handle, IMDisableDim); - OS_FIND_EXPORT(coreinit_handle, IMIsDimEnabled); - //Auto power down - OS_FIND_EXPORT(coreinit_handle, IMEnableAPD); - OS_FIND_EXPORT(coreinit_handle, IMDisableAPD); - OS_FIND_EXPORT(coreinit_handle, IMIsAPDEnabled); - OS_FIND_EXPORT(coreinit_handle, IMIsAPDEnabledBySysSettings); - - //!---------------------------------------------------------------------------------------------------------------------------------------------------------------------------- - //! Special non library functions - //!---------------------------------------------------------------------------------------------------------------------------------------------------------------------------- - if(OS_FIRMWARE == 532 || OS_FIRMWARE == 540) - { - EXPORT_FUNC_WRITE(LiWaitIopComplete, (int (*)(int, int *))0x0100FFA4); // loader.elf - EXPORT_FUNC_WRITE(LiWaitIopCompleteWithInterrupts, (int (*)(int, int *))0x0100FE90); // loader.elf - EXPORT_FUNC_WRITE(addr_LiWaitOneChunk, (int (*)(int, int *))0x010007EC); // loader.elf - EXPORT_FUNC_WRITE(addr_PrepareTitle_hook, (int (*)(int, int *))0xFFF18558); // kernel.elf - - EXPORT_FUNC_WRITE(addr_sgIsLoadingBuffer, (int (*)(int, int *))0xEFE19D00); // loader.elf - EXPORT_FUNC_WRITE(addr_gDynloadInitialized, (int (*)(int, int *))0xEFE13C3C); // loader.elf - } - else if(OS_FIRMWARE == 500 || OS_FIRMWARE == 510) - { - EXPORT_FUNC_WRITE(LiWaitIopComplete, (int (*)(int, int *))0x0100FBC4); - EXPORT_FUNC_WRITE(LiWaitIopCompleteWithInterrupts, (int (*)(int, int *))0x0100FAB0); - EXPORT_FUNC_WRITE(addr_LiWaitOneChunk, (int (*)(int, int *))0x010007EC); - EXPORT_FUNC_WRITE(addr_PrepareTitle_hook, (int (*)(int, int *))0xFFF18534); - - EXPORT_FUNC_WRITE(addr_sgIsLoadingBuffer, (int (*)(int, int *))0xEFE19D00); - EXPORT_FUNC_WRITE(addr_gDynloadInitialized, (int (*)(int, int *))0xEFE13C3C); - } - else if(OS_FIRMWARE == 410) - { - EXPORT_FUNC_WRITE(LiWaitIopComplete, (int (*)(int, int *))0x0100F78C); - EXPORT_FUNC_WRITE(LiWaitIopCompleteWithInterrupts, (int (*)(int, int *))0x0100F678); - EXPORT_FUNC_WRITE(addr_LiWaitOneChunk, (int (*)(int, int *))0x010007F8); - EXPORT_FUNC_WRITE(addr_PrepareTitle_hook, (int (*)(int, int *))0xFFF166DC); - - EXPORT_FUNC_WRITE(addr_sgIsLoadingBuffer, (int (*)(int, int *))0xEFE19CC0); - EXPORT_FUNC_WRITE(addr_gDynloadInitialized, (int (*)(int, int *))0xEFE13BFC); - } - else if(OS_FIRMWARE == 400) //same for 402 and 403 - { - EXPORT_FUNC_WRITE(LiWaitIopComplete, (int (*)(int, int *))0x0100F78C); - EXPORT_FUNC_WRITE(LiWaitIopCompleteWithInterrupts, (int (*)(int, int *))0x0100F678); - EXPORT_FUNC_WRITE(addr_LiWaitOneChunk, (int (*)(int, int *))0x010007F8); - EXPORT_FUNC_WRITE(addr_PrepareTitle_hook, (int (*)(int, int *))0xFFF15E70); - - EXPORT_FUNC_WRITE(addr_sgIsLoadingBuffer, (int (*)(int, int *))0xEFE19CC0); - EXPORT_FUNC_WRITE(addr_gDynloadInitialized, (int (*)(int, int *))0xEFE13BFC); - } - else if(OS_FIRMWARE == 550) - { - EXPORT_FUNC_WRITE(LiWaitIopComplete, (int (*)(int, int *))0x01010180); - EXPORT_FUNC_WRITE(LiWaitIopCompleteWithInterrupts, (int (*)(int, int *))0x0101006C); - EXPORT_FUNC_WRITE(addr_LiWaitOneChunk, (int (*)(int, int *))0x0100080C); - EXPORT_FUNC_WRITE(addr_PrepareTitle_hook, (int (*)(int, int *))0xFFF184E4); - - EXPORT_FUNC_WRITE(addr_sgIsLoadingBuffer, (int (*)(int, int *))0xEFE19E80); - EXPORT_FUNC_WRITE(addr_gDynloadInitialized, (int (*)(int, int *))0xEFE13DBC); - } - else if(OS_FIRMWARE == 310) - { - EXPORT_FUNC_WRITE(LiWaitIopComplete, (int (*)(int, int *))0x0100C4E4); - EXPORT_FUNC_WRITE(LiWaitIopCompleteWithInterrupts, (int (*)(int, int *))0x0100C3D4); - EXPORT_FUNC_WRITE(addr_LiWaitOneChunk, (int (*)(int, int *))0x010004D8); - EXPORT_FUNC_WRITE(addr_PrepareTitle_hook, (int (*)(int, int *))0xFFF15A0C); - - EXPORT_FUNC_WRITE(addr_sgIsLoadingBuffer, (int (*)(int, int *))0xEFE19340); - EXPORT_FUNC_WRITE(addr_gDynloadInitialized, (int (*)(int, int *))0xEFE1329C); - } - else if(OS_FIRMWARE == 300) - { - EXPORT_FUNC_WRITE(LiWaitIopComplete, (int (*)(int, int *))0x0100C4E4); - EXPORT_FUNC_WRITE(LiWaitIopCompleteWithInterrupts, (int (*)(int, int *))0x0100C3D4); - EXPORT_FUNC_WRITE(addr_LiWaitOneChunk, (int (*)(int, int *))0x010004D8); - EXPORT_FUNC_WRITE(addr_PrepareTitle_hook, (int (*)(int, int *))0xFFF15974); - - EXPORT_FUNC_WRITE(addr_sgIsLoadingBuffer, (int (*)(int, int *))0xEFE19340); - EXPORT_FUNC_WRITE(addr_gDynloadInitialized, (int (*)(int, int *))0xEFE1329C); - } - else - { - OSFatal("Missing all OS specific addresses."); - } -} diff --git a/src/dynamic_libs/os_functions.h b/src/dynamic_libs/os_functions.h deleted file mode 100644 index 347da67..0000000 --- a/src/dynamic_libs/os_functions.h +++ /dev/null @@ -1,174 +0,0 @@ -/**************************************************************************** - * Copyright (C) 2015 - * by Dimok - * - * This software is provided 'as-is', without any express or implied - * warranty. In no event will the authors be held liable for any - * damages arising from the use of this software. - * - * Permission is granted to anyone to use this software for any - * purpose, including commercial applications, and to alter it and - * redistribute it freely, subject to the following restrictions: - * - * 1. The origin of this software must not be misrepresented; you - * must not claim that you wrote the original software. If you use - * this software in a product, an acknowledgment in the product - * documentation would be appreciated but is not required. - * - * 2. Altered source versions must be plainly marked as such, and - * must not be misrepresented as being the original software. - * - * 3. This notice may not be removed or altered from any source - * distribution. - ***************************************************************************/ -#ifndef __OS_FUNCTIONS_H_ -#define __OS_FUNCTIONS_H_ - -#include -#include "common/os_defs.h" -#include "os_types.h" - -#ifdef __cplusplus -extern "C" { -#endif - -#define BUS_SPEED 248625000 -#define SECS_TO_TICKS(sec) (((unsigned long long)(sec)) * (BUS_SPEED/4)) -#define MILLISECS_TO_TICKS(msec) (SECS_TO_TICKS(msec) / 1000) -#define MICROSECS_TO_TICKS(usec) (SECS_TO_TICKS(usec) / 1000000) - -#define usleep(usecs) OSSleepTicks(MICROSECS_TO_TICKS(usecs)) -#define sleep(secs) OSSleepTicks(SECS_TO_TICKS(secs)) - -#define FLUSH_DATA_BLOCK(addr) asm volatile("dcbf 0, %0; sync" : : "r"(((addr) & ~31))) -#define INVAL_DATA_BLOCK(addr) asm volatile("dcbi 0, %0; sync" : : "r"(((addr) & ~31))) - -#define EXPORT_DECL(res, func, ...) res (* func)(__VA_ARGS__) __attribute__((section(".data"))) = 0; -#define EXPORT_VAR(type, var) type var __attribute__((section(".data"))); - - -#define EXPORT_FUNC_WRITE(func, val) *(u32*)(((u32)&func) + 0) = (u32)val - -#define OS_FIND_EXPORT(handle, func) funcPointer = 0; \ - OSDynLoad_FindExport(handle, 0, # func, &funcPointer); \ - if(!funcPointer) \ - OSFatal("Function " # func " is NULL"); \ - EXPORT_FUNC_WRITE(func, funcPointer); - -#define OS_FIND_EXPORT_EX(handle, func, func_p) \ - funcPointer = 0; \ - OSDynLoad_FindExport(handle, 0, # func, &funcPointer); \ - if(!funcPointer) \ - OSFatal("Function " # func " is NULL"); \ - EXPORT_FUNC_WRITE(func_p, funcPointer); - -#define OS_MUTEX_SIZE 44 - -/* Handle for coreinit */ -extern unsigned int coreinit_handle; -void InitOSFunctionPointers(void); -void InitAcquireOS(void); - -//!---------------------------------------------------------------------------------------------------------------------------------------------------------------------------- -//! Lib handle functions -//!---------------------------------------------------------------------------------------------------------------------------------------------------------------------------- -extern int (* OSDynLoad_Acquire)(const char* rpl, u32 *handle); -extern int (* OSDynLoad_FindExport)(u32 handle, int isdata, const char *symbol, void *address); - -//!---------------------------------------------------------------------------------------------------------------------------------------------------------------------------- -//! Security functions -//!---------------------------------------------------------------------------------------------------------------------------------------------------------------------------- -extern int (* OSGetSecurityLevel)(void); - -//!---------------------------------------------------------------------------------------------------------------------------------------------------------------------------- -//! Thread functions -//!---------------------------------------------------------------------------------------------------------------------------------------------------------------------------- -extern int (* OSCreateThread)(void *thread, s32 (*callback)(s32, void*), s32 argc, void *args, u32 stack, u32 stack_size, s32 priority, u32 attr); -extern int (* OSResumeThread)(void *thread); -extern int (* OSSuspendThread)(void *thread); -extern int (* OSIsThreadTerminated)(void *thread); -extern int (* OSIsThreadSuspended)(void *thread); -extern int (* OSJoinThread)(void * thread, int * ret_val); -extern int (* OSSetThreadPriority)(void * thread, int priority); -extern void (* OSDetachThread)(void * thread); -extern void (* OSSleepTicks)(u64 ticks); -extern u64 (* OSGetTick)(void); -extern u64 (* OSGetTime)(void); -extern void (*OSTicksToCalendarTime)(u64 time, OSCalendarTime *calendarTime); - -//!---------------------------------------------------------------------------------------------------------------------------------------------------------------------------- -//! Mutex functions -//!---------------------------------------------------------------------------------------------------------------------------------------------------------------------------- -extern void (* OSInitMutex)(void* mutex); -extern void (* OSLockMutex)(void* mutex); -extern void (* OSUnlockMutex)(void* mutex); -extern int (* OSTryLockMutex)(void* mutex); - -//!---------------------------------------------------------------------------------------------------------------------------------------------------------------------------- -//! System functions -//!---------------------------------------------------------------------------------------------------------------------------------------------------------------------------- -extern u64 (* OSGetTitleID)(void); -extern void (* OSGetArgcArgv)(int* argc, char*** argv); -extern void (* __Exit)(void); -extern void (* OSFatal)(const char* msg); -extern void (* DCFlushRange)(const void *addr, u32 length); -extern void (* ICInvalidateRange)(const void *addr, u32 length); -extern void* (* OSEffectiveToPhysical)(const void*); -extern int (* __os_snprintf)(char* s, int n, const char * format, ...); -extern int * (* __gh_errno_ptr)(void); - -extern void (*OSScreenInit)(void); -extern unsigned int (*OSScreenGetBufferSizeEx)(unsigned int bufferNum); -extern int (*OSScreenSetBufferEx)(unsigned int bufferNum, void * addr); -extern int (*OSScreenClearBufferEx)(unsigned int bufferNum, unsigned int temp); -extern int (*OSScreenFlipBuffersEx)(unsigned int bufferNum); -extern int (*OSScreenPutFontEx)(unsigned int bufferNum, unsigned int posX, unsigned int posY, const char * buffer); -extern int (*OSScreenEnableEx)(unsigned int bufferNum, int enable); - -typedef unsigned char (*exception_callback)(void * interruptedContext); -extern void (* OSSetExceptionCallback)(u8 exceptionType, exception_callback newCallback); - -//!---------------------------------------------------------------------------------------------------------------------------------------------------------------------------- -//! MCP functions -//!---------------------------------------------------------------------------------------------------------------------------------------------------------------------------- -extern int (* MCP_Open)(void); -extern int (* MCP_Close)(int handle); -extern int (* MCP_GetOwnTitleInfo)(int handle, void * data); - -//!---------------------------------------------------------------------------------------------------------------------------------------------------------------------------- -//! LOADER functions -//!---------------------------------------------------------------------------------------------------------------------------------------------------------------------------- -extern int (* LiWaitIopComplete)(int unknown_syscall_arg_r3, int * remaining_bytes); -extern int (* LiWaitIopCompleteWithInterrupts)(int unknown_syscall_arg_r3, int * remaining_bytes); -extern void (* addr_LiWaitOneChunk)(void); -extern void (* addr_sgIsLoadingBuffer)(void); -extern void (* addr_gDynloadInitialized)(void); - -//!---------------------------------------------------------------------------------------------------------------------------------------------------------------------------- -//! Kernel function addresses -//!---------------------------------------------------------------------------------------------------------------------------------------------------------------------------- -extern void (* addr_PrepareTitle_hook)(void); - -//!---------------------------------------------------------------------------------------------------------------------------------------------------------------------------- -//! Other function addresses -//!---------------------------------------------------------------------------------------------------------------------------------------------------------------------------- -extern void (*DCInvalidateRange)(void *buffer, uint32_t length); - -//!---------------------------------------------------------------------------------------------------------------------------------------------------------------------------- -//! Energy Saver functions -//!---------------------------------------------------------------------------------------------------------------------------------------------------------------------------- -////Burn-in Reduction -extern int (*IMEnableDim)(void); -extern int (*IMDisableDim)(void); -extern int (*IMIsDimEnabled)(int * result); -//Auto power down -extern int (*IMEnableAPD)(void); -extern int (*IMDisableAPD)(void); -extern int (*IMIsAPDEnabled)(int * result); -extern int (*IMIsAPDEnabledBySysSettings)(int * result); - -#ifdef __cplusplus -} -#endif - -#endif // __OS_FUNCTIONS_H_ diff --git a/src/dynamic_libs/os_types.h b/src/dynamic_libs/os_types.h deleted file mode 100644 index aaa18fe..0000000 --- a/src/dynamic_libs/os_types.h +++ /dev/null @@ -1,27 +0,0 @@ -#ifndef _OS_TYPES_H_ -#define _OS_TYPES_H_ - -#ifdef __cplusplus -extern "C" { -#endif - -#include - -typedef struct _OSCalendarTime { - int sec; - int min; - int hour; - int mday; - int mon; - int year; - int wday; - int yday; - int msec; - int usec; -} OSCalendarTime; - -#ifdef __cplusplus -} -#endif - -#endif diff --git a/src/dynamic_libs/padscore_functions.c b/src/dynamic_libs/padscore_functions.c index f7ca8e9..698ef63 100644 --- a/src/dynamic_libs/padscore_functions.c +++ b/src/dynamic_libs/padscore_functions.c @@ -21,41 +21,30 @@ * 3. This notice may not be removed or altered from any source * distribution. ***************************************************************************/ -#include "os_functions.h" +#include "exports.h" #include "padscore_functions.h" -unsigned int padscore_handle __attribute__((section(".data"))) = 0; - EXPORT_DECL(void, KPADInit, void); -EXPORT_DECL(void, WPADInit, void); EXPORT_DECL(s32, WPADProbe, s32 chan, u32 * pad_type); EXPORT_DECL(s32, WPADSetDataFormat, s32 chan, s32 format); EXPORT_DECL(void, WPADEnableURCC, s32 enable); EXPORT_DECL(void, WPADRead, s32 chan, void * data); EXPORT_DECL(s32, KPADRead, s32 chan, void * data, u32 size); -EXPORT_DECL(void,WPADSetAutoSleepTime,u8 minute); -EXPORT_DECL(void,WPADDisconnect,s32 chan); - -void InitAcquirePadScore(void) -{ - OSDynLoad_Acquire("padscore.rpl", &padscore_handle); -} void InitPadScoreFunctionPointers(void) { unsigned int *funcPointer = 0; - InitAcquirePadScore(); + OSDynLoadModule padscore_handle; + OSDynLoad_Acquire("padscore.rpl", &padscore_handle); - OS_FIND_EXPORT(padscore_handle, WPADInit); OS_FIND_EXPORT(padscore_handle, KPADInit); OS_FIND_EXPORT(padscore_handle, WPADProbe); OS_FIND_EXPORT(padscore_handle, WPADSetDataFormat); OS_FIND_EXPORT(padscore_handle, WPADEnableURCC); OS_FIND_EXPORT(padscore_handle, WPADRead); OS_FIND_EXPORT(padscore_handle, KPADRead); - OS_FIND_EXPORT(padscore_handle, WPADSetAutoSleepTime); - OS_FIND_EXPORT(padscore_handle, WPADDisconnect); KPADInit(); WPADEnableURCC(1); } + diff --git a/src/dynamic_libs/padscore_functions.h b/src/dynamic_libs/padscore_functions.h index 5b000b1..68cf989 100644 --- a/src/dynamic_libs/padscore_functions.h +++ b/src/dynamic_libs/padscore_functions.h @@ -28,11 +28,7 @@ extern "C" { #endif -#include "dynamic_libs/vpad_functions.h" - -extern unsigned int padscore_handle; - -#include +#include "common/types.h" #define WPAD_BUTTON_LEFT 0x0001 #define WPAD_BUTTON_RIGHT 0x0002 @@ -64,34 +60,8 @@ extern unsigned int padscore_handle; #define WPAD_CLASSIC_BUTTON_DOWN 0x4000 #define WPAD_CLASSIC_BUTTON_RIGHT 0x8000 -#define WPAD_PRO_BUTTON_UP 0x00000001 -#define WPAD_PRO_BUTTON_LEFT 0x00000002 -#define WPAD_PRO_TRIGGER_ZR 0x00000004 -#define WPAD_PRO_BUTTON_X 0x00000008 -#define WPAD_PRO_BUTTON_A 0x00000010 -#define WPAD_PRO_BUTTON_Y 0x00000020 -#define WPAD_PRO_BUTTON_B 0x00000040 -#define WPAD_PRO_TRIGGER_ZL 0x00000080 -#define WPAD_PRO_RESERVED 0x00000100 -#define WPAD_PRO_TRIGGER_R 0x00000200 -#define WPAD_PRO_BUTTON_PLUS 0x00000400 -#define WPAD_PRO_BUTTON_HOME 0x00000800 -#define WPAD_PRO_BUTTON_MINUS 0x00001000 -#define WPAD_PRO_TRIGGER_L 0x00002000 -#define WPAD_PRO_BUTTON_DOWN 0x00004000 -#define WPAD_PRO_BUTTON_RIGHT 0x00008000 -#define WPAD_PRO_BUTTON_STICK_R 0x00010000 -#define WPAD_PRO_BUTTON_STICK_L 0x00020000 +void InitPadScoreFunctionPointers(void); -#define WPAD_PRO_STICK_L_EMULATION_UP 0x00200000 -#define WPAD_PRO_STICK_L_EMULATION_DOWN 0x00100000 -#define WPAD_PRO_STICK_L_EMULATION_LEFT 0x00040000 -#define WPAD_PRO_STICK_L_EMULATION_RIGHT 0x00080000 - -#define WPAD_PRO_STICK_R_EMULATION_UP 0x02000000 -#define WPAD_PRO_STICK_R_EMULATION_DOWN 0x01000000 -#define WPAD_PRO_STICK_R_EMULATION_LEFT 0x00400000 -#define WPAD_PRO_STICK_R_EMULATION_RIGHT 0x00800000 typedef struct _KPADData { @@ -108,7 +78,7 @@ typedef struct _KPADData u8 device_type; u8 wpad_error; u8 pos_valid; - u8 format; + u8 unused_4[1]; union { @@ -131,38 +101,19 @@ typedef struct _KPADData f32 rtrigger; } classic; - struct - { - u32 btns_h; - u32 btns_d; - u32 btns_r; - f32 lstick_x; - f32 lstick_y; - f32 rstick_x; - f32 rstick_y; - int charging; - int wired; - } pro; - u32 unused_6[20]; }; u32 unused_7[16]; } KPADData; -void InitPadScoreFunctionPointers(void); -void InitAcquirePadScore(void); typedef void (* wpad_connect_callback_t)(s32 chan, s32 status); extern void (* KPADInit)(void); -extern void (* WPADInit)(void); extern s32 (* WPADProbe)(s32 chan, u32 * pad_type); extern s32 (* WPADSetDataFormat)(s32 chan, s32 format); extern void (* WPADEnableURCC)(s32 enable); extern void (* WPADRead)(s32 chan, void * data); extern s32 (* KPADRead)(s32 chan, void * data, u32 size); -extern s32 (* KPADReadEx)(s32 chan, KPADData * data, u32 size, s32 *error); -extern void (*WPADSetAutoSleepTime)(u8 time); -extern void (*WPADDisconnect)( s32 chan ); #ifdef __cplusplus } diff --git a/src/dynamic_libs/socket_functions.c b/src/dynamic_libs/socket_functions.c deleted file mode 100644 index de2c31f..0000000 --- a/src/dynamic_libs/socket_functions.c +++ /dev/null @@ -1,81 +0,0 @@ -/**************************************************************************** - * Copyright (C) 2015 - * by Dimok - * - * This software is provided 'as-is', without any express or implied - * warranty. In no event will the authors be held liable for any - * damages arising from the use of this software. - * - * Permission is granted to anyone to use this software for any - * purpose, including commercial applications, and to alter it and - * redistribute it freely, subject to the following restrictions: - * - * 1. The origin of this software must not be misrepresented; you - * must not claim that you wrote the original software. If you use - * this software in a product, an acknowledgment in the product - * documentation would be appreciated but is not required. - * - * 2. Altered source versions must be plainly marked as such, and - * must not be misrepresented as being the original software. - * - * 3. This notice may not be removed or altered from any source - * distribution. - ***************************************************************************/ -#include "os_functions.h" -#include "socket_functions.h" - -u32 hostIpAddress = 0; - -unsigned int nsysnet_handle __attribute__((section(".data"))) = 0; - -EXPORT_DECL(void, socket_lib_init, void); -EXPORT_DECL(int, socket, int domain, int type, int protocol); -EXPORT_DECL(int, socketclose, int s); -EXPORT_DECL(int, connect, int s, void *addr, int addrlen); -EXPORT_DECL(int, bind, s32 s,struct sockaddr *name,s32 namelen); -EXPORT_DECL(int, listen, s32 s,u32 backlog); -EXPORT_DECL(int, accept, s32 s,struct sockaddr *addr,s32 *addrlen); -EXPORT_DECL(int, send, int s, const void *buffer, int size, int flags); -EXPORT_DECL(int, recv, int s, void *buffer, int size, int flags); -EXPORT_DECL(int, recvfrom,int sockfd, void *buf, int len, int flags,struct sockaddr *src_addr, int *addrlen); -EXPORT_DECL(int, sendto, int s, const void *buffer, int size, int flags, const struct sockaddr *dest, int dest_len); -EXPORT_DECL(int, setsockopt, int s, int level, int optname, void *optval, int optlen); -EXPORT_DECL(char *, inet_ntoa, struct in_addr in); -EXPORT_DECL(int, inet_aton, const char *cp, struct in_addr *inp); - -EXPORT_DECL(int, NSSLWrite, int connection, const void* buf, int len,int * written); -EXPORT_DECL(int, NSSLRead, int connection, const void* buf, int len,int * read); -EXPORT_DECL(int, NSSLCreateConnection, int context, const char* host, int hotlen,int options,int sock,int block); - -void InitAcquireSocket(void) -{ - OSDynLoad_Acquire("nsysnet.rpl", &nsysnet_handle); -} - -void InitSocketFunctionPointers(void) -{ - unsigned int *funcPointer = 0; - - InitAcquireSocket(); - - OS_FIND_EXPORT(nsysnet_handle, socket_lib_init); - OS_FIND_EXPORT(nsysnet_handle, socket); - OS_FIND_EXPORT(nsysnet_handle, socketclose); - OS_FIND_EXPORT(nsysnet_handle, connect); - OS_FIND_EXPORT(nsysnet_handle, bind); - OS_FIND_EXPORT(nsysnet_handle, listen); - OS_FIND_EXPORT(nsysnet_handle, accept); - OS_FIND_EXPORT(nsysnet_handle, send); - OS_FIND_EXPORT(nsysnet_handle, recv); - OS_FIND_EXPORT(nsysnet_handle, recvfrom); - OS_FIND_EXPORT(nsysnet_handle, sendto); - OS_FIND_EXPORT(nsysnet_handle, setsockopt); - OS_FIND_EXPORT(nsysnet_handle, inet_ntoa); - OS_FIND_EXPORT(nsysnet_handle, inet_aton); - - OS_FIND_EXPORT(nsysnet_handle, NSSLWrite); - OS_FIND_EXPORT(nsysnet_handle, NSSLRead); - OS_FIND_EXPORT(nsysnet_handle, NSSLCreateConnection); - - socket_lib_init(); -} diff --git a/src/dynamic_libs/socket_functions.h b/src/dynamic_libs/socket_functions.h deleted file mode 100644 index 1e4df1a..0000000 --- a/src/dynamic_libs/socket_functions.h +++ /dev/null @@ -1,108 +0,0 @@ -/**************************************************************************** - * Copyright (C) 2015 - * by Dimok - * - * This software is provided 'as-is', without any express or implied - * warranty. In no event will the authors be held liable for any - * damages arising from the use of this software. - * - * Permission is granted to anyone to use this software for any - * purpose, including commercial applications, and to alter it and - * redistribute it freely, subject to the following restrictions: - * - * 1. The origin of this software must not be misrepresented; you - * must not claim that you wrote the original software. If you use - * this software in a product, an acknowledgment in the product - * documentation would be appreciated but is not required. - * - * 2. Altered source versions must be plainly marked as such, and - * must not be misrepresented as being the original software. - * - * 3. This notice may not be removed or altered from any source - * distribution. - ***************************************************************************/ -#ifndef __SOCKET_FUNCTIONS_H_ -#define __SOCKET_FUNCTIONS_H_ - -#ifdef __cplusplus -extern "C" { -#endif - -extern unsigned int nsysnet_handle; - -#include - -#define INADDR_ANY 0 - -#define AF_INET 2 - -#define SOCK_STREAM 1 -#define SOCK_DGRAM 2 - -#define IPPROTO_IP 0 -#define IPPROTO_TCP 6 -#define IPPROTO_UDP 17 - -#define TCP_NODELAY 0x2004 - -#define SOL_SOCKET -1 -#define SO_REUSEADDR 0x0004 -#define SO_NONBLOCK 0x1016 -#define SO_MYADDR 0x1013 -#define SO_RCVTIMEO 0x1006 - -#define SOL_SOCKET -1 -#define MSG_DONTWAIT 32 - -#define htonl(x) x -#define htons(x) x -#define ntohl(x) x -#define ntohs(x) x - - -struct in_addr { - unsigned int s_addr; -}; -struct sockaddr_in { - short sin_family; - unsigned short sin_port; - struct in_addr sin_addr; - char sin_zero[8]; -}; - -struct sockaddr -{ - unsigned short sa_family; - char sa_data[14]; -}; - - -void InitSocketFunctionPointers(void); -void InitAcquireSocket(void); - -extern void (*socket_lib_init)(void); -extern int (*socket)(int domain, int type, int protocol); -extern int (*socketclose)(int s); -extern int (*connect)(int s, void *addr, int addrlen); -extern int (*bind)(s32 s,struct sockaddr *name,s32 namelen); -extern int (*listen)(s32 s,u32 backlog); -extern int (*accept)(s32 s,struct sockaddr *addr,s32 *addrlen); -extern int (*send)(int s, const void *buffer, int size, int flags); -extern int (*recv)(int s, void *buffer, int size, int flags); -extern int (*recvfrom)(int sockfd, void *buf, int len, int flags,struct sockaddr *src_addr, int *addrlen); - -extern int (*sendto)(int s, const void *buffer, int size, int flags, const struct sockaddr *dest, int dest_len); -extern int (*setsockopt)(int s, int level, int optname, void *optval, int optlen); - -extern int (* NSSLWrite)(int connection, const void* buf, int len,int * written); -extern int (* NSSLRead)(int connection, const void* buf, int len,int * read); -extern int (* NSSLCreateConnection)(int context, const char* host, int hotlen,int options,int sock,int block); - -extern char * (*inet_ntoa)(struct in_addr in); -extern int (*inet_aton)(const char *cp, struct in_addr *inp); - -#ifdef __cplusplus -} -#endif - -#endif // __SOCKET_FUNCTIONS_H_ diff --git a/src/dynamic_libs/sys_functions.c b/src/dynamic_libs/sys_functions.c deleted file mode 100644 index c054549..0000000 --- a/src/dynamic_libs/sys_functions.c +++ /dev/null @@ -1,49 +0,0 @@ -/**************************************************************************** - * Copyright (C) 2015 - * by Dimok - * - * This software is provided 'as-is', without any express or implied - * warranty. In no event will the authors be held liable for any - * damages arising from the use of this software. - * - * Permission is granted to anyone to use this software for any - * purpose, including commercial applications, and to alter it and - * redistribute it freely, subject to the following restrictions: - * - * 1. The origin of this software must not be misrepresented; you - * must not claim that you wrote the original software. If you use - * this software in a product, an acknowledgment in the product - * documentation would be appreciated but is not required. - * - * 2. Altered source versions must be plainly marked as such, and - * must not be misrepresented as being the original software. - * - * 3. This notice may not be removed or altered from any source - * distribution. - ***************************************************************************/ -#include "os_functions.h" - - unsigned int sysapp_handle __attribute__((section(".data"))) = 0; - -EXPORT_DECL(int, _SYSLaunchTitleByPathFromLauncher, const char* path, int len, int zero); -EXPORT_DECL(int, SYSRelaunchTitle, int argc, char** argv); -EXPORT_DECL(int, SYSLaunchMenu, void); -EXPORT_DECL(int, SYSCheckTitleExists, u64 titleId); -EXPORT_DECL(int, SYSLaunchTitle, u64 titleId); - -void InitAcquireSys(void) -{ - OSDynLoad_Acquire("sysapp.rpl", &sysapp_handle); -} - -void InitSysFunctionPointers(void) -{ - unsigned int *funcPointer = 0; - InitAcquireSys(); - - OS_FIND_EXPORT(sysapp_handle, _SYSLaunchTitleByPathFromLauncher); - OS_FIND_EXPORT(sysapp_handle, SYSRelaunchTitle); - OS_FIND_EXPORT(sysapp_handle, SYSLaunchMenu); - OS_FIND_EXPORT(sysapp_handle, SYSCheckTitleExists); - OS_FIND_EXPORT(sysapp_handle, SYSLaunchTitle); -} diff --git a/src/dynamic_libs/sys_functions.h b/src/dynamic_libs/sys_functions.h deleted file mode 100644 index 08ca21b..0000000 --- a/src/dynamic_libs/sys_functions.h +++ /dev/null @@ -1,47 +0,0 @@ -/**************************************************************************** - * Copyright (C) 2015 - * by Dimok - * - * This software is provided 'as-is', without any express or implied - * warranty. In no event will the authors be held liable for any - * damages arising from the use of this software. - * - * Permission is granted to anyone to use this software for any - * purpose, including commercial applications, and to alter it and - * redistribute it freely, subject to the following restrictions: - * - * 1. The origin of this software must not be misrepresented; you - * must not claim that you wrote the original software. If you use - * this software in a product, an acknowledgment in the product - * documentation would be appreciated but is not required. - * - * 2. Altered source versions must be plainly marked as such, and - * must not be misrepresented as being the original software. - * - * 3. This notice may not be removed or altered from any source - * distribution. - ***************************************************************************/ -#ifndef __SYS_FUNCTIONS_H_ -#define __SYS_FUNCTIONS_H_ - -#ifdef __cplusplus -extern "C" { -#endif - -extern unsigned int sysapp_handle; - -void InitSysFunctionPointers(void); -void InitAcquireSys(void); - -extern int(*_SYSLaunchTitleByPathFromLauncher)(const char* path, int len, int zero); -extern int (* SYSRelaunchTitle)(int argc, char** argv); -extern int (* SYSLaunchMenu)(void); -extern int (* SYSCheckTitleExists)(u64 titleId); -extern int (* SYSLaunchTitle)(u64 titleId); - - -#ifdef __cplusplus -} -#endif - -#endif // __SYS_FUNCTIONS_H_ diff --git a/src/dynamic_libs/syshid_functions.c b/src/dynamic_libs/syshid_functions.c deleted file mode 100644 index 996d39d..0000000 --- a/src/dynamic_libs/syshid_functions.c +++ /dev/null @@ -1,78 +0,0 @@ -/**************************************************************************** - * Copyright (C) 2015 - * by Dimok - * - * This software is provided 'as-is', without any express or implied - * warranty. In no event will the authors be held liable for any - * damages arising from the use of this software. - * - * Permission is granted to anyone to use this software for any - * purpose, including commercial applications, and to alter it and - * redistribute it freely, subject to the following restrictions: - * - * 1. The origin of this software must not be misrepresented; you - * must not claim that you wrote the original software. If you use - * this software in a product, an acknowledgment in the product - * documentation would be appreciated but is not required. - * - * 2. Altered source versions must be plainly marked as such, and - * must not be misrepresented as being the original software. - * - * 3. This notice may not be removed or altered from any source - * distribution. - ***************************************************************************/ -#include "os_functions.h" -#include "syshid_functions.h" - -unsigned int syshid_handle __attribute__((section(".data"))) = 0; - -EXPORT_DECL(int, HIDSetup,void); -EXPORT_DECL(int, HIDTeardown,void); - -EXPORT_DECL(int, HIDAddClient,HIDClient *p_client, HIDAttachCallback attach_callback); -EXPORT_DECL(int, HIDDelClient,HIDClient *p_client); - -EXPORT_DECL(int, HIDGetDescriptor,unsigned int handle,u8 descriptor_type,u8 descriptor_index, u16 language_id, unsigned char *p_buffer, unsigned int buffer_length, HIDCallback hc, void *p_user); -EXPORT_DECL(int, HIDSetDescriptor,unsigned int handle,u8 descriptor_type,u8 descriptor_index, u16 language_id, unsigned char *p_buffer, unsigned int buffer_length, HIDCallback hc, void *p_user); - -EXPORT_DECL(int, HIDSetProtocol,unsigned int handle,u8 interface_index,u8 protocol, HIDCallback hc, void *p_user); -EXPORT_DECL(int, HIDGetProtocol,unsigned int handle,u8 interface_index,u8 * protocol, HIDCallback hc, void *p_user); - -EXPORT_DECL(int, HIDGetReport,u32 handle, u8 report_type, u8 report_id, u8 *p_buffer, u32 buffer_length, HIDCallback hc, void *p_user); -EXPORT_DECL(int, HIDSetReport,u32 handle, u8 report_type, u8 report_id, u8 *p_buffer, u32 buffer_length, HIDCallback hc, void *p_user); - -EXPORT_DECL(int, HIDSetIdle,unsigned int handle, u8 interface_index,u8 duration, HIDCallback hc, void *p_user); - -EXPORT_DECL(int, HIDRead,unsigned int handle, unsigned char *p_buffer, unsigned int buffer_length, HIDCallback hc, void *p_user); -EXPORT_DECL(int, HIDWrite,unsigned int handle, unsigned char *p_buffer, unsigned int buffer_length, HIDCallback hc, void *p_user); - -void InitAcquireSysHID(void) -{ - OSDynLoad_Acquire("nsyshid.rpl", &syshid_handle); -} - -void InitSysHIDFunctionPointers(void) -{ - InitAcquireSysHID(); - - if(syshid_handle == 0){ - return; - } - - unsigned int funcPointer = 0; - - //! assigning those is not mandatory and it does not always work to load them - OS_FIND_EXPORT(syshid_handle, HIDSetup); - OS_FIND_EXPORT(syshid_handle, HIDTeardown); - OS_FIND_EXPORT(syshid_handle, HIDAddClient); - OS_FIND_EXPORT(syshid_handle, HIDDelClient); - OS_FIND_EXPORT(syshid_handle, HIDGetDescriptor); - OS_FIND_EXPORT(syshid_handle, HIDSetDescriptor); - OS_FIND_EXPORT(syshid_handle, HIDRead); - OS_FIND_EXPORT(syshid_handle, HIDWrite); - OS_FIND_EXPORT(syshid_handle, HIDSetProtocol); - OS_FIND_EXPORT(syshid_handle, HIDGetProtocol); - OS_FIND_EXPORT(syshid_handle, HIDSetIdle); - OS_FIND_EXPORT(syshid_handle, HIDGetReport); - OS_FIND_EXPORT(syshid_handle, HIDSetReport); -} diff --git a/src/dynamic_libs/syshid_functions.h b/src/dynamic_libs/syshid_functions.h deleted file mode 100644 index 08213b4..0000000 --- a/src/dynamic_libs/syshid_functions.h +++ /dev/null @@ -1,90 +0,0 @@ -/**************************************************************************** - * Copyright (C) 2015 - * by Dimok - * - * This software is provided 'as-is', without any express or implied - * warranty. In no event will the authors be held liable for any - * damages arising from the use of this software. - * - * Permission is granted to anyone to use this software for any - * purpose, including commercial applications, and to alter it and - * redistribute it freely, subject to the following restrictions: - * - * 1. The origin of this software must not be misrepresented; you - * must not claim that you wrote the original software. If you use - * this software in a product, an acknowledgment in the product - * documentation would be appreciated but is not required. - * - * 2. Altered source versions must be plainly marked as such, and - * must not be misrepresented as being the original software. - * - * 3. This notice may not be removed or altered from any source - * distribution. - ***************************************************************************/ -#ifndef __SYSHID_FUNCTIONS_H_ -#define __SYSHID_FUNCTIONS_H_ - -#ifdef __cplusplus -extern "C" { -#endif - -extern unsigned int syshid_handle; - -typedef struct -{ - unsigned int handle; - unsigned int physical_device_inst; - unsigned short vid; - unsigned short pid; - unsigned char interface_index; - unsigned char sub_class; - unsigned char protocol; - - unsigned short max_packet_size_rx; - unsigned short max_packet_size_tx; - -} HIDDevice; - -typedef struct _HIDClient HIDClient; - -#define HID_DEVICE_DETACH 0 -#define HID_DEVICE_ATTACH 1 - -typedef int (*HIDAttachCallback)(HIDClient *p_hc,HIDDevice *p_hd,unsigned int attach); - -struct _HIDClient -{ - HIDClient *next; - HIDAttachCallback attach_cb; -}; - -typedef void (*HIDCallback)(unsigned int handle,int error,unsigned char *p_buffer,unsigned int bytes_transferred,void *p_user); - -void InitSysHIDFunctionPointers(void); -void InitAcquireSysHID(void); - -extern int(*HIDSetup)(void); -extern int(*HIDTeardown)(void); - -extern int(*HIDAddClient)(HIDClient *p_client, HIDAttachCallback attach_callback); -extern int(*HIDDelClient)(HIDClient *p_client); - -extern int(*HIDGetDescriptor)(unsigned int handle,u8 descriptor_type,u8 descriptor_index, u16 language_id, unsigned char *p_buffer, unsigned int buffer_length, HIDCallback hc, void *p_user); -extern int(*HIDSetDescriptor)(unsigned int handle,u8 descriptor_type,u8 descriptor_index, u16 language_id, unsigned char *p_buffer, unsigned int buffer_length, HIDCallback hc, void *p_user); - -extern int(*HIDGetReport)(u32 handle, u8 report_type, u8 report_id, u8 *p_buffer, u32 buffer_length, HIDCallback hc, void *p_user); -extern int(*HIDSetReport)(u32 handle, u8 report_type, u8 report_id, u8 *p_buffer, u32 buffer_length, HIDCallback hc, void *p_user); - -extern int(*HIDSetIdle)(unsigned int handle, u8 interface_index,u8 duration, HIDCallback hc, void *p_user); - -extern int(* HIDSetProtocol)(unsigned int handle,u8 interface_index,u8 protocol, HIDCallback hc, void *p_user); -extern int(* HIDGetProtocol)(unsigned int handle,u8 interface_index,u8 * protocol, HIDCallback hc, void *p_user); - -extern int(*HIDRead)(unsigned int handle, unsigned char *p_buffer, unsigned int buffer_length, HIDCallback hc, void *p_user); -extern int(*HIDWrite)(unsigned int handle, unsigned char *p_buffer, unsigned int buffer_length, HIDCallback hc, void *p_user); - -#ifdef __cplusplus -} -#endif - -#endif // __SYSHID_FUNCTIONS_H_ diff --git a/src/dynamic_libs/vpad_functions.c b/src/dynamic_libs/vpad_functions.c deleted file mode 100644 index 201cf34..0000000 --- a/src/dynamic_libs/vpad_functions.c +++ /dev/null @@ -1,55 +0,0 @@ -/**************************************************************************** - * Copyright (C) 2015 - * by Dimok - * - * This software is provided 'as-is', without any express or implied - * warranty. In no event will the authors be held liable for any - * damages arising from the use of this software. - * - * Permission is granted to anyone to use this software for any - * purpose, including commercial applications, and to alter it and - * redistribute it freely, subject to the following restrictions: - * - * 1. The origin of this software must not be misrepresented; you - * must not claim that you wrote the original software. If you use - * this software in a product, an acknowledgment in the product - * documentation would be appreciated but is not required. - * - * 2. Altered source versions must be plainly marked as such, and - * must not be misrepresented as being the original software. - * - * 3. This notice may not be removed or altered from any source - * distribution. - ***************************************************************************/ -#include "os_functions.h" -#include "vpad_functions.h" - -unsigned int vpad_handle __attribute__((section(".data"))) = 0; -unsigned int vpadbase_handle __attribute__((section(".data"))) = 0; - -EXPORT_DECL(void, VPADInit, void); -EXPORT_DECL(int, VPADRead, int chan, VPADData *buffer, u32 buffer_size, s32 *error); -EXPORT_DECL(int, VPADGetLcdMode, int padnum, int *lcdmode); -EXPORT_DECL(int, VPADSetLcdMode, int padnum, int lcdmode); -EXPORT_DECL(int, VPADBASEGetMotorOnRemainingCount, int padnum); -EXPORT_DECL(int, VPADBASESetMotorOnRemainingCount, int padnum, int counter); - -void InitAcquireVPad(void) -{ - OSDynLoad_Acquire("vpad.rpl", &vpad_handle); - OSDynLoad_Acquire("vpadbase.rpl", &vpadbase_handle); -} - -void InitVPadFunctionPointers(void) -{ - unsigned int *funcPointer = 0; - - InitAcquireVPad(); - - OS_FIND_EXPORT(vpad_handle, VPADInit); - OS_FIND_EXPORT(vpad_handle, VPADRead); - OS_FIND_EXPORT(vpad_handle, VPADGetLcdMode); - OS_FIND_EXPORT(vpad_handle, VPADSetLcdMode); - OS_FIND_EXPORT(vpadbase_handle, VPADBASEGetMotorOnRemainingCount); - OS_FIND_EXPORT(vpadbase_handle, VPADBASESetMotorOnRemainingCount); -} diff --git a/src/dynamic_libs/vpad_functions.h b/src/dynamic_libs/vpad_functions.h deleted file mode 100644 index 4fafda2..0000000 --- a/src/dynamic_libs/vpad_functions.h +++ /dev/null @@ -1,114 +0,0 @@ -/**************************************************************************** - * Copyright (C) 2015 - * by Dimok - * - * This software is provided 'as-is', without any express or implied - * warranty. In no event will the authors be held liable for any - * damages arising from the use of this software. - * - * Permission is granted to anyone to use this software for any - * purpose, including commercial applications, and to alter it and - * redistribute it freely, subject to the following restrictions: - * - * 1. The origin of this software must not be misrepresented; you - * must not claim that you wrote the original software. If you use - * this software in a product, an acknowledgment in the product - * documentation would be appreciated but is not required. - * - * 2. Altered source versions must be plainly marked as such, and - * must not be misrepresented as being the original software. - * - * 3. This notice may not be removed or altered from any source - * distribution. - ***************************************************************************/ -#ifndef __VPAD_FUNCTIONS_H_ -#define __VPAD_FUNCTIONS_H_ - -#ifdef __cplusplus -extern "C" { -#endif - -extern unsigned int vpad_handle; -extern unsigned int vpadbase_handle; - -#include - -#define VPAD_BUTTON_A 0x8000 -#define VPAD_BUTTON_B 0x4000 -#define VPAD_BUTTON_X 0x2000 -#define VPAD_BUTTON_Y 0x1000 -#define VPAD_BUTTON_LEFT 0x0800 -#define VPAD_BUTTON_RIGHT 0x0400 -#define VPAD_BUTTON_UP 0x0200 -#define VPAD_BUTTON_DOWN 0x0100 -#define VPAD_BUTTON_ZL 0x0080 -#define VPAD_BUTTON_ZR 0x0040 -#define VPAD_BUTTON_L 0x0020 -#define VPAD_BUTTON_R 0x0010 -#define VPAD_BUTTON_PLUS 0x0008 -#define VPAD_BUTTON_MINUS 0x0004 -#define VPAD_BUTTON_HOME 0x0002 -#define VPAD_BUTTON_SYNC 0x0001 -#define VPAD_BUTTON_STICK_R 0x00020000 -#define VPAD_BUTTON_STICK_L 0x00040000 -#define VPAD_BUTTON_TV 0x00010000 - -#define VPAD_STICK_R_EMULATION_LEFT 0x04000000 -#define VPAD_STICK_R_EMULATION_RIGHT 0x02000000 -#define VPAD_STICK_R_EMULATION_UP 0x01000000 -#define VPAD_STICK_R_EMULATION_DOWN 0x00800000 - -#define VPAD_STICK_L_EMULATION_LEFT 0x40000000 -#define VPAD_STICK_L_EMULATION_RIGHT 0x20000000 -#define VPAD_STICK_L_EMULATION_UP 0x10000000 -#define VPAD_STICK_L_EMULATION_DOWN 0x08000000 - -//! Own definitions -#define VPAD_BUTTON_TOUCH 0x00080000 -#define VPAD_MASK_EMULATED_STICKS 0x7F800000 -#define VPAD_MASK_BUTTONS ~VPAD_MASK_EMULATED_STICKS - -typedef struct -{ - f32 x,y; -} Vec2D; - -typedef struct -{ - u16 x, y; /* Touch coordinates */ - u16 touched; /* 1 = Touched, 0 = Not touched */ - u16 invalid; /* 0 = All valid, 1 = X invalid, 2 = Y invalid, 3 = Both invalid? */ -} VPADTPData; - -typedef struct -{ - u32 btns_h; /* Held buttons */ - u32 btns_d; /* Buttons that are pressed at that instant */ - u32 btns_r; /* Released buttons */ - Vec2D lstick, rstick; /* Each contains 4-byte X and Y components */ - char unknown1c[0x52 - 0x1c]; /* Contains accelerometer and gyroscope data somewhere */ - VPADTPData tpdata; /* Normal touchscreen data */ - VPADTPData tpdata1; /* Modified touchscreen data 1 */ - VPADTPData tpdata2; /* Modified touchscreen data 2 */ - char unknown6a[0xa0 - 0x6a]; - uint8_t volume; - uint8_t battery; /* 0 to 6 */ - uint8_t unk_volume; /* One less than volume */ - char unknowna4[0xac - 0xa4]; -} VPADData; - -void InitVPadFunctionPointers(void); -void InitAcquireVPad(void); - -extern int (* VPADRead)(int chan, VPADData *buffer, u32 buffer_size, s32 *error); -extern int (* VPADGetLcdMode)(int padnum, int *lcdmode); -extern int (* VPADSetLcdMode)(int padnum, int lcdmode); -extern void (* VPADInit)(void); -extern int (* VPADBASEGetMotorOnRemainingCount)(int lcdmode); -extern int (* VPADBASESetMotorOnRemainingCount)(int lcdmode,int counter); - -#ifdef __cplusplus -} -#endif - -#endif // __VPAD_FUNCTIONS_H_ diff --git a/src/entry.c b/src/entry.c index 759cee0..ea0bfce 100644 --- a/src/entry.c +++ b/src/entry.c @@ -1,11 +1,12 @@ #include -#include "dynamic_libs/os_functions.h" -#include "dynamic_libs/sys_functions.h" +#include #include "common/common.h" #include "utils/utils.h" #include "main.h" -int __entry_menu(int argc, char **argv) +static volatile uint8_t ucRunOnce = 0; + +int main(int argc, char **argv) { //! ******************************************************************* //! * Jump to our application * diff --git a/src/fs/CFile.cpp b/src/fs/CFile.cpp index b26cbf5..161b980 100644 --- a/src/fs/CFile.cpp +++ b/src/fs/CFile.cpp @@ -2,7 +2,6 @@ #include #include "CFile.hpp" - CFile::CFile() { iFd = -1; diff --git a/src/fs/CFile.hpp b/src/fs/CFile.hpp index a95d3cd..0203162 100644 --- a/src/fs/CFile.hpp +++ b/src/fs/CFile.hpp @@ -4,9 +4,9 @@ #include #include #include -#include -#include #include +#include +#include "common/types.h" class CFile { diff --git a/src/fs/DirList.cpp b/src/fs/DirList.cpp index 147deaf..c37b504 100644 --- a/src/fs/DirList.cpp +++ b/src/fs/DirList.cpp @@ -39,11 +39,12 @@ DirList::DirList() { Flags = 0; Filter = 0; + Depth = 0; } -DirList::DirList(const std::string & path, const char *filter, u32 flags) +DirList::DirList(const std::string & path, const char *filter, u32 flags, u32 maxDepth) { - this->LoadPath(path, filter, flags); + this->LoadPath(path, filter, flags, maxDepth); this->SortList(); } @@ -52,12 +53,13 @@ DirList::~DirList() ClearList(); } -bool DirList::LoadPath(const std::string & folder, const char *filter, u32 flags) +bool DirList::LoadPath(const std::string & folder, const char *filter, u32 flags, u32 maxDepth) { if(folder.empty()) return false; Flags = flags; Filter = filter; + Depth = maxDepth; std::string folderpath(folder); u32 length = folderpath.size(); @@ -69,6 +71,10 @@ bool DirList::LoadPath(const std::string & folder, const char *filter, u32 flags if(length > 0 && folderpath[length-1] == '/') folderpath.erase(length-1); + //! add root slash if missing + if(folderpath.find('/') == std::string::npos) + folderpath += '/'; + return InternalLoadPath(folderpath); } @@ -94,14 +100,17 @@ bool DirList::InternalLoadPath(std::string &folderpath) if(strcmp(filename,".") == 0 || strcmp(filename,"..") == 0) continue; - if(Flags & CheckSubfolders) + if((Flags & CheckSubfolders) && (Depth > 0)) { int length = folderpath.size(); if(length > 2 && folderpath[length-1] != '/') folderpath += '/'; folderpath += filename; + + Depth--; InternalLoadPath(folderpath); folderpath.erase(length); + Depth++; } if(!(Flags & Dirs)) diff --git a/src/fs/DirList.h b/src/fs/DirList.h index 2a34208..ea5c20c 100644 --- a/src/fs/DirList.h +++ b/src/fs/DirList.h @@ -29,7 +29,7 @@ #include #include -#include +#include "common/types.h" typedef struct { @@ -45,11 +45,11 @@ public: //!\param path Path from where to load the filelist of all files //!\param filter A fileext that needs to be filtered //!\param flags search/filter flags from the enum - DirList(const std::string & path, const char *filter = NULL, u32 flags = Files | Dirs); + DirList(const std::string & path, const char *filter = NULL, u32 flags = Files | Dirs, u32 maxDepth = 0xffffffff); //!Destructor virtual ~DirList(); //! Load all the files from a directory - bool LoadPath(const std::string & path, const char *filter = NULL, u32 flags = Files | Dirs); + bool LoadPath(const std::string & path, const char *filter = NULL, u32 flags = Files | Dirs, u32 maxDepth = 0xffffffff); //! Get a filename of the list //!\param list index const char * GetFilename(int index) const; @@ -88,6 +88,7 @@ protected: inline bool valid(u32 pos) const { return (pos < FileInfo.size()); }; u32 Flags; + u32 Depth; const char *Filter; std::vector FileInfo; }; diff --git a/src/fs/fs_utils.c b/src/fs/fs_utils.c index 8c4d5c8..ffadd89 100644 --- a/src/fs/fs_utils.c +++ b/src/fs/fs_utils.c @@ -3,14 +3,15 @@ #include #include #include -#include "dynamic_libs/fs_defs.h" -#include "dynamic_libs/fs_functions.h" +#include + +#define FS_MAX_MOUNTPATH_SIZE 128 int MountFS(void *pClient, void *pCmd, char **mount_path) { int result = -1; - void *mountSrc = malloc(FS_MOUNT_SOURCE_SIZE); + void *mountSrc = malloc(sizeof(FSMountSource)); if(!mountSrc) return -3; @@ -20,11 +21,11 @@ int MountFS(void *pClient, void *pCmd, char **mount_path) return -4; } - memset(mountSrc, 0, FS_MOUNT_SOURCE_SIZE); + memset(mountSrc, 0, sizeof(FSMountSource)); memset(mountPath, 0, FS_MAX_MOUNTPATH_SIZE); // Mount sdcard - if (FSGetMountSource(pClient, pCmd, FS_SOURCETYPE_EXTERNAL, mountSrc, -1) == 0) + if (FSGetMountSource(pClient, pCmd, FS_MOUNT_SOURCE_SD, mountSrc, -1) == 0) { result = FSMount(pClient, pCmd, mountSrc, mountPath, FS_MAX_MOUNTPATH_SIZE, -1); if((result == 0) && mount_path) { diff --git a/src/fs/fs_utils.h b/src/fs/fs_utils.h index 7022695..5d4a05b 100644 --- a/src/fs/fs_utils.h +++ b/src/fs/fs_utils.h @@ -5,7 +5,7 @@ extern "C" { #endif -#include +#include "common/types.h" int MountFS(void *pClient, void *pCmd, char **mount_path); int UmountFS(void *pClient, void *pCmd, const char *mountPath); diff --git a/src/fs/sd_fat_devoptab.c b/src/fs/sd_fat_devoptab.c deleted file mode 100644 index f5b278b..0000000 --- a/src/fs/sd_fat_devoptab.c +++ /dev/null @@ -1,1019 +0,0 @@ -/*************************************************************************** - * Copyright (C) 2015 - * by Dimok - * - * This software is provided 'as-is', without any express or implied - * warranty. In no event will the authors be held liable for any - * damages arising from the use of this software. - * - * Permission is granted to anyone to use this software for any - * purpose, including commercial applications, and to alter it and - * redistribute it freely, subject to the following restrictions: - * - * 1. The origin of this software must not be misrepresented; you - * must not claim that you wrote the original software. If you use - * this software in a product, an acknowledgment in the product - * documentation would be appreciated but is not required. - * - * 2. Altered source versions must be plainly marked as such, and - * must not be misrepresented as being the original software. - * - * 3. This notice may not be removed or altered from any source - * distribution. - ***************************************************************************/ -#include -#include -#include -#include -#include -#include -#include -#include -#include "dynamic_libs/fs_functions.h" -#include "dynamic_libs/os_functions.h" -#include "fs_utils.h" - -#define FS_ALIGNMENT 0x40 -#define FS_ALIGN(x) (((x) + FS_ALIGNMENT - 1) & ~(FS_ALIGNMENT - 1)) - -typedef struct _sd_fat_private_t { - char *mount_path; - void *pClient; - void *pCmd; - void *pMutex; -} sd_fat_private_t; - -typedef struct _sd_fat_file_state_t { - sd_fat_private_t *dev; - int fd; /* File descriptor */ - int flags; /* Opening flags */ - bool read; /* True if allowed to read from file */ - bool write; /* True if allowed to write to file */ - bool append; /* True if allowed to append to file */ - u64 pos; /* Current position within the file (in bytes) */ - u64 len; /* Total length of the file (in bytes) */ - struct _sd_fat_file_state_t *prevOpenFile; /* The previous entry in a double-linked FILO list of open files */ - struct _sd_fat_file_state_t *nextOpenFile; /* The next entry in a double-linked FILO list of open files */ -} sd_fat_file_state_t; - -typedef struct _sd_fat_dir_entry_t { - sd_fat_private_t *dev; - int dirHandle; -} sd_fat_dir_entry_t; - -static sd_fat_private_t *sd_fat_get_device_data(const char *path) -{ - const devoptab_t *devoptab = NULL; - char name[128] = {0}; - int i; - - // Get the device name from the path - strncpy(name, path, 127); - strtok(name, ":/"); - - // Search the devoptab table for the specified device name - // NOTE: We do this manually due to a 'bug' in GetDeviceOpTab - // which ignores names with suffixes and causes names - // like "ntfs" and "ntfs1" to be seen as equals - for (i = 3; i < STD_MAX; i++) { - devoptab = devoptab_list[i]; - if (devoptab && devoptab->name) { - if (strcmp(name, devoptab->name) == 0) { - return (sd_fat_private_t *)devoptab->deviceData; - } - } - } - - return NULL; -} - -static char *sd_fat_real_path (const char *path, sd_fat_private_t *dev) -{ - // Sanity check - if (!path) - return NULL; - - // Move the path pointer to the start of the actual path - if (strchr(path, ':') != NULL) { - path = strchr(path, ':') + 1; - } - - int mount_len = strlen(dev->mount_path); - - char *new_name = (char*)malloc(mount_len + strlen(path) + 1); - if(new_name) { - strcpy(new_name, dev->mount_path); - strcpy(new_name + mount_len, path); - return new_name; - } - return new_name; -} - -static int sd_fat_open_r (struct _reent *r, void *fileStruct, const char *path, int flags, int mode) -{ - sd_fat_private_t *dev = sd_fat_get_device_data(path); - if(!dev) { - r->_errno = ENODEV; - return -1; - } - - sd_fat_file_state_t *file = (sd_fat_file_state_t *)fileStruct; - - file->dev = dev; - // Determine which mode the file is opened for - file->flags = flags; - - const char *mode_str; - - if ((flags & 0x03) == O_RDONLY) { - file->read = true; - file->write = false; - file->append = false; - mode_str = "r"; - } else if ((flags & 0x03) == O_WRONLY) { - file->read = false; - file->write = true; - file->append = (flags & O_APPEND); - mode_str = file->append ? "a" : "w"; - } else if ((flags & 0x03) == O_RDWR) { - file->read = true; - file->write = true; - file->append = (flags & O_APPEND); - mode_str = file->append ? "a+" : "r+"; - } else { - r->_errno = EACCES; - return -1; - } - - int fd = -1; - - OSLockMutex(dev->pMutex); - - char *real_path = sd_fat_real_path(path, dev); - if(!path) { - r->_errno = ENOMEM; - OSUnlockMutex(dev->pMutex); - return -1; - } - - int result = FSOpenFile(dev->pClient, dev->pCmd, real_path, mode_str, &fd, -1); - - free(real_path); - - if(result == 0) - { - FSStat stats; - result = FSGetStatFile(dev->pClient, dev->pCmd, fd, &stats, -1); - if(result != 0) { - FSCloseFile(dev->pClient, dev->pCmd, fd, -1); - r->_errno = result; - OSUnlockMutex(dev->pMutex); - return -1; - } - file->fd = fd; - file->pos = 0; - file->len = stats.size; - OSUnlockMutex(dev->pMutex); - return (int)file; - } - - r->_errno = result; - OSUnlockMutex(dev->pMutex); - return -1; -} - - -static int sd_fat_close_r (struct _reent *r, int fd) -{ - sd_fat_file_state_t *file = (sd_fat_file_state_t *)fd; - if(!file->dev) { - r->_errno = ENODEV; - return -1; - } - - OSLockMutex(file->dev->pMutex); - - int result = FSCloseFile(file->dev->pClient, file->dev->pCmd, file->fd, -1); - - OSUnlockMutex(file->dev->pMutex); - - if(result < 0) - { - r->_errno = result; - return -1; - } - return 0; -} - -static off_t sd_fat_seek_r (struct _reent *r, int fd, off_t pos, int dir) -{ - sd_fat_file_state_t *file = (sd_fat_file_state_t *)fd; - if(!file->dev) { - r->_errno = ENODEV; - return 0; - } - - OSLockMutex(file->dev->pMutex); - - switch(dir) - { - case SEEK_SET: - file->pos = pos; - break; - case SEEK_CUR: - file->pos += pos; - break; - case SEEK_END: - file->pos = file->len + pos; - break; - default: - r->_errno = EINVAL; - return -1; - } - - int result = FSSetPosFile(file->dev->pClient, file->dev->pCmd, file->fd, file->pos, -1); - - OSUnlockMutex(file->dev->pMutex); - - if(result == 0) - { - return file->pos; - } - - return result; -} - -static ssize_t sd_fat_write_r (struct _reent *r, int fd, const char *ptr, size_t len) -{ - sd_fat_file_state_t *file = (sd_fat_file_state_t *)fd; - if(!file->dev) { - r->_errno = ENODEV; - return 0; - } - - if(!file->write) - { - r->_errno = EACCES; - return 0; - } - - OSLockMutex(file->dev->pMutex); - - size_t len_aligned = FS_ALIGN(len); - if(len_aligned > 0x4000) - len_aligned = 0x4000; - - unsigned char *tmpBuf = (unsigned char *)memalign(FS_ALIGNMENT, len_aligned); - if(!tmpBuf) { - r->_errno = ENOMEM; - OSUnlockMutex(file->dev->pMutex); - return 0; - } - - size_t done = 0; - - while(done < len) - { - size_t write_size = (len_aligned < (len - done)) ? len_aligned : (len - done); - memcpy(tmpBuf, ptr + done, write_size); - - int result = FSWriteFile(file->dev->pClient, file->dev->pCmd, tmpBuf, 0x01, write_size, file->fd, 0, -1); - if(result < 0) - { - r->_errno = result; - break; - } - else if(result == 0) - { - if(write_size > 0) - done = 0; - break; - } - else - { - done += result; - file->pos += result; - } - } - - free(tmpBuf); - OSUnlockMutex(file->dev->pMutex); - return done; -} - -static ssize_t sd_fat_read_r (struct _reent *r, int fd, char *ptr, size_t len) -{ - sd_fat_file_state_t *file = (sd_fat_file_state_t *)fd; - if(!file->dev) { - r->_errno = ENODEV; - return 0; - } - - if(!file->read) - { - r->_errno = EACCES; - return 0; - } - - OSLockMutex(file->dev->pMutex); - - size_t len_aligned = FS_ALIGN(len); - if(len_aligned > 0x4000) - len_aligned = 0x4000; - - unsigned char *tmpBuf = (unsigned char *)memalign(FS_ALIGNMENT, len_aligned); - if(!tmpBuf) { - r->_errno = ENOMEM; - OSUnlockMutex(file->dev->pMutex); - return 0; - } - - size_t done = 0; - - while(done < len) - { - size_t read_size = (len_aligned < (len - done)) ? len_aligned : (len - done); - - int result = FSReadFile(file->dev->pClient, file->dev->pCmd, tmpBuf, 0x01, read_size, file->fd, 0, -1); - if(result < 0) - { - r->_errno = result; - done = 0; - break; - } - else if(result == 0) - { - //! TODO: error on read_size > 0 - break; - } - else - { - memcpy(ptr + done, tmpBuf, read_size); - done += result; - file->pos += result; - } - } - - free(tmpBuf); - OSUnlockMutex(file->dev->pMutex); - return done; -} - - -static int sd_fat_fstat_r (struct _reent *r, int fd, struct stat *st) -{ - sd_fat_file_state_t *file = (sd_fat_file_state_t *)fd; - if(!file->dev) { - r->_errno = ENODEV; - return -1; - } - - OSLockMutex(file->dev->pMutex); - - // Zero out the stat buffer - memset(st, 0, sizeof(struct stat)); - - FSStat stats; - int result = FSGetStatFile(file->dev->pClient, file->dev->pCmd, file->fd, &stats, -1); - if(result != 0) { - r->_errno = result; - OSUnlockMutex(file->dev->pMutex); - return -1; - } - - st->st_mode = S_IFREG; - st->st_size = stats.size; - st->st_blocks = (stats.size + 511) >> 9; - st->st_nlink = 1; - - // Fill in the generic entry stats - st->st_dev = stats.ent_id; - st->st_uid = stats.owner_id; - st->st_gid = stats.group_id; - st->st_ino = stats.ent_id; - st->st_atime = stats.mtime; - st->st_ctime = stats.ctime; - st->st_mtime = stats.mtime; - OSUnlockMutex(file->dev->pMutex); - return 0; -} - -static int sd_fat_ftruncate_r (struct _reent *r, int fd, off_t len) -{ - sd_fat_file_state_t *file = (sd_fat_file_state_t *)fd; - if(!file->dev) { - r->_errno = ENODEV; - return -1; - } - - OSLockMutex(file->dev->pMutex); - - int result = FSTruncateFile(file->dev->pClient, file->dev->pCmd, file->fd, -1); - - OSUnlockMutex(file->dev->pMutex); - - if(result < 0) { - r->_errno = result; - return -1; - } - - return 0; -} - -static int sd_fat_fsync_r (struct _reent *r, int fd) -{ - sd_fat_file_state_t *file = (sd_fat_file_state_t *)fd; - if(!file->dev) { - r->_errno = ENODEV; - return -1; - } - - OSLockMutex(file->dev->pMutex); - - int result = FSFlushFile(file->dev->pClient, file->dev->pCmd, file->fd, -1); - - OSUnlockMutex(file->dev->pMutex); - - if(result < 0) { - r->_errno = result; - return -1; - } - - return 0; -} - -static int sd_fat_stat_r (struct _reent *r, const char *path, struct stat *st) -{ - sd_fat_private_t *dev = sd_fat_get_device_data(path); - if(!dev) { - r->_errno = ENODEV; - return -1; - } - - OSLockMutex(dev->pMutex); - - // Zero out the stat buffer - memset(st, 0, sizeof(struct stat)); - - char *real_path = sd_fat_real_path(path, dev); - if(!real_path) { - r->_errno = ENOMEM; - OSUnlockMutex(dev->pMutex); - return -1; - } - - FSStat stats; - - int result = FSGetStat(dev->pClient, dev->pCmd, real_path, &stats, -1); - - free(real_path); - - if(result < 0) { - r->_errno = result; - OSUnlockMutex(dev->pMutex); - return -1; - } - - // mark root also as directory - st->st_mode = ((stats.flag & 0x80000000) || (strlen(dev->mount_path) + 1 == strlen(real_path)))? S_IFDIR : S_IFREG; - st->st_nlink = 1; - st->st_size = stats.size; - st->st_blocks = (stats.size + 511) >> 9; - // Fill in the generic entry stats - st->st_dev = stats.ent_id; - st->st_uid = stats.owner_id; - st->st_gid = stats.group_id; - st->st_ino = stats.ent_id; - st->st_atime = stats.mtime; - st->st_ctime = stats.ctime; - st->st_mtime = stats.mtime; - - OSUnlockMutex(dev->pMutex); - - return 0; -} - -static int sd_fat_link_r (struct _reent *r, const char *existing, const char *newLink) -{ - r->_errno = ENOTSUP; - return -1; -} - -static int sd_fat_unlink_r (struct _reent *r, const char *name) -{ - sd_fat_private_t *dev = sd_fat_get_device_data(name); - if(!dev) { - r->_errno = ENODEV; - return -1; - } - - OSLockMutex(dev->pMutex); - - char *real_path = sd_fat_real_path(name, dev); - if(!real_path) { - r->_errno = ENOMEM; - OSUnlockMutex(dev->pMutex); - return -1; - } - - - int result = FSRemove(dev->pClient, dev->pCmd, real_path, -1); - - free(real_path); - - OSUnlockMutex(dev->pMutex); - - if(result < 0) { - r->_errno = result; - return -1; - } - - return 0; -} - -static int sd_fat_chdir_r (struct _reent *r, const char *name) -{ - sd_fat_private_t *dev = sd_fat_get_device_data(name); - if(!dev) { - r->_errno = ENODEV; - return -1; - } - - OSLockMutex(dev->pMutex); - - char *real_path = sd_fat_real_path(name, dev); - if(!real_path) { - r->_errno = ENOMEM; - OSUnlockMutex(dev->pMutex); - return -1; - } - - int result = FSChangeDir(dev->pClient, dev->pCmd, real_path, -1); - - free(real_path); - - OSUnlockMutex(dev->pMutex); - - if(result < 0) { - r->_errno = result; - return -1; - } - - return 0; -} - -static int sd_fat_rename_r (struct _reent *r, const char *oldName, const char *newName) -{ - sd_fat_private_t *dev = sd_fat_get_device_data(oldName); - if(!dev) { - r->_errno = ENODEV; - return -1; - } - - OSLockMutex(dev->pMutex); - - char *real_oldpath = sd_fat_real_path(oldName, dev); - if(!real_oldpath) { - r->_errno = ENOMEM; - OSUnlockMutex(dev->pMutex); - return -1; - } - char *real_newpath = sd_fat_real_path(newName, dev); - if(!real_newpath) { - r->_errno = ENOMEM; - free(real_oldpath); - OSUnlockMutex(dev->pMutex); - return -1; - } - - int result = FSRename(dev->pClient, dev->pCmd, real_oldpath, real_newpath, -1); - - free(real_oldpath); - free(real_newpath); - - OSUnlockMutex(dev->pMutex); - - if(result < 0) { - r->_errno = result; - return -1; - } - - return 0; - -} - -static int sd_fat_mkdir_r (struct _reent *r, const char *path, int mode) -{ - sd_fat_private_t *dev = sd_fat_get_device_data(path); - if(!dev) { - r->_errno = ENODEV; - return -1; - } - - OSLockMutex(dev->pMutex); - - char *real_path = sd_fat_real_path(path, dev); - if(!real_path) { - r->_errno = ENOMEM; - OSUnlockMutex(dev->pMutex); - return -1; - } - - int result = FSMakeDir(dev->pClient, dev->pCmd, real_path, -1); - - free(real_path); - - OSUnlockMutex(dev->pMutex); - - if(result < 0) { - r->_errno = result; - return -1; - } - - return 0; -} - -static int sd_fat_statvfs_r (struct _reent *r, const char *path, struct statvfs *buf) -{ - sd_fat_private_t *dev = sd_fat_get_device_data(path); - if(!dev) { - r->_errno = ENODEV; - return -1; - } - - OSLockMutex(dev->pMutex); - - // Zero out the stat buffer - memset(buf, 0, sizeof(struct statvfs)); - - char *real_path = sd_fat_real_path(path, dev); - if(!real_path) { - r->_errno = ENOMEM; - OSUnlockMutex(dev->pMutex); - return -1; - } - - u64 size; - - int result = FSGetFreeSpaceSize(dev->pClient, dev->pCmd, real_path, &size, -1); - - free(real_path); - - if(result < 0) { - r->_errno = result; - OSUnlockMutex(dev->pMutex); - return -1; - } - - // File system block size - buf->f_bsize = 512; - - // Fundamental file system block size - buf->f_frsize = 512; - - // Total number of blocks on file system in units of f_frsize - buf->f_blocks = size >> 9; // this is unknown - - // Free blocks available for all and for non-privileged processes - buf->f_bfree = buf->f_bavail = size >> 9; - - // Number of inodes at this point in time - buf->f_files = 0xffffffff; - - // Free inodes available for all and for non-privileged processes - buf->f_ffree = 0xffffffff; - - // File system id - buf->f_fsid = (int)dev; - - // Bit mask of f_flag values. - buf->f_flag = 0; - - // Maximum length of filenames - buf->f_namemax = 255; - - OSUnlockMutex(dev->pMutex); - - return 0; -} - -static DIR_ITER *sd_fat_diropen_r (struct _reent *r, DIR_ITER *dirState, const char *path) -{ - sd_fat_private_t *dev = sd_fat_get_device_data(path); - if(!dev) { - r->_errno = ENODEV; - return NULL; - } - - sd_fat_dir_entry_t *dirIter = (sd_fat_dir_entry_t *)dirState->dirStruct; - - OSLockMutex(dev->pMutex); - - char *real_path = sd_fat_real_path(path, dev); - if(!real_path) { - r->_errno = ENOMEM; - OSUnlockMutex(dev->pMutex); - return NULL; - } - - int dirHandle; - - int result = FSOpenDir(dev->pClient, dev->pCmd, real_path, &dirHandle, -1); - - free(real_path); - - OSUnlockMutex(dev->pMutex); - - if(result < 0) - { - r->_errno = result; - return NULL; - } - - dirIter->dev = dev; - dirIter->dirHandle = dirHandle; - - return dirState; -} - -static int sd_fat_dirclose_r (struct _reent *r, DIR_ITER *dirState) -{ - sd_fat_dir_entry_t *dirIter = (sd_fat_dir_entry_t *)dirState->dirStruct; - if(!dirIter->dev) { - r->_errno = ENODEV; - return -1; - } - - OSLockMutex(dirIter->dev->pMutex); - - int result = FSCloseDir(dirIter->dev->pClient, dirIter->dev->pCmd, dirIter->dirHandle, -1); - - OSUnlockMutex(dirIter->dev->pMutex); - - if(result < 0) - { - r->_errno = result; - return -1; - } - return 0; -} - -static int sd_fat_dirreset_r (struct _reent *r, DIR_ITER *dirState) -{ - sd_fat_dir_entry_t *dirIter = (sd_fat_dir_entry_t *)dirState->dirStruct; - if(!dirIter->dev) { - r->_errno = ENODEV; - return -1; - } - - OSLockMutex(dirIter->dev->pMutex); - - int result = FSRewindDir(dirIter->dev->pClient, dirIter->dev->pCmd, dirIter->dirHandle, -1); - - OSUnlockMutex(dirIter->dev->pMutex); - - if(result < 0) - { - r->_errno = result; - return -1; - } - return 0; -} - -static int sd_fat_dirnext_r (struct _reent *r, DIR_ITER *dirState, char *filename, struct stat *st) -{ - sd_fat_dir_entry_t *dirIter = (sd_fat_dir_entry_t *)dirState->dirStruct; - if(!dirIter->dev) { - r->_errno = ENODEV; - return -1; - } - - OSLockMutex(dirIter->dev->pMutex); - - FSDirEntry * dir_entry = malloc(sizeof(FSDirEntry)); - - int result = FSReadDir(dirIter->dev->pClient, dirIter->dev->pCmd, dirIter->dirHandle, dir_entry, -1); - if(result < 0) - { - free(dir_entry); - r->_errno = result; - OSUnlockMutex(dirIter->dev->pMutex); - return -1; - } - - // Fetch the current entry - strcpy(filename, dir_entry->name); - - if(st) - { - memset(st, 0, sizeof(struct stat)); - st->st_mode = (dir_entry->stat.flag & 0x80000000) ? S_IFDIR : S_IFREG; - st->st_nlink = 1; - st->st_size = dir_entry->stat.size; - st->st_blocks = (dir_entry->stat.size + 511) >> 9; - st->st_dev = dir_entry->stat.ent_id; - st->st_uid = dir_entry->stat.owner_id; - st->st_gid = dir_entry->stat.group_id; - st->st_ino = dir_entry->stat.ent_id; - st->st_atime = dir_entry->stat.mtime; - st->st_ctime = dir_entry->stat.ctime; - st->st_mtime = dir_entry->stat.mtime; - } - - free(dir_entry); - OSUnlockMutex(dirIter->dev->pMutex); - return 0; -} - -// NTFS device driver devoptab -static const devoptab_t devops_sd_fat = { - NULL, /* Device name */ - sizeof (sd_fat_file_state_t), - sd_fat_open_r, - sd_fat_close_r, - sd_fat_write_r, - sd_fat_read_r, - sd_fat_seek_r, - sd_fat_fstat_r, - sd_fat_stat_r, - sd_fat_link_r, - sd_fat_unlink_r, - sd_fat_chdir_r, - sd_fat_rename_r, - sd_fat_mkdir_r, - sizeof (sd_fat_dir_entry_t), - sd_fat_diropen_r, - sd_fat_dirreset_r, - sd_fat_dirnext_r, - sd_fat_dirclose_r, - sd_fat_statvfs_r, - sd_fat_ftruncate_r, - sd_fat_fsync_r, - NULL, /* sd_fat_chmod_r */ - NULL, /* sd_fat_fchmod_r */ - NULL /* Device data */ -}; - -static int sd_fat_add_device (const char *name, const char *mount_path, void *pClient, void *pCmd) -{ - devoptab_t *dev = NULL; - char *devname = NULL; - char *devpath = NULL; - int i; - - // Sanity check - if (!name) { - errno = EINVAL; - return -1; - } - - // Allocate a devoptab for this device - dev = (devoptab_t *) malloc(sizeof(devoptab_t) + strlen(name) + 1); - if (!dev) { - errno = ENOMEM; - return -1; - } - - // Use the space allocated at the end of the devoptab for storing the device name - devname = (char*)(dev + 1); - strcpy(devname, name); - - // create private data - sd_fat_private_t *priv = (sd_fat_private_t *)malloc(sizeof(sd_fat_private_t) + strlen(mount_path) + 1); - if(!priv) { - free(dev); - errno = ENOMEM; - return -1; - } - - devpath = (char*)(priv+1); - strcpy(devpath, mount_path); - - // setup private data - priv->mount_path = devpath; - priv->pClient = pClient; - priv->pCmd = pCmd; - priv->pMutex = malloc(OS_MUTEX_SIZE); - - if(!priv->pMutex) { - free(dev); - free(priv); - errno = ENOMEM; - return -1; - } - - OSInitMutex(priv->pMutex); - - // Setup the devoptab - memcpy(dev, &devops_sd_fat, sizeof(devoptab_t)); - dev->name = devname; - dev->deviceData = priv; - - // Add the device to the devoptab table (if there is a free slot) - for (i = 3; i < STD_MAX; i++) { - if (devoptab_list[i] == devoptab_list[0]) { - devoptab_list[i] = dev; - return 0; - } - } - - // failure, free all memory - free(priv); - free(dev); - - // If we reach here then there are no free slots in the devoptab table for this device - errno = EADDRNOTAVAIL; - return -1; -} - -static int sd_fat_remove_device (const char *path, void **pClient, void **pCmd, char **mountPath) -{ - const devoptab_t *devoptab = NULL; - char name[128] = {0}; - int i; - - // Get the device name from the path - strncpy(name, path, 127); - strtok(name, ":/"); - - // Find and remove the specified device from the devoptab table - // NOTE: We do this manually due to a 'bug' in RemoveDevice - // which ignores names with suffixes and causes names - // like "ntfs" and "ntfs1" to be seen as equals - for (i = 3; i < STD_MAX; i++) { - devoptab = devoptab_list[i]; - if (devoptab && devoptab->name) { - if (strcmp(name, devoptab->name) == 0) { - devoptab_list[i] = devoptab_list[0]; - - if(devoptab->deviceData) - { - sd_fat_private_t *priv = (sd_fat_private_t *)devoptab->deviceData; - *pClient = priv->pClient; - *pCmd = priv->pCmd; - *mountPath = (char*) malloc(strlen(priv->mount_path)+1); - if(*mountPath) - strcpy(*mountPath, priv->mount_path); - if(priv->pMutex) - free(priv->pMutex); - free(devoptab->deviceData); - } - - free((devoptab_t*)devoptab); - return 0; - } - } - } - - return -1; -} - -int mount_sd_fat(const char *path) -{ - int result = -1; - - // get command and client - void* pClient = malloc(FS_CLIENT_SIZE); - void* pCmd = malloc(FS_CMD_BLOCK_SIZE); - - if(!pClient || !pCmd) { - // just in case free if not 0 - if(pClient) - free(pClient); - if(pCmd) - free(pCmd); - return -2; - } - - FSInit(); - FSInitCmdBlock(pCmd); - FSAddClientEx(pClient, 0, -1); - - char *mountPath = NULL; - - if(MountFS(pClient, pCmd, &mountPath) == 0) { - result = sd_fat_add_device(path, mountPath, pClient, pCmd); - free(mountPath); - } - - return result; -} - -int unmount_sd_fat(const char *path) -{ - void *pClient = 0; - void *pCmd = 0; - char *mountPath = 0; - - int result = sd_fat_remove_device(path, &pClient, &pCmd, &mountPath); - if(result == 0) - { - UmountFS(pClient, pCmd, mountPath); - FSDelClient(pClient); - free(pClient); - free(pCmd); - free(mountPath); - //FSShutdown(); - } - return result; -} diff --git a/src/fs/sd_fat_devoptab.h b/src/fs/sd_fat_devoptab.h deleted file mode 100644 index 8df487a..0000000 --- a/src/fs/sd_fat_devoptab.h +++ /dev/null @@ -1,38 +0,0 @@ -/*************************************************************************** - * Copyright (C) 2015 - * by Dimok - * - * This software is provided 'as-is', without any express or implied - * warranty. In no event will the authors be held liable for any - * damages arising from the use of this software. - * - * Permission is granted to anyone to use this software for any - * purpose, including commercial applications, and to alter it and - * redistribute it freely, subject to the following restrictions: - * - * 1. The origin of this software must not be misrepresented; you - * must not claim that you wrote the original software. If you use - * this software in a product, an acknowledgment in the product - * documentation would be appreciated but is not required. - * - * 2. Altered source versions must be plainly marked as such, and - * must not be misrepresented as being the original software. - * - * 3. This notice may not be removed or altered from any source - * distribution. - ***************************************************************************/ -#ifndef __SD_FAT_DEVOPTAB_H_ -#define __SD_FAT_DEVOPTAB_H_ - -#ifdef __cplusplus -extern "C" { -#endif - -int mount_sd_fat(const char *path); -int unmount_sd_fat(const char *path); - -#ifdef __cplusplus -} -#endif - -#endif // __SD_FAT_DEVOPTAB_H_ diff --git a/src/gui/FreeTypeGX.cpp b/src/gui/FreeTypeGX.cpp index 6111153..c35432d 100644 --- a/src/gui/FreeTypeGX.cpp +++ b/src/gui/FreeTypeGX.cpp @@ -20,10 +20,9 @@ * along with FreeTypeGX. If not, see . */ -#include "FreeTypeGX.h" #include "video/CVideo.h" #include "video/shaders/Texture2DShader.h" -#include "utils/logger.h" +#include "FreeTypeGX.h" using namespace std; @@ -36,7 +35,7 @@ FreeTypeGX::FreeTypeGX(const uint8_t* fontBuffer, FT_Long bufferSize, bool lastF { int faceIndex = 0; ftPointSize = 0; - GX2InitSampler(&ftSampler, GX2_TEX_CLAMP_CLAMP_BORDER, GX2_TEX_XY_FILTER_BILINEAR); + GX2InitSampler(&ftSampler, GX2_TEX_CLAMP_MODE_CLAMP_BORDER, GX2_TEX_XY_FILTER_MODE_LINEAR); FT_Init_FreeType(&ftLibrary); if(lastFace) @@ -163,8 +162,8 @@ void FreeTypeGX::unloadFont() { if(itr2->second.texture) { - if(itr2->second.texture->surface.image_data) - free(itr2->second.texture->surface.image_data); + if(itr2->second.texture->surface.image) + free(itr2->second.texture->surface.image); delete itr2->second.texture; itr2->second.texture = NULL; @@ -235,7 +234,7 @@ ftgxCharData * FreeTypeGX::cacheGlyphData(wchar_t charCode, int16_t pixelSize) //! Initialize texture charData->texture = new GX2Texture; - GX2InitTexture(charData->texture, textureWidth, textureHeight, 1, 0, GX2_SURFACE_FORMAT_TC_R5_G5_B5_A1_UNORM, GX2_SURFACE_DIM_2D, GX2_TILE_MODE_LINEAR_ALIGNED); + GX2InitTexture(charData->texture, textureWidth, textureHeight, 1, 0, GX2_SURFACE_FORMAT_UNORM_R5_G5_B5_A1, GX2_SURFACE_DIM_TEXTURE_2D, GX2_TILE_MODE_LINEAR_ALIGNED); loadGlyphData(glyphBitmap, charData); @@ -277,14 +276,14 @@ uint16_t FreeTypeGX::cacheGlyphDataComplete(int16_t pixelSize) void FreeTypeGX::loadGlyphData(FT_Bitmap *bmp, ftgxCharData *charData) { - charData->texture->surface.image_data = (uint8_t *) memalign(charData->texture->surface.align, charData->texture->surface.image_size); - if(!charData->texture->surface.image_data) + charData->texture->surface.image = (uint8_t *) memalign(charData->texture->surface.alignment, charData->texture->surface.imageSize); + if(!charData->texture->surface.image) return; - memset(charData->texture->surface.image_data, 0x00, charData->texture->surface.image_size); + memset(charData->texture->surface.image, 0x00, charData->texture->surface.imageSize); uint8_t *src = (uint8_t *)bmp->buffer; - uint16_t *dst = (uint16_t *)charData->texture->surface.image_data; + uint16_t *dst = (uint16_t *)charData->texture->surface.image; int32_t x, y; for(y = 0; y < bmp->rows; y++) @@ -295,7 +294,7 @@ void FreeTypeGX::loadGlyphData(FT_Bitmap *bmp, ftgxCharData *charData) dst[y * charData->texture->surface.pitch + x] = intensity ? ((intensity << 11) | (intensity << 6) | (intensity << 1) | 1) : 0; } } - GX2Invalidate(GX2_INVALIDATE_CPU_TEXTURE, charData->texture->surface.image_data, charData->texture->surface.image_size); + GX2Invalidate(GX2_INVALIDATE_MODE_CPU_TEXTURE, charData->texture->surface.image, charData->texture->surface.imageSize); } /** @@ -390,6 +389,7 @@ uint16_t FreeTypeGX::drawText(CVideo *video, int16_t x, int16_t y, int16_t z, co } int i = 0; + while (text[i]) { ftgxCharData* glyphData = cacheGlyphData(text[i], pixelSize); diff --git a/src/gui/FreeTypeGX.h b/src/gui/FreeTypeGX.h index cd430b4..c3843d2 100644 --- a/src/gui/FreeTypeGX.h +++ b/src/gui/FreeTypeGX.h @@ -23,7 +23,6 @@ #ifndef FREETYPEGX_H_ #define FREETYPEGX_H_ -#include #include #include #include FT_FREETYPE_H @@ -37,7 +36,7 @@ #include #include -#include "dynamic_libs/gx2_functions.h" +#include "common/types.h" /*! \struct ftgxCharData_ * diff --git a/src/gui/GameIcon.cpp b/src/gui/GameIcon.cpp index 2e1aa73..ca051ac 100644 --- a/src/gui/GameIcon.cpp +++ b/src/gui/GameIcon.cpp @@ -41,12 +41,12 @@ GameIcon::GameIcon(const std::string & filename, GuiImageData *preloadImage) if(posVtxs) { memcpy((f32*)posVtxs, cfGameIconPosVtxs, sizeof(cfGameIconPosVtxs)); - GX2Invalidate(GX2_INVALIDATE_CPU_ATTRIB_BUFFER, (f32*)posVtxs, sizeof(cfGameIconPosVtxs)); + GX2Invalidate(GX2_INVALIDATE_MODE_CPU_ATTRIBUTE_BUFFER, (f32*)posVtxs, sizeof(cfGameIconPosVtxs)); } if(texCoords) { memcpy((f32*)texCoords, cfGameIconTexCoords, sizeof(cfGameIconTexCoords)); - GX2Invalidate(GX2_INVALIDATE_CPU_ATTRIB_BUFFER, (f32*)texCoords, sizeof(cfGameIconTexCoords)); + GX2Invalidate(GX2_INVALIDATE_MODE_CPU_ATTRIBUTE_BUFFER, (f32*)texCoords, sizeof(cfGameIconTexCoords)); } //! create vertexes for the mirror frame @@ -59,7 +59,7 @@ GameIcon::GameIcon(const std::string & filename, GuiImageData *preloadImage) texCoordsMirror[i*2 + 0] = texCoords[i*2 + 0] * cfIconMirrorScale - ((cfIconMirrorScale - 1.0f) - (cfIconMirrorScale - 1.0f) * 0.5f); texCoordsMirror[i*2 + 1] = texCoords[i*2 + 1] * cfIconMirrorScale - ((cfIconMirrorScale - 1.0f) - (cfIconMirrorScale - 1.0f) * 0.5f); } - GX2Invalidate(GX2_INVALIDATE_CPU_ATTRIB_BUFFER, texCoordsMirror, sizeof(cfGameIconTexCoords)); + GX2Invalidate(GX2_INVALIDATE_MODE_CPU_ATTRIBUTE_BUFFER, texCoordsMirror, sizeof(cfGameIconTexCoords)); } //! setup stroke of the icon @@ -67,7 +67,7 @@ GameIcon::GameIcon(const std::string & filename, GuiImageData *preloadImage) if(strokePosVtxs) { memcpy(strokePosVtxs, cfGameIconStrokeVtxs, sizeof(cfGameIconStrokeVtxs)); - GX2Invalidate(GX2_INVALIDATE_CPU_ATTRIB_BUFFER, strokePosVtxs, sizeof(cfGameIconStrokeVtxs)); + GX2Invalidate(GX2_INVALIDATE_MODE_CPU_ATTRIBUTE_BUFFER, strokePosVtxs, sizeof(cfGameIconStrokeVtxs)); } strokeTexCoords = (f32*)memalign(GX2_VERTEX_BUFFER_ALIGNMENT, cuGameIconStrokeVtxCount * Shader::cuTexCoordAttrSize); if(strokeTexCoords) @@ -77,14 +77,14 @@ GameIcon::GameIcon(const std::string & filename, GuiImageData *preloadImage) strokeTexCoords[n] = (1.0f + strokePosVtxs[i]) * 0.5f; strokeTexCoords[n+1] = 1.0f - (1.0f + strokePosVtxs[i+1]) * 0.5f; } - GX2Invalidate(GX2_INVALIDATE_CPU_ATTRIB_BUFFER, strokeTexCoords, cuGameIconStrokeVtxCount * Shader::cuTexCoordAttrSize); + GX2Invalidate(GX2_INVALIDATE_MODE_CPU_ATTRIBUTE_BUFFER, strokeTexCoords, cuGameIconStrokeVtxCount * Shader::cuTexCoordAttrSize); } strokeColorVtxs = (u8*)memalign(GX2_VERTEX_BUFFER_ALIGNMENT, cuGameIconStrokeVtxCount * Shader::cuColorAttrSize); if(strokeColorVtxs) { for(size_t i = 0; i < (cuGameIconStrokeVtxCount * Shader::cuColorAttrSize); i++) strokeColorVtxs[i] = 0xff; - GX2Invalidate(GX2_INVALIDATE_CPU_ATTRIB_BUFFER, strokeColorVtxs, cuGameIconStrokeVtxCount * Shader::cuColorAttrSize); + GX2Invalidate(GX2_INVALIDATE_MODE_CPU_ATTRIBUTE_BUFFER, strokeColorVtxs, cuGameIconStrokeVtxCount * Shader::cuColorAttrSize); } } @@ -236,14 +236,14 @@ void GameIcon::draw(CVideo *pVideo, const glm::mat4 & projectionMtx, const glm:: Shader3D::instance()->setModelViewMtx(m_iconView); Shader3D::instance()->setColorIntensity(colorIntensity); Shader3D::instance()->setAttributeBuffer(vtxCount, posVtxs, texCoords); - Shader3D::instance()->draw(GX2_PRIMITIVE_QUADS, vtxCount); + Shader3D::instance()->draw(GX2_PRIMITIVE_MODE_QUADS, vtxCount); } if(bSelected) { strokeFractalEnable = 0; - GX2SetDepthOnlyControl(GX2_ENABLE, GX2_DISABLE, GX2_COMPARE_LEQUAL); + GX2SetDepthOnlyControl(GX2_ENABLE, GX2_DISABLE, GX2_COMPARE_FUNC_LEQUAL); m_strokeView = glm::scale(m_iconView, glm::vec3(selectionBlurOuterSize, selectionBlurOuterSize, 0.0f)); ShaderFractalColor::instance()->setShaders(); ShaderFractalColor::instance()->setProjectionMtx(projectionMtx); @@ -260,7 +260,7 @@ void GameIcon::draw(CVideo *pVideo, const glm::mat4 & projectionMtx, const glm:: ShaderFractalColor::instance()->setBlurBorder(selectionBlurInnerBorderSize); ShaderFractalColor::instance()->setColorIntensity(selectionBlurInnerColorIntensity); ShaderFractalColor::instance()->draw(); - GX2SetDepthOnlyControl(GX2_ENABLE, GX2_ENABLE, GX2_COMPARE_LEQUAL); + GX2SetDepthOnlyControl(GX2_ENABLE, GX2_ENABLE, GX2_COMPARE_FUNC_LEQUAL); } if(iDraw == RENDER_NORMAL && bRenderStroke) @@ -280,7 +280,7 @@ void GameIcon::draw(CVideo *pVideo, const glm::mat4 & projectionMtx, const glm:: ShaderFractalColor::instance()->setColorIntensity(colorIntensity); ShaderFractalColor::instance()->setAlphaFadeOut(*alphaFadeOut); ShaderFractalColor::instance()->setAttributeBuffer(cuGameIconStrokeVtxCount, strokePosVtxs, strokeTexCoords, strokeColorVtxs); - ShaderFractalColor::instance()->draw(GX2_PRIMITIVE_LINE_STRIP, cuGameIconStrokeVtxCount); + ShaderFractalColor::instance()->draw(GX2_PRIMITIVE_MODE_LINE_STRIP, cuGameIconStrokeVtxCount); } @@ -294,7 +294,7 @@ void GameIcon::draw(CVideo *pVideo, const glm::mat4 & projectionMtx, const glm:: Shader3D::instance()->setModelViewMtx(m_mirrorView); Shader3D::instance()->setColorIntensity(colorIntensityMirror); Shader3D::instance()->setAttributeBuffer(vtxCount, posVtxs, texCoordsMirror); - Shader3D::instance()->draw(GX2_PRIMITIVE_QUADS, vtxCount); + Shader3D::instance()->draw(GX2_PRIMITIVE_MODE_QUADS, vtxCount); if(bIconLast) { @@ -309,7 +309,7 @@ void GameIcon::draw(CVideo *pVideo, const glm::mat4 & projectionMtx, const glm:: Shader3D::instance()->setModelViewMtx(m_iconView); Shader3D::instance()->setColorIntensity(colorIntensity); Shader3D::instance()->setAttributeBuffer(vtxCount, posVtxs, texCoords); - Shader3D::instance()->draw(GX2_PRIMITIVE_QUADS, vtxCount); + Shader3D::instance()->draw(GX2_PRIMITIVE_MODE_QUADS, vtxCount); } //! return back normal culling diff --git a/src/gui/GridBackground.cpp b/src/gui/GridBackground.cpp index d027ab8..64f7c7e 100644 --- a/src/gui/GridBackground.cpp +++ b/src/gui/GridBackground.cpp @@ -25,7 +25,7 @@ GridBackground::GridBackground(GuiImageData *img) m_posVtxs[i++] = 1.0f; m_posVtxs[i++] = 0.0f; m_posVtxs[i++] = 1.0f; m_posVtxs[i++] = 1.0f; m_posVtxs[i++] = 0.0f; m_posVtxs[i++] = -1.0f; m_posVtxs[i++] = -1.0f; m_posVtxs[i++] = 0.0f; m_posVtxs[i++] = -1.0f; - GX2Invalidate(GX2_INVALIDATE_CPU_ATTRIB_BUFFER, m_posVtxs, vtxCount * Shader3D::cuVertexAttrSize); + GX2Invalidate(GX2_INVALIDATE_MODE_CPU_ATTRIBUTE_BUFFER, m_posVtxs, vtxCount * Shader3D::cuVertexAttrSize); } if(m_texCoords) @@ -50,7 +50,7 @@ GridBackground::GridBackground(GuiImageData *img) m_texCoords[i*2 + 1] = texCoordVec[i][1]; } - GX2Invalidate(GX2_INVALIDATE_CPU_ATTRIB_BUFFER, m_texCoords, vtxCount * Shader3D::cuTexCoordAttrSize); + GX2Invalidate(GX2_INVALIDATE_MODE_CPU_ATTRIBUTE_BUFFER, m_texCoords, vtxCount * Shader3D::cuTexCoordAttrSize); } //! assign to internal variables which are const but oh well @@ -96,5 +96,5 @@ void GridBackground::draw(CVideo *pVideo, const glm::mat4 & modelView) Shader3D::instance()->setAlphaFadeOut(alphaFadeOut); Shader3D::instance()->setColorIntensity(colorIntensity); Shader3D::instance()->setAttributeBuffer(vtxCount, posVtxs, texCoords); - Shader3D::instance()->draw(GX2_PRIMITIVE_QUADS, vtxCount); + Shader3D::instance()->draw(GX2_PRIMITIVE_MODE_QUADS, vtxCount); } diff --git a/src/gui/GuiButton.cpp b/src/gui/GuiButton.cpp index ae05a8d..bd5c6ee 100644 --- a/src/gui/GuiButton.cpp +++ b/src/gui/GuiButton.cpp @@ -15,7 +15,6 @@ * along with this program. If not, see . ****************************************************************************/ #include "GuiButton.h" -#include "GuiTrigger.h" #include "GuiController.h" /** @@ -162,14 +161,12 @@ void GuiButton::draw(CVideo *v) return; // draw image - if((isDrawOverOnlyWhenSelected() && (isStateSet(STATE_SELECTED) && imageOver)) || - (!isDrawOverOnlyWhenSelected() && (isStateSet(STATE_OVER | STATE_SELECTED | STATE_CLICKED | STATE_HELD) && imageOver))) + if(isStateSet(STATE_OVER | STATE_SELECTED | STATE_CLICKED | STATE_HELD) && imageOver) imageOver->draw(v); else if(image) image->draw(v); - if((isDrawOverOnlyWhenSelected() && (isStateSet(STATE_SELECTED) && iconOver)) || - (!isDrawOverOnlyWhenSelected() && (isStateSet(STATE_OVER | STATE_SELECTED | STATE_CLICKED | STATE_HELD) && iconOver))) + if(isStateSet(STATE_OVER | STATE_SELECTED | STATE_CLICKED | STATE_HELD) && iconOver) iconOver->draw(v); else if(icon) icon->draw(v); @@ -186,9 +183,9 @@ void GuiButton::draw(CVideo *v) void GuiButton::update(GuiController * c) { - if(!c || isStateSet(STATE_DISABLED|STATE_HIDDEN|STATE_DISABLE_INPUT, c->chan)) + if(!c || isStateSet(STATE_DISABLED, c->chan) || isStateSet(STATE_HIDDEN, c->chan)) return; - else if(parentElement && (parentElement->isStateSet(STATE_DISABLED|STATE_HIDDEN|STATE_DISABLE_INPUT, c->chan))) + else if(parentElement && (parentElement->isStateSet(STATE_DISABLED, c->chan) || parentElement->isStateSet(STATE_HIDDEN, c->chan))) return; if(selectable) @@ -239,10 +236,9 @@ void GuiButton::update(GuiController * c) // button triggers if(clickable) { + bool isClicked = trigger[i]->clicked(c); - int isClicked = trigger[i]->clicked(c); - - if( !clickedTrigger && (isClicked != GuiTrigger::CLICKED_NONE) + if( !clickedTrigger && isClicked && (trigger[i]->isClickEverywhere() || (isStateSet(STATE_SELECTED | STATE_OVER, c->chan) && trigger[i]->isSelectionClickEverywhere()) || this->isInside(c->data.x, c->data.y))) { if(soundClick) @@ -250,23 +246,16 @@ void GuiButton::update(GuiController * c) clickedTrigger = trigger[i]; - if(!isStateSet(STATE_CLICKED, c->chan)){ - if(isClicked == GuiTrigger::CLICKED_TOUCH){ - setState(STATE_CLICKED_TOUCH, c->chan); - }else{ - setState(STATE_CLICKED, c->chan); - } - } + if(!isStateSet(STATE_CLICKED, c->chan)) + setState(STATE_CLICKED, c->chan); clicked(this, c, trigger[i]); } - else if((isStateSet(STATE_CLICKED, c->chan) || isStateSet(STATE_CLICKED_TOUCH, c->chan)) && (clickedTrigger == trigger[i]) && !isStateSet(STATE_HELD, c->chan) && !trigger[i]->held(c) && ((isClicked == GuiTrigger::CLICKED_NONE) || trigger[i]->released(c))) + else if(isStateSet(STATE_CLICKED, c->chan) && (clickedTrigger == trigger[i]) && !isStateSet(STATE_HELD, c->chan) && !trigger[i]->held(c) && (!isClicked || trigger[i]->released(c))) { - if((isStateSet(STATE_CLICKED_TOUCH, c->chan) && this->isInside(c->data.x, c->data.y)) || (isStateSet(STATE_CLICKED, c->chan))){ - clickedTrigger = NULL; - clearState(STATE_CLICKED, c->chan); - released(this, c, trigger[i]); - } + clickedTrigger = NULL; + clearState(STATE_CLICKED, c->chan); + released(this, c, trigger[i]); } } diff --git a/src/gui/GuiButton.h b/src/gui/GuiButton.h index 0e08d42..7755812 100644 --- a/src/gui/GuiButton.h +++ b/src/gui/GuiButton.h @@ -85,7 +85,7 @@ class GuiButton : public GuiElement //!Constantly called to allow the GuiButton to respond to updated input data //!\param t Pointer to a GuiTrigger, containing the current input data from PAD/WPAD void update(GuiController * c); - + sigslot::signal2 selected; sigslot::signal2 deSelected; sigslot::signal2 pointedOn; @@ -94,7 +94,7 @@ class GuiButton : public GuiElement sigslot::signal3 held; sigslot::signal3 released; protected: - static const int iMaxGuiTriggers = 10; + static const int iMaxGuiTriggers = 7; GuiImage * image; //!< Button image (default) GuiImage * imageOver; //!< Button image for STATE_SELECTED diff --git a/src/gui/GuiElement.cpp b/src/gui/GuiElement.cpp index e79253b..e1061d9 100644 --- a/src/gui/GuiElement.cpp +++ b/src/gui/GuiElement.cpp @@ -42,7 +42,6 @@ GuiElement::GuiElement() selectable = false; clickable = false; holdable = false; - drawOverOnlyWhenSelected = false; visible = true; yoffsetDyn = 0; xoffsetDyn = 0; diff --git a/src/gui/GuiElement.h b/src/gui/GuiElement.h index 6ae9261..941818a 100644 --- a/src/gui/GuiElement.h +++ b/src/gui/GuiElement.h @@ -19,7 +19,6 @@ #include #include -#include #include #include #include @@ -28,11 +27,11 @@ #include #include +#include "common/types.h" #include "sigslot.h" #include "glm/glm.hpp" #include "glm/gtc/matrix_transform.hpp" -#include "dynamic_libs/gx2_types.h" #include "resources/Resources.h" #include "system/AsyncDeleter.h" #include "utils/logger.h" diff --git a/src/gui/GuiFrame.cpp b/src/gui/GuiFrame.cpp index ac37917..77552c8 100644 --- a/src/gui/GuiFrame.cpp +++ b/src/gui/GuiFrame.cpp @@ -51,9 +51,16 @@ void GuiFrame::append(GuiElement* e) if (e == NULL) return; - remove(e); - elements.push_back(e); - e->setParent(this); + e->setParent(this); + + ListChangeElement elem; + elem.addElement = true; + elem.position = -1; + elem.element = e; + + queueMutex.lock(); + listChangeQueue.push(elem); + queueMutex.unlock(); } void GuiFrame::insert(GuiElement* e, u32 index) @@ -61,9 +68,16 @@ void GuiFrame::insert(GuiElement* e, u32 index) if (e == NULL || (index >= elements.size())) return; - remove(e); - elements.insert(elements.begin()+index, e); - e->setParent(this); + e->setParent(this); + + ListChangeElement elem; + elem.addElement = true; + elem.position = index; + elem.element = e; + + queueMutex.lock(); + listChangeQueue.push(elem); + queueMutex.unlock(); } void GuiFrame::remove(GuiElement* e) @@ -71,14 +85,14 @@ void GuiFrame::remove(GuiElement* e) if (e == NULL) return; - for (u32 i = 0; i < elements.size(); ++i) - { - if(e == elements[i]) - { - elements.erase(elements.begin()+i); - break; - } - } + ListChangeElement elem; + elem.addElement = false; + elem.position = -1; + elem.element = e; + + queueMutex.lock(); + listChangeQueue.push(elem); + queueMutex.unlock(); } void GuiFrame::removeAll() @@ -185,34 +199,21 @@ void GuiFrame::draw(CVideo * v) void GuiFrame::updateEffects() { - if(!this->isVisible() && parentElement) - return; + if(this->isVisible() || parentElement) + { + GuiElement::updateEffects(); - GuiElement::updateEffects(); + //! render appended items next frame but allow stop of render if size is reached + u32 size = elements.size(); - //! render appended items next frame but allow stop of render if size is reached - u32 size = elements.size(); + for (u32 i = 0; i < size && i < elements.size(); ++i) + { + elements[i]->updateEffects(); + } + } - for (u32 i = 0; i < size && i < elements.size(); ++i) - { - elements[i]->updateEffects(); - } -} - -void GuiFrame::process() -{ - if(!this->isVisible() && parentElement) - return; - - GuiElement::process(); - - //! render appended items next frame but allow stop of render if size is reached - u32 size = elements.size(); - - for (u32 i = 0; i < size && i < elements.size(); ++i) - { - elements[i]->process(); - } + //! at the end of main loop which this function represents append pending elements + updateElementList(); } void GuiFrame::update(GuiController * c) @@ -228,3 +229,39 @@ void GuiFrame::update(GuiController * c) elements[i]->update(c); } } + +void GuiFrame::updateElementList(void) +{ + if(listChangeQueue.empty() == false) + { + queueMutex.lock(); + while(!listChangeQueue.empty()) + { + ListChangeElement & listChange = listChangeQueue.front(); + + for (u32 i = 0; i < elements.size(); ++i) + { + if(listChange.element == elements[i]) + { + elements.erase(elements.begin()+i); + break; + } + } + + if(listChange.addElement) + { + if(listChange.position >= 0) + { + elements.insert(elements.begin()+listChange.position, listChange.element); + } + else + { + elements.push_back(listChange.element); + } + } + listChangeQueue.pop(); + } + queueMutex.unlock(); + } + +} diff --git a/src/gui/GuiFrame.h b/src/gui/GuiFrame.h index e0a5c36..2a1eeee 100644 --- a/src/gui/GuiFrame.h +++ b/src/gui/GuiFrame.h @@ -84,8 +84,6 @@ class GuiFrame : public GuiElement virtual void exec() {} //!virtual updateEffects which is called by the main loop virtual void updateEffects(); - //!virtual process which is called by the main loop - virtual void process(); //! Signals //! On Closing sigslot::signal1 closing; @@ -93,6 +91,17 @@ class GuiFrame : public GuiElement bool dim; //! Enable/disable dim of a window only GuiFrame *parent; //!< Parent Window std::vector elements; //!< Contains all elements within the GuiFrame + + void updateElementList(void); + + struct ListChangeElement + { + bool addElement; + int position; + GuiElement *element; + }; + std::queue listChangeQueue; + CMutex queueMutex; }; #endif diff --git a/src/gui/GuiImage.cpp b/src/gui/GuiImage.cpp index 344b770..d80001d 100644 --- a/src/gui/GuiImage.cpp +++ b/src/gui/GuiImage.cpp @@ -92,7 +92,7 @@ void GuiImage::internalInit(int w, int h) posVtxs = NULL; texCoords = NULL; vtxCount = 4; - primitive = GX2_PRIMITIVE_QUADS; + primitive = GX2_PRIMITIVE_MODE_QUADS; imageAngle = 0.0f; blurDirection = glm::vec3(0.0f); @@ -120,7 +120,7 @@ GX2Color GuiImage::getPixel(int x, int y) return (GX2Color){0, 0, 0, 0}; u32 pitch = imageData->getTexture()->surface.pitch; - u32 *imagePtr = (u32*)imageData->getTexture()->surface.image_data; + u32 *imagePtr = (u32*)imageData->getTexture()->surface.image; u32 color_u32 = imagePtr[y * pitch + x]; GX2Color color; @@ -138,7 +138,7 @@ void GuiImage::setPixel(int x, int y, const GX2Color & color) u32 pitch = imageData->getTexture()->surface.pitch; - u32 *imagePtr = (u32*)imageData->getTexture()->surface.image_data; + u32 *imagePtr = (u32*)imageData->getTexture()->surface.image; imagePtr[y * pitch + x] = (color.r << 24) | (color.g << 16) | (color.b << 8) | (color.a << 0); } @@ -260,7 +260,7 @@ void GuiImage::draw(CVideo *pVideo) // } if(colorVtxsDirty && colorVtxs) { //! flush color vertex only on main GX2 thread - GX2Invalidate(GX2_INVALIDATE_CPU_ATTRIB_BUFFER, colorVtxs, colorCount * ColorShader::cuColorAttrSize); + GX2Invalidate(GX2_INVALIDATE_MODE_CPU_ATTRIBUTE_BUFFER, colorVtxs, colorCount * ColorShader::cuColorAttrSize); colorVtxsDirty = false; } diff --git a/src/gui/GuiImageAsync.cpp b/src/gui/GuiImageAsync.cpp index f798997..78208b9 100644 --- a/src/gui/GuiImageAsync.cpp +++ b/src/gui/GuiImageAsync.cpp @@ -55,7 +55,7 @@ GuiImageAsync::~GuiImageAsync() if (imgData) delete imgData; - //threadExit(); + threadExit(); } void GuiImageAsync::threadAddImage(GuiImageAsync *Image) @@ -117,7 +117,7 @@ void GuiImageAsync::guiImageAsyncThread(CThread *thread, void *arg) int iResult = LoadFileToMem(pInUse->filename.c_str(), &buffer, &bufferSize); if(iResult > 0) { - pInUse->imgData = new GuiImageData(buffer, bufferSize, GX2_TEX_CLAMP_MIRROR); + pInUse->imgData = new GuiImageData(buffer, bufferSize, GX2_TEX_CLAMP_MODE_MIRROR); //! free original image buffer which is converted to texture now and not needed anymore free(buffer); @@ -138,7 +138,7 @@ void GuiImageAsync::guiImageAsyncThread(CThread *thread, void *arg) pInUse->imgData = NULL; } } - pInUse->imageLoaded(pInUse); + pInUse = NULL; } } @@ -159,10 +159,9 @@ void GuiImageAsync::threadInit() void GuiImageAsync::threadExit() { - if(threadRefCounter) - --threadRefCounter; + --threadRefCounter; - if(/*(threadRefCounter == 0) &&*/ (pThread != NULL)) + if((threadRefCounter == 0) && (pThread != NULL)) { bExitRequested = true; delete pThread; diff --git a/src/gui/GuiImageAsync.h b/src/gui/GuiImageAsync.h index bf2622a..939a2c6 100644 --- a/src/gui/GuiImageAsync.h +++ b/src/gui/GuiImageAsync.h @@ -21,7 +21,6 @@ #include "GuiImage.h" #include "system/CThread.h" #include "system/CMutex.h" -#include "dynamic_libs/os_functions.h" class GuiImageAsync : public GuiImage { @@ -34,13 +33,9 @@ class GuiImageAsync : public GuiImage static void removeFromQueue(GuiImageAsync * image) { threadRemoveImage(image); } - - //! don't forget to LOCK GUI if using this asynchron call - sigslot::signal1 imageLoaded; - static void threadExit(); - private: static void threadInit(); + static void threadExit(); GuiImageData *imgData; std::string filename; diff --git a/src/gui/GuiImageData.cpp b/src/gui/GuiImageData.cpp index 7e9a790..b0c51af 100644 --- a/src/gui/GuiImageData.cpp +++ b/src/gui/GuiImageData.cpp @@ -18,6 +18,8 @@ #include #include "GuiImageData.h" #include "system/memory.h" +#include "video/CVideo.h" +#include "common/gx2_ext.h" /** * Constructor for the GuiImageData class. */ @@ -31,7 +33,7 @@ GuiImageData::GuiImageData() /** * Constructor for the GuiImageData class. */ -GuiImageData::GuiImageData(const u8 * img, int imgSize, int textureClamp, int textureFormat) +GuiImageData::GuiImageData(const u8 * img, int imgSize, GX2TexClampMode textureClamp, GX2SurfaceFormat textureFormat) { texture = NULL; sampler = NULL; @@ -49,19 +51,19 @@ GuiImageData::~GuiImageData() void GuiImageData::releaseData(void) { if(texture) { - if(texture->surface.image_data) + if(texture->surface.image) { switch(memoryType) { default: case eMemTypeMEM2: - free(texture->surface.image_data); + free(texture->surface.image); break; case eMemTypeMEM1: - MEM1_free(texture->surface.image_data); + MEM1_free(texture->surface.image); break; case eMemTypeMEMBucket: - MEMBucket_free(texture->surface.image_data); + MEMBucket_free(texture->surface.image); break; } } @@ -74,7 +76,7 @@ void GuiImageData::releaseData(void) } } -void GuiImageData::loadImage(const u8 *img, int imgSize, int textureClamp, int textureFormat) +void GuiImageData::loadImage(const u8 *img, int imgSize, GX2TexClampMode textureClamp, GX2SurfaceFormat textureFormat) { if(!img || (imgSize < 8)) return; @@ -87,12 +89,12 @@ void GuiImageData::loadImage(const u8 *img, int imgSize, int textureClamp, int t //! not needed for now therefore comment out to safe ELF size //! if needed uncomment, adds 200 kb to the ELF size // IMAGE_JPEG - gdImg = gdImageCreateFromJpegPtr(imgSize, (u8*) img); + //gdImg = gdImageCreateFromJpegPtr(imgSize, (u8*) img); } else if (img[0] == 'B' && img[1] == 'M') { // IMAGE_BMP - gdImg = gdImageCreateFromBmpPtr(imgSize, (u8*) img); + //gdImg = gdImageCreateFromBmpPtr(imgSize, (u8*) img); } else if (img[0] == 0x89 && img[1] == 'P' && img[2] == 'N' && img[3] == 'G') { @@ -103,7 +105,7 @@ void GuiImageData::loadImage(const u8 *img, int imgSize, int textureClamp, int t else if(img[0] == 0x00) { // Try loading TGA image - gdImg = gdImageCreateFromTgaPtr(imgSize, (u8*) img); + //gdImg = gdImageCreateFromTgaPtr(imgSize, (u8*) img); } if(gdImg == 0) @@ -114,10 +116,10 @@ void GuiImageData::loadImage(const u8 *img, int imgSize, int textureClamp, int t //! Initialize texture texture = new GX2Texture; - GX2InitTexture(texture, width, height, 1, 0, textureFormat, GX2_SURFACE_DIM_2D, GX2_TILE_MODE_LINEAR_ALIGNED); + GX2InitTexture(texture, width, height, 1, 0, textureFormat, GX2_SURFACE_DIM_TEXTURE_2D, GX2_TILE_MODE_LINEAR_ALIGNED); //! if this fails something went horribly wrong - if(texture->surface.image_size == 0) { + if(texture->surface.imageSize == 0) { delete texture; texture = NULL; gdImageDestroy(gdImg); @@ -126,35 +128,35 @@ void GuiImageData::loadImage(const u8 *img, int imgSize, int textureClamp, int t //! allocate memory for the surface memoryType = eMemTypeMEM2; - texture->surface.image_data = memalign(texture->surface.align, texture->surface.image_size); + texture->surface.image = memalign(texture->surface.alignment, texture->surface.imageSize); //! try MEM1 on failure - if(!texture->surface.image_data) { + if(!texture->surface.image) { memoryType = eMemTypeMEM1; - texture->surface.image_data = MEM1_alloc(texture->surface.image_size, texture->surface.align); + texture->surface.image = MEM1_alloc(texture->surface.imageSize, texture->surface.alignment); } //! try MEM bucket on failure - if(!texture->surface.image_data) { + if(!texture->surface.image) { memoryType = eMemTypeMEMBucket; - texture->surface.image_data = MEMBucket_alloc(texture->surface.image_size, texture->surface.align); + texture->surface.image = MEMBucket_alloc(texture->surface.imageSize, texture->surface.alignment); } //! check if memory is available for image - if(!texture->surface.image_data) { + if(!texture->surface.image) { gdImageDestroy(gdImg); delete texture; texture = NULL; return; } //! set mip map data pointer - texture->surface.mip_data = NULL; + texture->surface.mipmaps = NULL; //! convert image to texture switch(textureFormat) { default: - case GX2_SURFACE_FORMAT_TCS_R8_G8_B8_A8_UNORM: - gdImageToUnormR8G8B8A8(gdImg, (u32*)texture->surface.image_data, texture->surface.width, texture->surface.height, texture->surface.pitch); + case GX2_SURFACE_FORMAT_UNORM_R8_G8_B8_A8: + gdImageToUnormR8G8B8A8(gdImg, (u32*)texture->surface.image, texture->surface.width, texture->surface.height, texture->surface.pitch); break; - case GX2_SURFACE_FORMAT_TCS_R5_G6_B5_UNORM: - gdImageToUnormR5G6B5(gdImg, (u16*)texture->surface.image_data, texture->surface.width, texture->surface.height, texture->surface.pitch); + case GX2_SURFACE_FORMAT_UNORM_R5_G6_B5: + gdImageToUnormR5G6B5(gdImg, (u16*)texture->surface.image, texture->surface.width, texture->surface.height, texture->surface.pitch); break; } @@ -162,10 +164,10 @@ void GuiImageData::loadImage(const u8 *img, int imgSize, int textureClamp, int t gdImageDestroy(gdImg); //! invalidate the memory - GX2Invalidate(GX2_INVALIDATE_CPU_TEXTURE, texture->surface.image_data, texture->surface.image_size); + GX2Invalidate(GX2_INVALIDATE_MODE_CPU_TEXTURE, texture->surface.image, texture->surface.imageSize); //! initialize the sampler sampler = new GX2Sampler; - GX2InitSampler(sampler, textureClamp, GX2_TEX_XY_FILTER_BILINEAR); + GX2InitSampler(sampler, textureClamp, GX2_TEX_XY_FILTER_MODE_LINEAR); } void GuiImageData::gdImageToUnormR8G8B8A8(gdImagePtr gdImg, u32 *imgBuffer, u32 width, u32 height, u32 pitch) diff --git a/src/gui/GuiImageData.h b/src/gui/GuiImageData.h index 03bc1df..78781ca 100644 --- a/src/gui/GuiImageData.h +++ b/src/gui/GuiImageData.h @@ -17,9 +17,10 @@ #ifndef GUI_IMAGEDATA_H_ #define GUI_IMAGEDATA_H_ -#include #include -#include "dynamic_libs/gx2_functions.h" +#include +#include +#include #include "system/AsyncDeleter.h" class GuiImageData : public AsyncDeleter::Element @@ -29,13 +30,13 @@ public: GuiImageData(); //!\param img Image data //!\param imgSize The image size - GuiImageData(const u8 * img, int imgSize, int textureClamp = GX2_TEX_CLAMP_CLAMP, int textureFormat = GX2_SURFACE_FORMAT_TCS_R8_G8_B8_A8_UNORM); + GuiImageData(const u8 * img, int imgSize, GX2TexClampMode textureClamp = GX2_TEX_CLAMP_MODE_CLAMP, GX2SurfaceFormat textureFormat = GX2_SURFACE_FORMAT_UNORM_R8_G8_B8_A8); //!Destructor virtual ~GuiImageData(); //!Load image from buffer //!\param img Image data //!\param imgSize The image size - void loadImage(const u8 * img, int imgSize, int textureClamp = GX2_TEX_CLAMP_CLAMP, int textureFormat = GX2_SURFACE_FORMAT_TCS_R8_G8_B8_A8_UNORM); + void loadImage(const u8 * img, int imgSize, GX2TexClampMode textureClamp = GX2_TEX_CLAMP_MODE_CLAMP, GX2SurfaceFormat textureFormat = GX2_SURFACE_FORMAT_UNORM_R8_G8_B8_A8); //! getter functions const GX2Texture * getTexture() const { return texture; }; const GX2Sampler * getSampler() const { return sampler; }; diff --git a/src/gui/GuiParticleImage.cpp b/src/gui/GuiParticleImage.cpp index e39930f..2cfe527 100644 --- a/src/gui/GuiParticleImage.cpp +++ b/src/gui/GuiParticleImage.cpp @@ -51,8 +51,8 @@ GuiParticleImage::GuiParticleImage(int w, int h, u32 particleCount) colorVertexs[i * 4 + 2] = 0xff; colorVertexs[i * 4 + 3] = 0xff; } - GX2Invalidate(GX2_INVALIDATE_CPU_ATTRIB_BUFFER, posVertexs, ColorShader::cuVertexAttrSize * CIRCLE_VERTEX_COUNT); - GX2Invalidate(GX2_INVALIDATE_CPU_ATTRIB_BUFFER, colorVertexs, ColorShader::cuColorAttrSize * CIRCLE_VERTEX_COUNT); + GX2Invalidate(GX2_INVALIDATE_MODE_CPU_ATTRIBUTE_BUFFER, posVertexs, ColorShader::cuVertexAttrSize * CIRCLE_VERTEX_COUNT); + GX2Invalidate(GX2_INVALIDATE_MODE_CPU_ATTRIBUTE_BUFFER, colorVertexs, ColorShader::cuColorAttrSize * CIRCLE_VERTEX_COUNT); particles.resize(particleCount); @@ -62,8 +62,8 @@ GuiParticleImage::GuiParticleImage(int w, int h, u32 particleCount) particles[i].position.y = getRandMinusOneToOneF32() * getHeight() * 0.5f; particles[i].position.z = 0.0f; particles[i].colors = glm::vec4(1.0f, 1.0f, 1.0f, (getRandZeroToOneF32() * 0.6f) + 0.05f); - particles[i].radius = getRandZeroToOneF32() * 30.0f + 60.0f; - particles[i].speed = (getRandZeroToOneF32() * 0.4f) + 0.6f; + particles[i].radius = getRandZeroToOneF32() * 30.0f; + particles[i].speed = (getRandZeroToOneF32() * 0.6f) + 0.2f; particles[i].direction = getRandMinusOneToOneF32(); } } @@ -97,8 +97,8 @@ void GuiParticleImage::draw(CVideo *pVideo) particles[i].position.x = getRandMinusOneToOneF32() * getWidth() * 0.5f; particles[i].position.y = -getHeight() * 0.5f - 30.0f; particles[i].colors = glm::vec4(1.0f, 1.0f, 1.0f, (getRandZeroToOneF32() * 0.6f) + 0.05f); - particles[i].radius = getRandZeroToOneF32() * 30.0f + 60.0f; - particles[i].speed = (getRandZeroToOneF32() * 0.4f) + 0.6f; + particles[i].radius = getRandZeroToOneF32() * 30.0f; + particles[i].speed = (getRandZeroToOneF32() * 0.6f) + 0.2f; particles[i].direction = getRandMinusOneToOneF32(); } if(particles[i].position.x < (-getWidth() * 0.5f - 50.0f)) @@ -123,6 +123,6 @@ void GuiParticleImage::draw(CVideo *pVideo) ColorShader::instance()->setOffset(positionOffsets); ColorShader::instance()->setScale(scaleFactor); ColorShader::instance()->setColorIntensity(colorIntensity * particles[i].colors); - ColorShader::instance()->draw(GX2_PRIMITIVE_TRIANGLE_FAN, CIRCLE_VERTEX_COUNT); + ColorShader::instance()->draw(GX2_PRIMITIVE_MODE_TRIANGLE_FAN, CIRCLE_VERTEX_COUNT); } } diff --git a/src/gui/GuiSound.cpp b/src/gui/GuiSound.cpp index 502a8a2..90fa9dd 100644 --- a/src/gui/GuiSound.cpp +++ b/src/gui/GuiSound.cpp @@ -16,7 +16,6 @@ ****************************************************************************/ #include "GuiSound.h" #include "sounds/SoundHandler.hpp" -#include "dynamic_libs/os_functions.h" GuiSound::GuiSound(const char * filepath) { diff --git a/src/gui/GuiSound.h b/src/gui/GuiSound.h index bb72a3b..b63e40f 100644 --- a/src/gui/GuiSound.h +++ b/src/gui/GuiSound.h @@ -17,7 +17,7 @@ #ifndef GUI_SOUND_H_ #define GUI_SOUND_H_ -#include +#include "common/types.h" #include "system/AsyncDeleter.h" //!Sound conversion and playback. A wrapper for other sound libraries - ASND, libmad, ltremor, etc @@ -28,7 +28,7 @@ class GuiSound : public AsyncDeleter::Element //!\param sound Pointer to the sound data //!\param filesize Length of sound data GuiSound(const char * filepath); - GuiSound(const u8 * sound, int length); + GuiSound(const u8 * sound, s32 length); //!Destructor virtual ~GuiSound(); //!Load a file and replace the old one diff --git a/src/gui/GuiText.cpp b/src/gui/GuiText.cpp index ab54e42..f9efaec 100644 --- a/src/gui/GuiText.cpp +++ b/src/gui/GuiText.cpp @@ -14,9 +14,9 @@ * You should have received a copy of the GNU General Public License * along with this program. If not, see . ****************************************************************************/ -#include "GuiText.h" -#include "FreeTypeGX.h" #include "video/CVideo.h" +#include "FreeTypeGX.h" +#include "GuiText.h" FreeTypeGX * GuiText::presentFont = NULL; int GuiText::presetSize = 28; diff --git a/src/gui/GuiText.h b/src/gui/GuiText.h index 5fb8acd..2aa2d5e 100644 --- a/src/gui/GuiText.h +++ b/src/gui/GuiText.h @@ -17,6 +17,7 @@ #ifndef GUI_TEXT_H_ #define GUI_TEXT_H_ +#include "common/gx2_ext.h" #include "GuiElement.h" //!Forward declaration class FreeTypeGX; diff --git a/src/gui/GuiTrigger.cpp b/src/gui/GuiTrigger.cpp index 74e9d05..a4a172c 100644 --- a/src/gui/GuiTrigger.cpp +++ b/src/gui/GuiTrigger.cpp @@ -107,22 +107,22 @@ bool GuiTrigger::down(const GuiController *controller) const return false; } -int GuiTrigger::clicked(const GuiController *controller) const +bool GuiTrigger::clicked(const GuiController *controller) const { if((controller->chan & chan) == 0) { - return CLICKED_NONE; + return false; } - int bResult = CLICKED_NONE; + bool bResult = false; if(controller->data.touched && controller->data.validPointer && (btns & VPAD_TOUCH) && !controller->lastData.touched) { - bResult = CLICKED_TOUCH; + bResult = true; } if(controller->data.buttons_d & btns) { - bResult = CLICKED_BUTTON; + bResult = true; } return bResult; } diff --git a/src/gui/GuiTrigger.h b/src/gui/GuiTrigger.h index ea84b67..46a50e1 100644 --- a/src/gui/GuiTrigger.h +++ b/src/gui/GuiTrigger.h @@ -17,18 +17,12 @@ #ifndef GUI_TRIGGER_H_ #define GUI_TRIGGER_H_ -#include "dynamic_libs/os_functions.h" - +#include "common/types.h" //!Menu input trigger management. Determine if action is neccessary based on input data by comparing controller input data to a specific trigger element. class GuiTrigger { public: - enum eClicked{ - CLICKED_NONE = 0x00, - CLICKED_TOUCH = 0x01, - CLICKED_BUTTON = 0x02, - }; enum eChannels { CHANNEL_1 = 0x01, CHANNEL_2 = 0x02, @@ -91,7 +85,7 @@ public: bool right(const GuiController *controller) const; bool up(const GuiController *controller) const; bool down(const GuiController *controller) const; - int clicked(const GuiController *controller) const; + bool clicked(const GuiController *controller) const; bool held(const GuiController *controller) const; bool released(const GuiController *controller) const; private: diff --git a/src/gui/VPadController.h b/src/gui/VPadController.h index 5223774..83e437d 100644 --- a/src/gui/VPadController.h +++ b/src/gui/VPadController.h @@ -17,8 +17,8 @@ #ifndef VPAD_CONTROLLER_H_ #define VPAD_CONTROLLER_H_ +#include #include "GuiController.h" -#include "dynamic_libs/vpad_functions.h" class VPadController : public GuiController { @@ -37,27 +37,26 @@ public: { lastData = data; - int vpadError = -1; + VPADReadError vpadError = VPAD_READ_NO_SAMPLES; VPADRead(0, &vpad, 1, &vpadError); - if(vpadError == 0) + if(vpadError == VPAD_READ_SUCCESS) { - data.buttons_r = vpad.btns_r; - data.buttons_h = vpad.btns_h; - data.buttons_d = vpad.btns_d; - data.validPointer = !vpad.tpdata.invalid; - data.touched = vpad.tpdata.touched; + data.buttons_r = vpad.release; + data.buttons_h = vpad.hold; + data.buttons_d = vpad.trigger; + data.validPointer = !vpad.tpNormal.validity; + data.touched = vpad.tpNormal.touched; //! calculate the screen offsets - data.x = -(width >> 1) + ((int)(vpad.tpdata1.x * ((width)/1211.0f)*width) >> 12)-30; - data.y = -(height >> 1) + ((int)(vpad.tpdata1.y * ((height)/653.0f)*height) >> 12)-35; - + data.x = -(width >> 1) + (int)((vpad.tpFiltered1.x * width) >> 12); + data.y = (height >> 1) - (int)(height - ((vpad.tpFiltered1.y * height) >> 12)); return true; } return false; } private: - VPADData vpad; + VPADStatus vpad; }; #endif diff --git a/src/kernel/kernel_functions.c b/src/kernel/kernel_functions.c deleted file mode 100644 index 31f9ad0..0000000 --- a/src/kernel/kernel_functions.c +++ /dev/null @@ -1,49 +0,0 @@ -#include -#include "common/common.h" -#include "common/kernel_defs.h" -#include "kernel/kernel_functions.h" -#include "kernel/syscalls.h" - -/* our retain data */ -ReducedCosAppXmlInfo cosAppXmlInfoStruct __attribute__((section(".data"))); -/* - * This function is a kernel hook function. It is called directly from kernel code at position 0xFFF18558. - */ -void my_PrepareTitle(CosAppXmlInfo *xmlKernelInfo) -{ - /** - * DBAT for access to our data region is setup at this point for the 0xC0000000 area. - */ - - //! Copy all data from the XML info - strncpy(cosAppXmlInfoStruct.rpx_name, xmlKernelInfo->rpx_name, FS_MAX_ENTNAME_SIZE); - - cosAppXmlInfoStruct.version_cos_xml = xmlKernelInfo->version_cos_xml; - cosAppXmlInfoStruct.os_version = xmlKernelInfo->os_version; - cosAppXmlInfoStruct.title_id = xmlKernelInfo->title_id; - cosAppXmlInfoStruct.app_type = xmlKernelInfo->app_type; - cosAppXmlInfoStruct.cmdFlags = xmlKernelInfo->cmdFlags; - cosAppXmlInfoStruct.max_size = xmlKernelInfo->max_size; - cosAppXmlInfoStruct.avail_size = xmlKernelInfo->avail_size; - cosAppXmlInfoStruct.codegen_size = xmlKernelInfo->codegen_size; - cosAppXmlInfoStruct.codegen_core = xmlKernelInfo->codegen_core; - cosAppXmlInfoStruct.max_codesize = xmlKernelInfo->max_codesize; - cosAppXmlInfoStruct.overlay_arena = xmlKernelInfo->overlay_arena; - cosAppXmlInfoStruct.default_stack0_size = xmlKernelInfo->default_stack0_size; - cosAppXmlInfoStruct.default_stack1_size = xmlKernelInfo->default_stack1_size; - cosAppXmlInfoStruct.default_stack2_size = xmlKernelInfo->default_stack2_size; - cosAppXmlInfoStruct.default_redzone0_size = xmlKernelInfo->default_redzone0_size; - cosAppXmlInfoStruct.default_redzone1_size = xmlKernelInfo->default_redzone1_size; - cosAppXmlInfoStruct.default_redzone2_size = xmlKernelInfo->default_redzone2_size; - cosAppXmlInfoStruct.exception_stack0_size = xmlKernelInfo->exception_stack0_size; - cosAppXmlInfoStruct.exception_stack1_size = xmlKernelInfo->exception_stack1_size; - cosAppXmlInfoStruct.exception_stack2_size = xmlKernelInfo->exception_stack2_size; - cosAppXmlInfoStruct.sdk_version = xmlKernelInfo->sdk_version; - cosAppXmlInfoStruct.title_version = xmlKernelInfo->title_version; -} - -void SetupKernelCallback(void) -{ - KernelSetupSyscalls(); -} - diff --git a/src/kernel/kernel_functions.h b/src/kernel/kernel_functions.h deleted file mode 100644 index 79b89e4..0000000 --- a/src/kernel/kernel_functions.h +++ /dev/null @@ -1,19 +0,0 @@ -#ifndef __KERNEL_FUNCTIONS_H_ -#define __KERNEL_FUNCTIONS_H_ - -#ifdef __cplusplus -extern "C" { -#endif - -#include "common/kernel_defs.h" -#include "syscalls.h" - -void SetupKernelCallback(void); - -extern ReducedCosAppXmlInfo cosAppXmlInfoStruct; - -#ifdef __cplusplus -} -#endif - -#endif // __KERNEL_FUNCTIONS_H_ diff --git a/src/kernel/kernel_hooks.S b/src/kernel/kernel_hooks.S deleted file mode 100644 index 04452c4..0000000 --- a/src/kernel/kernel_hooks.S +++ /dev/null @@ -1,136 +0,0 @@ -# Created by dimok -# This stuff may need a change in different kernel versions -# This is only needed when launched directly through browser and not SD card. - -.section ".kernel_code" - .globl SaveAndResetDataBATs_And_SRs_hook -SaveAndResetDataBATs_And_SRs_hook: - # setup CTR to the position we need to return to - mflr r5 - mtctr r5 - # set link register to its original value - mtlr r7 - # setup us a nice DBAT for our code data with same region as our code - mfspr r5, 560 - mtspr 570, r5 - mfspr r5, 561 - mtspr 571, r5 - # restore the original kernel instructions that we replaced - lwz r5, 0x34(r3) - lwz r6, 0x38(r3) - lwz r7, 0x3C(r3) - lwz r8, 0x40(r3) - lwz r9, 0x44(r3) - lwz r10, 0x48(r3) - lwz r11, 0x4C(r3) - lwz r3, 0x50(r3) - isync - mtsr 7, r5 - # jump back to the position in kernel after our patch (from LR) - bctr - -.extern my_PrepareTitle - .globl my_PrepareTitle_hook -my_PrepareTitle_hook: - # store all registers on stack to avoid issues with the call to C functions - stwu r1, -0x90(r1) - # registers for our own usage - # only need r31 and rest is from tests before, just leaving it for later tests - stw r28, 0x20(r1) - stw r29, 0x24(r1) - stw r30, 0x28(r1) - stw r31, 0x2C(r1) - - stw r3, 0x30(r1) - stw r4, 0x34(r1) - stw r5, 0x38(r1) - stw r6, 0x3C(r1) - stw r7, 0x40(r1) - stw r8, 0x44(r1) - stw r9, 0x48(r1) - stw r10, 0x4C(r1) - stw r11, 0x50(r1) - stw r12, 0x54(r1) - stw r13, 0x58(r1) - stw r14, 0x5C(r1) - stw r15, 0x60(r1) - stw r16, 0x64(r1) - stw r17, 0x68(r1) - stw r18, 0x6C(r1) - stw r19, 0x70(r1) - stw r20, 0x74(r1) - stw r21, 0x78(r1) - stw r22, 0x7C(r1) - - # save original DBAT registers - mfdbatu r28, 0 - mfdbatl r29, 0 - - # setup access to our data memory range - lis r3, 0xC000 - ori r3, r3, 0x1FFF - mtdbatu 0, r3 - lis r3, 0x3000 - ori r3, r3, 0x0012 - mtdbatl 0, r3 - - # memory barrier - eieio - isync - - # save the LR from where we came - mflr r31 - - # the cos.xml/app.xml structure is at the location 0x68 of r11 - # there are actually many places that can be hooked for it - # e.g. 0xFFF16130 and r27 points to this structure - addi r3, r11, 0x68 - - bl my_PrepareTitle - - # restore original DBAT registers - mtdbatu 0, r28 - mtdbatl 0, r29 - - # memory barrier - eieio - isync - - # setup LR to jump back to kernel code - mtlr r31 - - # restore all original values of registers from stack - lwz r28, 0x20(r1) - lwz r29, 0x24(r1) - lwz r30, 0x28(r1) - lwz r31, 0x2C(r1) - - lwz r3, 0x30(r1) - lwz r4, 0x34(r1) - lwz r5, 0x38(r1) - lwz r6, 0x3C(r1) - lwz r7, 0x40(r1) - lwz r8, 0x44(r1) - lwz r9, 0x48(r1) - lwz r10, 0x4C(r1) - lwz r11, 0x50(r1) - lwz r12, 0x54(r1) - lwz r13, 0x58(r1) - lwz r14, 0x5C(r1) - lwz r15, 0x60(r1) - lwz r16, 0x64(r1) - lwz r17, 0x68(r1) - lwz r18, 0x6C(r1) - lwz r19, 0x70(r1) - lwz r20, 0x74(r1) - lwz r21, 0x78(r1) - lwz r22, 0x7C(r1) - - # restore the stack - addi r1, r1, 0x90 - - # restore original instruction that we replaced in the kernel - clrlwi r7, r12, 0 - - # jump back - blr diff --git a/src/kernel/syscalls.c b/src/kernel/syscalls.c deleted file mode 100644 index 9685e4a..0000000 --- a/src/kernel/syscalls.c +++ /dev/null @@ -1,255 +0,0 @@ -#include "common/os_defs.h" -#include "common/kernel_defs.h" -#include "common/common.h" -#include "dynamic_libs/os_functions.h" -#include "utils/utils.h" -#include "syscalls.h" - -extern void my_PrepareTitle_hook(void); - -static unsigned int origPrepareTitleInstr __attribute__((section(".data"))) = 0; - -static void KernelCopyData(unsigned int addr, unsigned int src, unsigned int len) -{ - /* - * Setup a DBAT access with cache inhibited to write through and read directly from memory - */ - unsigned int dbatu0, dbatl0, dbatu1, dbatl1; - // save the original DBAT value - asm volatile("mfdbatu %0, 0" : "=r" (dbatu0)); - asm volatile("mfdbatl %0, 0" : "=r" (dbatl0)); - asm volatile("mfdbatu %0, 1" : "=r" (dbatu1)); - asm volatile("mfdbatl %0, 1" : "=r" (dbatl1)); - - unsigned int target_dbatu0 = 0; - unsigned int target_dbatl0 = 0; - unsigned int target_dbatu1 = 0; - unsigned int target_dbatl1 = 0; - - unsigned char *dst_p = (unsigned char*)addr; - unsigned char *src_p = (unsigned char*)src; - - // we only need DBAT modification for addresses out of our own DBAT range - // as our own DBAT is available everywhere for user and supervisor - // since our own DBAT is on DBAT5 position we don't collide here - if(addr < 0x00800000 || addr >= 0x01000000) - { - target_dbatu0 = (addr & 0x00F00000) | 0xC0000000 | 0x1F; - target_dbatl0 = (addr & 0xFFF00000) | 0x32; - asm volatile("mtdbatu 0, %0" : : "r" (target_dbatu0)); - asm volatile("mtdbatl 0, %0" : : "r" (target_dbatl0)); - dst_p = (unsigned char*)((addr & 0xFFFFFF) | 0xC0000000); - } - if(src < 0x00800000 || src >= 0x01000000) - { - target_dbatu1 = (src & 0x00F00000) | 0xB0000000 | 0x1F; - target_dbatl1 = (src & 0xFFF00000) | 0x32; - - asm volatile("mtdbatu 1, %0" : : "r" (target_dbatu1)); - asm volatile("mtdbatl 1, %0" : : "r" (target_dbatl1)); - src_p = (unsigned char*)((src & 0xFFFFFF) | 0xB0000000); - } - - asm volatile("eieio; isync"); - - unsigned int i; - for(i = 0; i < len; i++) - { - // if we are on the edge to next chunk - if((target_dbatu0 != 0) && (((unsigned int)dst_p & 0x00F00000) != (target_dbatu0 & 0x00F00000))) - { - target_dbatu0 = ((addr + i) & 0x00F00000) | 0xC0000000 | 0x1F; - target_dbatl0 = ((addr + i) & 0xFFF00000) | 0x32; - dst_p = (unsigned char*)(((addr + i) & 0xFFFFFF) | 0xC0000000); - - asm volatile("eieio; isync"); - asm volatile("mtdbatu 0, %0" : : "r" (target_dbatu0)); - asm volatile("mtdbatl 0, %0" : : "r" (target_dbatl0)); - asm volatile("eieio; isync"); - } - if((target_dbatu1 != 0) && (((unsigned int)src_p & 0x00F00000) != (target_dbatu1 & 0x00F00000))) - { - target_dbatu1 = ((src + i) & 0x00F00000) | 0xB0000000 | 0x1F; - target_dbatl1 = ((src + i) & 0xFFF00000) | 0x32; - src_p = (unsigned char*)(((src + i) & 0xFFFFFF) | 0xB0000000); - - asm volatile("eieio; isync"); - asm volatile("mtdbatu 1, %0" : : "r" (target_dbatu1)); - asm volatile("mtdbatl 1, %0" : : "r" (target_dbatl1)); - asm volatile("eieio; isync"); - } - - *dst_p = *src_p; - - ++dst_p; - ++src_p; - } - - /* - * Restore original DBAT value - */ - asm volatile("eieio; isync"); - asm volatile("mtdbatu 0, %0" : : "r" (dbatu0)); - asm volatile("mtdbatl 0, %0" : : "r" (dbatl0)); - asm volatile("mtdbatu 1, %0" : : "r" (dbatu1)); - asm volatile("mtdbatl 1, %0" : : "r" (dbatl1)); - asm volatile("eieio; isync"); -} - -static void KernelReadDBATs(bat_table_t * table) -{ - u32 i = 0; - - asm volatile("eieio; isync"); - - asm volatile("mfspr %0, 536" : "=r" (table->bat[i].h)); - asm volatile("mfspr %0, 537" : "=r" (table->bat[i].l)); - i++; - asm volatile("mfspr %0, 538" : "=r" (table->bat[i].h)); - asm volatile("mfspr %0, 539" : "=r" (table->bat[i].l)); - i++; - asm volatile("mfspr %0, 540" : "=r" (table->bat[i].h)); - asm volatile("mfspr %0, 541" : "=r" (table->bat[i].l)); - i++; - asm volatile("mfspr %0, 542" : "=r" (table->bat[i].h)); - asm volatile("mfspr %0, 543" : "=r" (table->bat[i].l)); - i++; - - asm volatile("mfspr %0, 568" : "=r" (table->bat[i].h)); - asm volatile("mfspr %0, 569" : "=r" (table->bat[i].l)); - i++; - asm volatile("mfspr %0, 570" : "=r" (table->bat[i].h)); - asm volatile("mfspr %0, 571" : "=r" (table->bat[i].l)); - i++; - asm volatile("mfspr %0, 572" : "=r" (table->bat[i].h)); - asm volatile("mfspr %0, 573" : "=r" (table->bat[i].l)); - i++; - asm volatile("mfspr %0, 574" : "=r" (table->bat[i].h)); - asm volatile("mfspr %0, 575" : "=r" (table->bat[i].l)); -} - -static void KernelWriteDBATs(bat_table_t * table) -{ - u32 i = 0; - - asm volatile("eieio; isync"); - - asm volatile("mtspr 536, %0" : : "r" (table->bat[i].h)); - asm volatile("mtspr 537, %0" : : "r" (table->bat[i].l)); - i++; - asm volatile("mtspr 538, %0" : : "r" (table->bat[i].h)); - asm volatile("mtspr 539, %0" : : "r" (table->bat[i].l)); - i++; - asm volatile("mtspr 540, %0" : : "r" (table->bat[i].h)); - asm volatile("mtspr 541, %0" : : "r" (table->bat[i].l)); - i++; - asm volatile("mtspr 542, %0" : : "r" (table->bat[i].h)); - asm volatile("mtspr 543, %0" : : "r" (table->bat[i].l)); - i++; - - asm volatile("mtspr 568, %0" : : "r" (table->bat[i].h)); - asm volatile("mtspr 569, %0" : : "r" (table->bat[i].l)); - i++; - asm volatile("mtspr 570, %0" : : "r" (table->bat[i].h)); - asm volatile("mtspr 571, %0" : : "r" (table->bat[i].l)); - i++; - asm volatile("mtspr 572, %0" : : "r" (table->bat[i].h)); - asm volatile("mtspr 573, %0" : : "r" (table->bat[i].l)); - i++; - asm volatile("mtspr 574, %0" : : "r" (table->bat[i].h)); - asm volatile("mtspr 575, %0" : : "r" (table->bat[i].l)); - - asm volatile("eieio; isync"); -} - -/* Read a 32-bit word with kernel permissions */ -uint32_t __attribute__ ((noinline)) kern_read(const void *addr) -{ - uint32_t result; - asm volatile ( - "li 3,1\n" - "li 4,0\n" - "li 5,0\n" - "li 6,0\n" - "li 7,0\n" - "lis 8,1\n" - "mr 9,%1\n" - "li 0,0x3400\n" - "mr %0,1\n" - "sc\n" - "nop\n" - "mr 1,%0\n" - "mr %0,3\n" - : "=r"(result) - : "b"(addr) - : "memory", "ctr", "lr", "0", "3", "4", "5", "6", "7", "8", "9", "10", - "11", "12" - ); - - return result; -} - -/* Write a 32-bit word with kernel permissions */ -void __attribute__ ((noinline)) kern_write(void *addr, uint32_t value) -{ - asm volatile ( - "li 3,1\n" - "li 4,0\n" - "mr 5,%1\n" - "li 6,0\n" - "li 7,0\n" - "lis 8,1\n" - "mr 9,%0\n" - "mr %1,1\n" - "li 0,0x3500\n" - "sc\n" - "nop\n" - "mr 1,%1\n" - : - : "r"(addr), "r"(value) - : "memory", "ctr", "lr", "0", "3", "4", "5", "6", "7", "8", "9", "10", - "11", "12" - ); -} - -void KernelSetupSyscalls(void) -{ - //! assign 1 so that this variable gets into the retained .data section - static uint8_t ucSyscallsSetupRequired = 1; - if(!ucSyscallsSetupRequired) - return; - - ucSyscallsSetupRequired = 0; - - kern_write((void*)(OS_SPECIFICS->addr_KernSyscallTbl1 + (0x36 * 4)), (unsigned int)KernelReadDBATs); - kern_write((void*)(OS_SPECIFICS->addr_KernSyscallTbl2 + (0x36 * 4)), (unsigned int)KernelReadDBATs); - kern_write((void*)(OS_SPECIFICS->addr_KernSyscallTbl3 + (0x36 * 4)), (unsigned int)KernelReadDBATs); - kern_write((void*)(OS_SPECIFICS->addr_KernSyscallTbl4 + (0x36 * 4)), (unsigned int)KernelReadDBATs); - kern_write((void*)(OS_SPECIFICS->addr_KernSyscallTbl5 + (0x36 * 4)), (unsigned int)KernelReadDBATs); - - kern_write((void*)(OS_SPECIFICS->addr_KernSyscallTbl1 + (0x37 * 4)), (unsigned int)KernelWriteDBATs); - kern_write((void*)(OS_SPECIFICS->addr_KernSyscallTbl2 + (0x37 * 4)), (unsigned int)KernelWriteDBATs); - kern_write((void*)(OS_SPECIFICS->addr_KernSyscallTbl3 + (0x37 * 4)), (unsigned int)KernelWriteDBATs); - kern_write((void*)(OS_SPECIFICS->addr_KernSyscallTbl4 + (0x37 * 4)), (unsigned int)KernelWriteDBATs); - kern_write((void*)(OS_SPECIFICS->addr_KernSyscallTbl5 + (0x37 * 4)), (unsigned int)KernelWriteDBATs); - - kern_write((void*)(OS_SPECIFICS->addr_KernSyscallTbl1 + (0x25 * 4)), (unsigned int)KernelCopyData); - kern_write((void*)(OS_SPECIFICS->addr_KernSyscallTbl2 + (0x25 * 4)), (unsigned int)KernelCopyData); - kern_write((void*)(OS_SPECIFICS->addr_KernSyscallTbl3 + (0x25 * 4)), (unsigned int)KernelCopyData); - kern_write((void*)(OS_SPECIFICS->addr_KernSyscallTbl4 + (0x25 * 4)), (unsigned int)KernelCopyData); - kern_write((void*)(OS_SPECIFICS->addr_KernSyscallTbl5 + (0x25 * 4)), (unsigned int)KernelCopyData); - - //! write our hook to the - u32 addr_my_PrepareTitle_hook = ((u32)my_PrepareTitle_hook) | 0x48000003; - DCFlushRange(&addr_my_PrepareTitle_hook, sizeof(addr_my_PrepareTitle_hook)); - - SC0x25_KernelCopyData((u32)&origPrepareTitleInstr, (u32)addr_PrepareTitle_hook, 4); - SC0x25_KernelCopyData((u32)addr_PrepareTitle_hook, (u32)OSEffectiveToPhysical(&addr_my_PrepareTitle_hook), 4); -} - - -void KernelRestoreInstructions(void) -{ - if(origPrepareTitleInstr != 0) - SC0x25_KernelCopyData((u32)addr_PrepareTitle_hook, (u32)&origPrepareTitleInstr, 4); -} diff --git a/src/kernel/syscalls.h b/src/kernel/syscalls.h deleted file mode 100644 index 344fa39..0000000 --- a/src/kernel/syscalls.h +++ /dev/null @@ -1,26 +0,0 @@ - -#ifndef __SYSCALLS_H_ -#define __SYSCALLS_H_ - -#ifdef __cplusplus -extern "C" { -#endif - -#include -#include "common/kernel_defs.h" - -void KernelSetupSyscalls(void); -void KernelRestoreInstructions(void); - -void SC0x25_KernelCopyData(unsigned int addr, unsigned int src, unsigned int len); -void SC0x36_KernelReadDBATs(bat_table_t * table); -void SC0x37_KernelWriteDBATs(bat_table_t * table); - -uint32_t __attribute__ ((noinline)) kern_read(const void *addr); -void __attribute__ ((noinline)) kern_write(void *addr, uint32_t value); - -#ifdef __cplusplus -} -#endif - -#endif // __KERNEL_FUNCTIONS_H_ diff --git a/src/kernel/syscalls_asm.S b/src/kernel/syscalls_asm.S deleted file mode 100644 index 60bf1fa..0000000 --- a/src/kernel/syscalls_asm.S +++ /dev/null @@ -1,20 +0,0 @@ -# Created by dimok -# Syscalls for kernel that we use - - .globl SC0x36_KernelReadDBATs -SC0x36_KernelReadDBATs: - li r0, 0x3600 - sc - blr - - .globl SC0x37_KernelWriteDBATs -SC0x37_KernelWriteDBATs: - li r0, 0x3700 - sc - blr - - .globl SC0x25_KernelCopyData -SC0x25_KernelCopyData: - li r0, 0x2500 - sc - blr diff --git a/src/link.ld b/src/link.ld index 30737dc..61f4721 100644 --- a/src/link.ld +++ b/src/link.ld @@ -1,4 +1,4 @@ -OUTPUT(hidtovpad.elf); +OUTPUT(flappy_bird.elf); /* Tell linker where our application entry is so the garbage collect can work correct */ ENTRY(__entry_menu); @@ -6,10 +6,7 @@ ENTRY(__entry_menu); SECTIONS { . = 0x00802000; .text : { - *(.kernel_code*); *(.text*); - /* Tell linker to not garbage collect this section as it is not referenced anywhere */ - KEEP(*(.kernel_code*)); } .rodata : { *(.rodata*); diff --git a/src/main.cpp b/src/main.cpp index f1fd6c3..8b6624a 100644 --- a/src/main.cpp +++ b/src/main.cpp @@ -1,65 +1,37 @@ +#include #include "Application.h" -#include "dynamic_libs/os_functions.h" -#include "dynamic_libs/gx2_functions.h" -#include "dynamic_libs/syshid_functions.h" -#include "dynamic_libs/vpad_functions.h" -#include "dynamic_libs/padscore_functions.h" -#include "dynamic_libs/socket_functions.h" -#include "dynamic_libs/sys_functions.h" -#include "dynamic_libs/ax_functions.h" -#include "dynamic_libs/fs_functions.h" -#include "fs/fs_utils.h" -#include "fs/sd_fat_devoptab.h" #include "system/memory.h" #include "utils/logger.h" #include "utils/utils.h" +#include "dynamic_libs/padscore_functions.h" #include "common/common.h" -#include "main.h" -#include "common/common.h" - -#include "utils/logger.h" - -#include "system/memory.h" - /* Entry point */ -extern "C" int Menu_Main(void){ +extern "C" int Menu_Main(void) +{ //!******************************************************************* //! Initialize function pointers * //!******************************************************************* + socket_lib_init(); //! do OS (for acquire) and sockets first so we got logging - InitOSFunctionPointers(); - InitSocketFunctionPointers(); - InitGX2FunctionPointers(); - InitSysFunctionPointers(); - InitVPadFunctionPointers(); - InitPadScoreFunctionPointers(); - InitAXFunctionPointers(); - InitFSFunctionPointers(); - log_init("192.168.1.12"); - //Otherwise apply the patches!!! - log_printf("GX2_template\n\n"); + InitPadScoreFunctionPointers(); + log_printf("Function exports loaded\n"); + + log_print("Initialize memory management\n"); + memoryInitialize(); //!******************************************************************* //! Initialize heap memory * //!******************************************************************* - log_print("Initialize memory management\n"); - memoryInitialize(); - log_printf("Mount SD partition\n"); - mount_sd_fat("sd"); log_printf("Start main application\n"); Application::instance()->exec(); Application::destroyInstance(); - log_printf("Unmount SD\n"); - unmount_sd_fat("sd"); - memoryRelease(); - - log_print("Going back to the Homebrew launcher\n"); - - log_deinit(); + + log_deinit(); + return EXIT_SUCCESS; } diff --git a/src/main.h b/src/main.h index a0fb71e..4204cd6 100644 --- a/src/main.h +++ b/src/main.h @@ -2,7 +2,6 @@ #define _MAIN_H_ #include "common/types.h" -#include "dynamic_libs/os_functions.h" /* Main */ #ifdef __cplusplus @@ -11,7 +10,7 @@ extern "C" { //! C wrapper for our C++ functions int Menu_Main(void); -void deInit(void); + #ifdef __cplusplus } #endif diff --git a/src/menu/MainWindow.cpp b/src/menu/MainWindow.cpp index e7f55ab..22300f5 100644 --- a/src/menu/MainWindow.cpp +++ b/src/menu/MainWindow.cpp @@ -17,8 +17,6 @@ ****************************************************************************/ #include "MainWindow.h" #include "MainWindowTV.h" -#include "dynamic_libs/os_functions.h" -#include "dynamic_libs/socket_functions.h" #include "Application.h" #include "utils/StringTools.h" #include "utils/logger.h" diff --git a/src/resources/Resources.cpp b/src/resources/Resources.cpp index eabee60..87e9d21 100644 --- a/src/resources/Resources.cpp +++ b/src/resources/Resources.cpp @@ -1,4 +1,3 @@ -#include #include #include #include "Resources.h" diff --git a/src/resources/Resources.h b/src/resources/Resources.h index 3d0921b..6aba197 100644 --- a/src/resources/Resources.h +++ b/src/resources/Resources.h @@ -1,8 +1,8 @@ #ifndef RECOURCES_H_ #define RECOURCES_H_ - #include +#include "common/types.h" //! forward declaration class GuiImageData; diff --git a/src/resources/filelist.h b/src/resources/filelist.h index c5646f3..6c9dd11 100644 --- a/src/resources/filelist.h +++ b/src/resources/filelist.h @@ -9,111 +9,110 @@ #ifndef _FILELIST_H_ #define _FILELIST_H_ -#include - typedef struct _RecourceFile { - const char *filename; - const u8 *DefaultFile; - const u32 &DefaultFileSize; - u8 *CustomFile; - u32 CustomFileSize; + const char *filename; + const unsigned char *DefaultFile; + const unsigned int &DefaultFileSize; + unsigned char *CustomFile; + unsigned int CustomFileSize; } RecourceFile; -extern const u8 bg_back_png[]; -extern const u32 bg_back_png_size; +extern const unsigned char bgMusic_ogg[]; +extern const unsigned int bgMusic_ogg_size; -extern const u8 bg_front_png[]; -extern const u32 bg_front_png_size; +extern const unsigned char bg_back_png[]; +extern const unsigned int bg_back_png_size; -extern const u8 bgMusic_ogg[]; -extern const u32 bgMusic_ogg_size; +extern const unsigned char bg_front_png[]; +extern const unsigned int bg_front_png_size; -extern const u8 button_click_mp3[]; -extern const u32 button_click_mp3_size; +extern const unsigned char button_click_mp3[]; +extern const unsigned int button_click_mp3_size; -extern const u8 flappy_bird_1_png[]; -extern const u32 flappy_bird_1_png_size; +extern const unsigned char flappy_bird_1_png[]; +extern const unsigned int flappy_bird_1_png_size; -extern const u8 flappy_bird_2_png[]; -extern const u32 flappy_bird_2_png_size; +extern const unsigned char flappy_bird_2_png[]; +extern const unsigned int flappy_bird_2_png_size; -extern const u8 flappy_bird_3_png[]; -extern const u32 flappy_bird_3_png_size; +extern const unsigned char flappy_bird_3_png[]; +extern const unsigned int flappy_bird_3_png_size; -extern const u8 flappy_bird_4_png[]; -extern const u32 flappy_bird_4_png_size; +extern const unsigned char flappy_bird_4_png[]; +extern const unsigned int flappy_bird_4_png_size; -extern const u8 font_big_0_png[]; -extern const u32 font_big_0_png_size; +extern const unsigned char font_ttf[]; +extern const unsigned int font_ttf_size; -extern const u8 font_big_1_png[]; -extern const u32 font_big_1_png_size; +extern const unsigned char font_big_0_png[]; +extern const unsigned int font_big_0_png_size; -extern const u8 font_big_2_png[]; -extern const u32 font_big_2_png_size; +extern const unsigned char font_big_1_png[]; +extern const unsigned int font_big_1_png_size; -extern const u8 font_big_3_png[]; -extern const u32 font_big_3_png_size; +extern const unsigned char font_big_2_png[]; +extern const unsigned int font_big_2_png_size; -extern const u8 font_big_4_png[]; -extern const u32 font_big_4_png_size; +extern const unsigned char font_big_3_png[]; +extern const unsigned int font_big_3_png_size; -extern const u8 font_big_5_png[]; -extern const u32 font_big_5_png_size; +extern const unsigned char font_big_4_png[]; +extern const unsigned int font_big_4_png_size; -extern const u8 font_big_6_png[]; -extern const u32 font_big_6_png_size; +extern const unsigned char font_big_5_png[]; +extern const unsigned int font_big_5_png_size; -extern const u8 font_big_7_png[]; -extern const u32 font_big_7_png_size; +extern const unsigned char font_big_6_png[]; +extern const unsigned int font_big_6_png_size; -extern const u8 font_big_8_png[]; -extern const u32 font_big_8_png_size; +extern const unsigned char font_big_7_png[]; +extern const unsigned int font_big_7_png_size; -extern const u8 font_big_9_png[]; -extern const u32 font_big_9_png_size; +extern const unsigned char font_big_8_png[]; +extern const unsigned int font_big_8_png_size; -extern const u8 font_big_null_png[]; -extern const u32 font_big_null_png_size; +extern const unsigned char font_big_9_png[]; +extern const unsigned int font_big_9_png_size; -extern const u8 font_ttf[]; -extern const u32 font_ttf_size; +extern const unsigned char font_big_null_png[]; +extern const unsigned int font_big_null_png_size; -extern const u8 loose_png[]; -extern const u32 loose_png_size; +extern const unsigned char loose_png[]; +extern const unsigned int loose_png_size; -extern const u8 pipe_down_png[]; -extern const u32 pipe_down_png_size; +extern const unsigned char pipe_down_png[]; +extern const unsigned int pipe_down_png_size; -extern const u8 pipe_up_png[]; -extern const u32 pipe_up_png_size; +extern const unsigned char pipe_up_png[]; +extern const unsigned int pipe_up_png_size; -extern const u8 sfx_die_ogg[]; -extern const u32 sfx_die_ogg_size; +extern const unsigned char sfx_die_ogg[]; +extern const unsigned int sfx_die_ogg_size; -extern const u8 sfx_point_ogg[]; -extern const u32 sfx_point_ogg_size; +extern const unsigned char sfx_point_ogg[]; +extern const unsigned int sfx_point_ogg_size; -extern const u8 sfx_swooshing_ogg[]; -extern const u32 sfx_swooshing_ogg_size; +extern const unsigned char sfx_swooshing_ogg[]; +extern const unsigned int sfx_swooshing_ogg_size; -extern const u8 sfx_wing_ogg[]; -extern const u32 sfx_wing_ogg_size; +extern const unsigned char sfx_wing_ogg[]; +extern const unsigned int sfx_wing_ogg_size; -extern const u8 splash_png[]; -extern const u32 splash_png_size; +extern const unsigned char splash_png[]; +extern const unsigned int splash_png_size; static RecourceFile RecourceList[] = { + {"bgMusic.ogg", bgMusic_ogg, bgMusic_ogg_size, NULL, 0}, {"bg_back.png", bg_back_png, bg_back_png_size, NULL, 0}, {"bg_front.png", bg_front_png, bg_front_png_size, NULL, 0}, - {"bgMusic.ogg", bgMusic_ogg, bgMusic_ogg_size, NULL, 0}, {"button_click.mp3", button_click_mp3, button_click_mp3_size, NULL, 0}, {"flappy_bird_1.png", flappy_bird_1_png, flappy_bird_1_png_size, NULL, 0}, {"flappy_bird_2.png", flappy_bird_2_png, flappy_bird_2_png_size, NULL, 0}, {"flappy_bird_3.png", flappy_bird_3_png, flappy_bird_3_png_size, NULL, 0}, {"flappy_bird_4.png", flappy_bird_4_png, flappy_bird_4_png_size, NULL, 0}, + {"font.ttf", font_ttf, font_ttf_size, NULL, 0}, {"font_big_0.png", font_big_0_png, font_big_0_png_size, NULL, 0}, {"font_big_1.png", font_big_1_png, font_big_1_png_size, NULL, 0}, {"font_big_2.png", font_big_2_png, font_big_2_png_size, NULL, 0}, @@ -125,7 +124,6 @@ static RecourceFile RecourceList[] = {"font_big_8.png", font_big_8_png, font_big_8_png_size, NULL, 0}, {"font_big_9.png", font_big_9_png, font_big_9_png_size, NULL, 0}, {"font_big_null.png", font_big_null_png, font_big_null_png_size, NULL, 0}, - {"font.ttf", font_ttf, font_ttf_size, NULL, 0}, {"loose.png", loose_png, loose_png_size, NULL, 0}, {"pipe_down.png", pipe_down_png, pipe_down_png_size, NULL, 0}, {"pipe_up.png", pipe_up_png, pipe_up_png_size, NULL, 0}, diff --git a/src/sounds/BufferCircle.cpp b/src/sounds/BufferCircle.cpp index b0ee705..ccba870 100644 --- a/src/sounds/BufferCircle.cpp +++ b/src/sounds/BufferCircle.cpp @@ -23,6 +23,7 @@ * * for WiiXplorer 2010 ***************************************************************************/ +#include #include #include "utils/utils.h" #include "BufferCircle.hpp" diff --git a/src/sounds/BufferCircle.hpp b/src/sounds/BufferCircle.hpp index b07c1c4..0502ef8 100644 --- a/src/sounds/BufferCircle.hpp +++ b/src/sounds/BufferCircle.hpp @@ -27,7 +27,7 @@ #define BUFFER_CIRCLE_HPP_ #include -#include +#include "common/types.h" class BufferCircle { diff --git a/src/sounds/Mp3Decoder.cpp b/src/sounds/Mp3Decoder.cpp index 1246b4a..48a76ed 100644 --- a/src/sounds/Mp3Decoder.cpp +++ b/src/sounds/Mp3Decoder.cpp @@ -29,7 +29,7 @@ #include #include #include -#include "dynamic_libs/os_functions.h" +#include "common/types.h" #include "Mp3Decoder.hpp" Mp3Decoder::Mp3Decoder(const char * filepath) diff --git a/src/sounds/OggDecoder.cpp b/src/sounds/OggDecoder.cpp index abb64f4..9f6c629 100644 --- a/src/sounds/OggDecoder.cpp +++ b/src/sounds/OggDecoder.cpp @@ -25,7 +25,6 @@ ***************************************************************************/ #include #include -#include "dynamic_libs/os_functions.h" #include "OggDecoder.hpp" static int ogg_read(void * punt, int bytes, int blocks, int *f) diff --git a/src/sounds/SoundDecoder.cpp b/src/sounds/SoundDecoder.cpp index e449170..057871f 100644 --- a/src/sounds/SoundDecoder.cpp +++ b/src/sounds/SoundDecoder.cpp @@ -14,11 +14,10 @@ * You should have received a copy of the GNU General Public License * along with this program. If not, see . ****************************************************************************/ -#include #include #include #include -#include "dynamic_libs/os_functions.h" +#include #include "SoundDecoder.hpp" static const u32 FixedPointShift = 15; diff --git a/src/sounds/SoundHandler.cpp b/src/sounds/SoundHandler.cpp index 68f9dd5..2d7ffad 100644 --- a/src/sounds/SoundHandler.cpp +++ b/src/sounds/SoundHandler.cpp @@ -26,7 +26,6 @@ #include #include #include "common/common.h" -#include "dynamic_libs/ax_functions.h" #include "fs/CFile.hpp" #include "SoundHandler.hpp" #include "WavDecoder.hpp" @@ -95,7 +94,11 @@ void SoundHandler::RemoveDecoder(int voice) if(voiceList[voice]->getState() != Voice::STATE_STOP) voiceList[voice]->setState(Voice::STATE_STOP); - while(voiceList[voice]->getState() != Voice::STATE_STOPPED) + // it shouldn't take longer than 3 ms actually but we wait up to 20 + // on application quit the AX frame callback is not called anymore + // therefore this would end in endless loop if no timeout is defined + int timeOut = 20; + while(--timeOut && (voiceList[voice]->getState() != Voice::STATE_STOPPED)) usleep(1000); } SoundDecoder *decoder = DecoderList[voice]; @@ -216,19 +219,16 @@ SoundDecoder * SoundHandler::GetSoundDecoder(const u8 * sound, int length) void SoundHandler::executeThread() { - // v2 sound lib can not properly end transition audio on old firmwares - if (OS_FIRMWARE >= 400 && OS_FIRMWARE <= 410) - { - ProperlyEndTransitionAudio(); - } - //! initialize 48 kHz renderer - u32 params[3] = { 1, 0, 0 }; + AXInitParams params; + memset(¶ms, 0, sizeof(params)); + params.renderer = AX_INIT_RENDERER_48KHZ; - if(AXInitWithParams != 0) - AXInitWithParams(params); - else - AXInit(); + // TODO: handle support for 3.1.0 with dynamic libs instead of static linking it + //if(AXInitWithParams != 0) + AXInitWithParams(¶ms); + //else + // AXInit(); // The problem with last voice on 500 was caused by it having priority 0 // We would need to change this priority distribution if for some reason @@ -239,7 +239,7 @@ void SoundHandler::executeThread() voiceList[i] = new Voice(priority); // allocate voice 0 with highest priority } - AXRegisterFrameCallback((void*)&axFrameCallback); + AXRegisterAppFrameCallback(SoundHandler::axFrameCallback); u16 i = 0; @@ -266,7 +266,7 @@ void SoundHandler::executeThread() for(u32 i = 0; i < MAX_DECODERS; ++i) voiceList[i]->stop(); - AXRegisterFrameCallback(NULL); + AXRegisterAppFrameCallback(NULL); AXQuit(); for(u32 i = 0; i < MAX_DECODERS; ++i) diff --git a/src/sounds/SoundHandler.hpp b/src/sounds/SoundHandler.hpp index 7b0beb6..f793332 100644 --- a/src/sounds/SoundHandler.hpp +++ b/src/sounds/SoundHandler.hpp @@ -27,7 +27,7 @@ #define SOUNDHANDLER_H_ #include -#include +#include "common/types.h" #include "system/CThread.h" #include "SoundDecoder.hpp" #include "Voice.h" diff --git a/src/sounds/Voice.h b/src/sounds/Voice.h index 63fd94e..ceb4ad7 100644 --- a/src/sounds/Voice.h +++ b/src/sounds/Voice.h @@ -17,8 +17,8 @@ #ifndef _AXSOUND_H_ #define _AXSOUND_H_ -#include "dynamic_libs/os_functions.h" -#include "dynamic_libs/ax_functions.h" +#include +#include class Voice { @@ -47,19 +47,18 @@ public: voice = AXAcquireVoice(prio, 0, 0); if(voice) { - AXVoiceBegin(voice); AXSetVoiceType(voice, 0); setVolume(0x80000000); - u32 mix[24]; + AXVoiceDeviceMixData mix[6]; memset(mix, 0, sizeof(mix)); - mix[0] = 0x80000000; - mix[4] = 0x80000000; + mix[0].bus[0].volume = 0x8000; + mix[0].bus[0].delta = 0; + mix[1].bus[0].volume = 0x8000; + mix[1].bus[0].delta = 0; AXSetVoiceDeviceMix(voice, 0, 0, mix); AXSetVoiceDeviceMix(voice, 1, 0, mix); - - AXVoiceEnd(voice); } } @@ -78,23 +77,23 @@ public: memset(&voiceBuffer, 0, sizeof(voiceBuffer)); - voiceBuffer.samples = buffer; - voiceBuffer.format = format; - voiceBuffer.loop = (nextBuffer == NULL) ? 0 : 1; - voiceBuffer.cur_pos = 0; - voiceBuffer.end_pos = bufferSize >> 1; - voiceBuffer.loop_offset = ((nextBuffer - buffer) >> 1); + voiceBuffer.data = buffer; + voiceBuffer.dataType = format; + voiceBuffer.loopingEnabled = (nextBuffer == NULL) ? 0 : 1; + voiceBuffer.currentOffset = 0; + voiceBuffer.endOffset = (bufferSize >> 1) - 1; + voiceBuffer.loopOffset = ((nextBuffer - buffer) >> 1); nextBufferSize = nextBufSize; - u32 samplesPerSec = (AXGetInputSamplesPerSec != 0) ? AXGetInputSamplesPerSec() : 32000; + // TODO: handle support for 3.1.0 with dynamic libs instead of static linking it + //u32 samplesPerSec = (AXGetInputSamplesPerSec != 0) ? AXGetInputSamplesPerSec() : 32000; + u32 samplesPerSec = AXGetInputSamplesPerSec(); - ratioBits[0] = (u32)(0x00010000 * ((f32)sampleRate / (f32)samplesPerSec)); - ratioBits[1] = 0; - ratioBits[2] = 0; - ratioBits[3] = 0; + memset(&ratioBits, 0, sizeof(ratioBits)); + ratioBits.ratio = (u32)(0x00010000 * ((f32)sampleRate / (f32)samplesPerSec)); AXSetVoiceOffsets(voice, &voiceBuffer); - AXSetVoiceSrc(voice, ratioBits); + AXSetVoiceSrc(voice, &ratioBits); AXSetVoiceSrcType(voice, 1); AXSetVoiceState(voice, 1); } @@ -108,16 +107,21 @@ public: void setVolume(u32 vol) { if(voice) - AXSetVoiceVe(voice, &vol); + { + AXVoiceVeData data; + data.volume = vol >> 16; + data.delta = vol & 0xFFFF; + AXSetVoiceVe(voice, &data); + } } void setNextBuffer(const u8 *buffer, u32 bufferSize) { - voiceBuffer.loop_offset = ((buffer - voiceBuffer.samples) >> 1); + voiceBuffer.loopOffset = ((buffer - (const u8*)voiceBuffer.data) >> 1); nextBufferSize = bufferSize; - AXSetVoiceLoopOffset(voice, voiceBuffer.loop_offset); + AXSetVoiceLoopOffset(voice, voiceBuffer.loopOffset); } bool isBufferSwitched() @@ -126,7 +130,7 @@ public: if(lastLoopCounter != loopCounter) { lastLoopCounter = loopCounter; - AXSetVoiceEndOffset(voice, voiceBuffer.loop_offset + (nextBufferSize >> 1)); + AXSetVoiceEndOffset(voice, voiceBuffer.loopOffset + (nextBufferSize >> 1) - 1); return true; } return false; @@ -149,19 +153,9 @@ public: } private: - void *voice; - u32 ratioBits[4]; - - typedef struct _ax_buffer_t { - u16 format; - u16 loop; - u32 loop_offset; - u32 end_pos; - u32 cur_pos; - const unsigned char *samples; - } ax_buffer_t; - - ax_buffer_t voiceBuffer; + AXVoice *voice; + AXVoiceSrc ratioBits; + AXVoiceOffsets voiceBuffer; u32 state; u32 nextBufferSize; u32 lastLoopCounter; diff --git a/src/system/AsyncDeleter.cpp b/src/system/AsyncDeleter.cpp index 7b69751..7776989 100644 --- a/src/system/AsyncDeleter.cpp +++ b/src/system/AsyncDeleter.cpp @@ -54,7 +54,7 @@ void AsyncDeleter::executeThread(void) while(!exitApplication) { suspendThread(); - log_printf("AsyncDeleter thread running\n"); + //! delete elements that require post process deleting //! because otherwise they would block or do invalid access on GUI thread while(!realDeleteElements.empty()) diff --git a/src/system/AsyncDeleter.h b/src/system/AsyncDeleter.h index 6cce1fa..5497ad2 100644 --- a/src/system/AsyncDeleter.h +++ b/src/system/AsyncDeleter.h @@ -26,10 +26,8 @@ class AsyncDeleter : public CThread public: static void destroyInstance() { - if(deleterInstance != NULL){ - delete deleterInstance; - deleterInstance = NULL; - } + delete deleterInstance; + deleterInstance = NULL; } class Element @@ -43,6 +41,7 @@ public: { if(!deleterInstance) deleterInstance = new AsyncDeleter; + deleterInstance->deleteElements.push(e); } diff --git a/src/system/CMutex.h b/src/system/CMutex.h index 3e7cc1b..fecd54c 100644 --- a/src/system/CMutex.h +++ b/src/system/CMutex.h @@ -18,13 +18,13 @@ #define _CMUTEX_H_ #include -#include "dynamic_libs/os_functions.h" +#include class CMutex { public: CMutex() { - pMutex = malloc(OS_MUTEX_SIZE); + pMutex = (OSMutex*) malloc(sizeof(OSMutex)); if(!pMutex) return; @@ -50,7 +50,7 @@ public: return (OSTryLockMutex(pMutex) != 0); } private: - void *pMutex; + OSMutex *pMutex; }; class CMutexLock diff --git a/src/system/CThread.h b/src/system/CThread.h index 3fade45..81d8ac2 100644 --- a/src/system/CThread.h +++ b/src/system/CThread.h @@ -17,11 +17,9 @@ #ifndef CTHREAD_H_ #define CTHREAD_H_ -#include #include #include -#include "dynamic_libs/os_functions.h" -#include "utils/logger.h" +#include class CThread { @@ -38,12 +36,12 @@ public: //! save attribute assignment iAttributes = iAttr; //! allocate the thread - pThread = memalign(8, 0x1000); + pThread = (OSThread*)memalign(8, sizeof(OSThread)); //! allocate the stack pThreadStack = (u8 *) memalign(0x20, iStackSize); //! create the thread if(pThread && pThreadStack) - OSCreateThread(pThread, &CThread::threadCallback, 1, this, (u32)pThreadStack+iStackSize, iStackSize, iPriority, iAttributes); + OSCreateThread(pThread, &CThread::threadCallback, 1, (char*)this, pThreadStack+iStackSize, iStackSize, iPriority, iAttributes); } //! destructor @@ -80,17 +78,17 @@ public: //! wait for thread to finish if(pThread && !(iAttributes & eAttributeDetach)) { - while(isThreadSuspended()){ + if(isThreadSuspended()) resumeThread(); - } + OSJoinThread(pThread, NULL); } //! free the thread stack buffer - if(pThreadStack){ + if(pThreadStack) free(pThreadStack); - } if(pThread) free(pThread); + pThread = NULL; pThreadStack = NULL; } @@ -105,14 +103,14 @@ public: eAttributePinnedAff = 0x10 }; private: - static int threadCallback(int argc, void *arg) + static int threadCallback(int argc, const char **argv) { //! After call to start() continue with the internal function - ((CThread *) arg)->executeThread(); + ((CThread *) argv)->executeThread(); return 0; } int iAttributes; - void *pThread; + OSThread *pThread; u8 *pThreadStack; Callback pCallback; void *pCallbackArg; diff --git a/src/system/exception_handler.c b/src/system/exception_handler.c index b642248..9d8a66b 100644 --- a/src/system/exception_handler.c +++ b/src/system/exception_handler.c @@ -1,6 +1,5 @@ #include -#include "dynamic_libs/os_functions.h" -#include "utils/logger.h" +#include "common/types.h" #include "exception_handler.h" #define OS_EXCEPTION_MODE_GLOBAL_ALL_CORES 4 @@ -36,6 +35,9 @@ typedef struct OSContext /* There is actually a lot more here but we don't need the rest*/ } OSContext; +#include +#include + #define CPU_STACK_TRACE_DEPTH 10 #define __stringify(rn) #rn @@ -78,11 +80,9 @@ static const char exception_print_formats[18][45] = { "%p: %08X %08X %08X %08X\n", // 17 }; -static unsigned char exception_cb(void * c, unsigned char exception_type) { +static unsigned char exception_cb(OSContext * context, unsigned char exception_type) { char buf[850]; int pos = 0; - - OSContext *context = (OSContext *) c; /* * This part is mostly from libogc. Thanks to the devs over there. */ @@ -147,7 +147,7 @@ static unsigned char exception_cb(void * c, unsigned char exception_type) { for (i = 0; i < 8; i += 4) pos += sprintf(buf + pos, exception_print_formats[17], &(pAdd[i]),pAdd[i], pAdd[i+1], pAdd[i+2], pAdd[i+3]); //} - log_print(buf); + OSFatal(buf); return 1; } @@ -163,7 +163,7 @@ static unsigned char program_exception_cb(void * context) { } void setup_os_exceptions(void) { - OSSetExceptionCallback(OS_EXCEPTION_DSI, &dsi_exception_cb); - OSSetExceptionCallback(OS_EXCEPTION_ISI, &isi_exception_cb); - OSSetExceptionCallback(OS_EXCEPTION_PROGRAM, &program_exception_cb); + OSSetExceptionCallback(OS_EXCEPTION_DSI, (OSExceptionCallbackFn)dsi_exception_cb); + OSSetExceptionCallback(OS_EXCEPTION_ISI, (OSExceptionCallbackFn)isi_exception_cb); + OSSetExceptionCallback(OS_EXCEPTION_PROGRAM, (OSExceptionCallbackFn)program_exception_cb); } diff --git a/src/system/memory.c b/src/system/memory.c index 91f5392..9d41226 100644 --- a/src/system/memory.c +++ b/src/system/memory.c @@ -16,7 +16,10 @@ ****************************************************************************/ #include #include -#include "dynamic_libs/os_functions.h" +#include +#include +#include +#include #include "common/common.h" #include "memory.h" @@ -34,48 +37,46 @@ //! Memory functions //! This is the only place where those are needed so lets keep them more or less private //!---------------------------------------------------------------------------------------------------------------------------------------------------------------------------- -extern unsigned int * pMEMAllocFromDefaultHeapEx; -extern unsigned int * pMEMAllocFromDefaultHeap; -extern unsigned int * pMEMFreeToDefaultHeap; - -extern int (* MEMGetBaseHeapHandle)(int mem_arena); -extern unsigned int (* MEMGetAllocatableSizeForFrmHeapEx)(int heap, int align); -extern void *(* MEMAllocFromFrmHeapEx)(int heap, unsigned int size, int align); -extern void (* MEMFreeToFrmHeap)(int heap, int mode); -extern void *(* MEMAllocFromExpHeapEx)(int heap, unsigned int size, int align); -extern int (* MEMCreateExpHeapEx)(void* address, unsigned int size, unsigned short flags); -extern void *(* MEMDestroyExpHeap)(int heap); -extern void (* MEMFreeToExpHeap)(int heap, void* ptr); - -static int mem1_heap = -1; -static int bucket_heap = -1; +static MEMExpandedHeap * mem1_heap = NULL; +static MEMExpandedHeap * bucket_heap = NULL; void memoryInitialize(void) { - int mem1_heap_handle = MEMGetBaseHeapHandle(MEMORY_ARENA_1); - unsigned int mem1_allocatable_size = MEMGetAllocatableSizeForFrmHeapEx(mem1_heap_handle, 4); - void *mem1_memory = MEMAllocFromFrmHeapEx(mem1_heap_handle, mem1_allocatable_size, 4); - if(mem1_memory) - mem1_heap = MEMCreateExpHeapEx(mem1_memory, mem1_allocatable_size, 0); + if(!mem1_heap) + { + MEMFrameHeap * mem1_heap_handle = MEMGetBaseHeapHandle(MEMORY_ARENA_1); + unsigned int mem1_allocatable_size = MEMGetAllocatableSizeForFrmHeapEx(mem1_heap_handle, 4); + void *mem1_memory = MEMAllocFromFrmHeapEx(mem1_heap_handle, mem1_allocatable_size, 4); + if(mem1_memory) + mem1_heap = MEMCreateExpHeapEx(mem1_memory, mem1_allocatable_size, 0); + } - int bucket_heap_handle = MEMGetBaseHeapHandle(MEMORY_ARENA_FG_BUCKET); - unsigned int bucket_allocatable_size = MEMGetAllocatableSizeForFrmHeapEx(bucket_heap_handle, 4); - void *bucket_memory = MEMAllocFromFrmHeapEx(bucket_heap_handle, bucket_allocatable_size, 4); - if(bucket_memory) - bucket_heap = MEMCreateExpHeapEx(bucket_memory, bucket_allocatable_size, 0); + if(!bucket_heap) + { + MEMFrameHeap * bucket_heap_handle = MEMGetBaseHeapHandle(MEMORY_ARENA_FG_BUCKET); + unsigned int bucket_allocatable_size = MEMGetAllocatableSizeForFrmHeapEx(bucket_heap_handle, 4); + void *bucket_memory = MEMAllocFromFrmHeapEx(bucket_heap_handle, bucket_allocatable_size, 4); + if(bucket_memory) + bucket_heap = MEMCreateExpHeapEx(bucket_memory, bucket_allocatable_size, 0); + } } void memoryRelease(void) { - MEMDestroyExpHeap(mem1_heap); - MEMFreeToFrmHeap(MEMGetBaseHeapHandle(MEMORY_ARENA_1), 3); - mem1_heap = -1; - - MEMDestroyExpHeap(bucket_heap); - MEMFreeToFrmHeap(MEMGetBaseHeapHandle(MEMORY_ARENA_FG_BUCKET), 3); - bucket_heap = -1; + if(mem1_heap) + { + MEMDestroyExpHeap(mem1_heap); + MEMFreeToFrmHeap(MEMGetBaseHeapHandle(MEMORY_ARENA_1), 3); + mem1_heap = NULL; + } + if(bucket_heap) + { + MEMDestroyExpHeap(bucket_heap); + MEMFreeToFrmHeap(MEMGetBaseHeapHandle(MEMORY_ARENA_FG_BUCKET), 3); + bucket_heap = NULL; + } } - +/* //!------------------------------------------------------------------------------------------- //! wraps //!------------------------------------------------------------------------------------------- @@ -159,18 +160,18 @@ void *__wrap__realloc_r(struct _reent *r, void *p, size_t size) { return __wrap_realloc(p, size); } - +*/ //!------------------------------------------------------------------------------------------- //! some wrappers //!------------------------------------------------------------------------------------------- void * MEM2_alloc(unsigned int size, unsigned int align) { - return __wrap_memalign(align, size); + return memalign(align, size); } void MEM2_free(void *ptr) { - __wrap_free(ptr); + free(ptr); } void * MEM1_alloc(unsigned int size, unsigned int align) diff --git a/src/system/memory_area_table.c b/src/system/memory_area_table.c new file mode 100644 index 0000000..76bcba8 --- /dev/null +++ b/src/system/memory_area_table.c @@ -0,0 +1,397 @@ +/**************************************************************************** + * Copyright (C) 2015 Dimok + * + * This program is free software: you can redistribute it and/or modify + * it under the terms of the GNU General Public License as published by + * the Free Software Foundation, either version 3 of the License, or + * (at your option) any later version. + * + * This program is distributed in the hope that it will be useful, + * but WITHOUT ANY WARRANTY; without even the implied warranty of + * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the + * GNU General Public License for more details. + * + * You should have received a copy of the GNU General Public License + * along with this program. If not, see . + ****************************************************************************/ +#include +#include +#include "common/common.h" +#include "utils/utils.h" +#include "memory_area_table.h" + +typedef struct _memory_values_t +{ + unsigned int start_address; + unsigned int end_address; +} memory_values_t; + +static const memory_values_t mem_vals_400[] = +{ + { 0x2E573BFC, 0x2FF8F83C }, // 26735 kB + { 0x2D86D318, 0x2DFFFFFC }, // 7755 kB + { 0x2CE59830, 0x2D3794D8 }, // 5247 kB + { 0x2D3795AC, 0x2D854300 }, // 4971 kB + { 0x28FEC800, 0x293B29D0 }, // 3864 kB + { 0x29BC200C, 0x29D79B94 }, // 1758 kB + { 0x2A517A68, 0x2A6794B8 }, // 1414 kB + { 0x288C1D80, 0x28A69FA0 }, // 1696 kB + + { 0, 0 } +}; + +static const memory_values_t mem_vals_410[] = +{ +// { 0x28041760, 0x28049D0C } // 33 kB +// { 0x280608F4, 0x2806C97C } // 48 kB +// { 0x280953C8, 0x280A1324 } // 47 kB +// { 0x280A1358, 0x280AD388 } // 48 kB +// { 0x280C9040, 0x280D0ABC } // 30 kB +// { 0x280D0AD8, 0x28113FBC } // 269 kB +// { 0x2812575C, 0x2817A53C } // 339 kB +// { 0x2817A6A0, 0x281BA53C } // 255 kB +// { 0x281D571C, 0x2820253C } // 179 kB +// { 0x28234D00, 0x2824B33C } // 89 kB +// { 0x2824E300, 0x2828D7BC } // 253 kB +// { 0x282A8DF0, 0x282B63FC } // 53 kB +// { 0x282BC524, 0x282C62FC } // 39 kB +// { 0x2835A988, 0x28366804 } // 47 kB +// { 0x2836E05C, 0x28378DBC } // 43 kB +// { 0x283A735C, 0x284D2A64 } // 1197 kB (1 MB) +// { 0x284D76B0, 0x285021FC } // 170 kB +// { 0x285766A4, 0x28583E4C } // 53 kB +// { 0x28590E5C, 0x2859B248 } // 40 kB +// { 0x2859B288, 0x285AE06C } // 75 kB +// { 0x285B7108, 0x285C0A7C } // 38 kB +// { 0x285C38A0, 0x285D089C } // 52 kB +// { 0x285D0A84, 0x285DC63C } // 46 kB +// { 0x285E0A84, 0x285F089C } // 63 kB +// { 0x285F7FD0, 0x286037D8 } // 46 kB +// { 0x2860E3E4, 0x28621B00 } // 77 kB +// { 0x286287B0, 0x28638BC0 } // 65 kB +// { 0x2863F4A0, 0x2864DE00 } // 58 kB +// { 0x2864F1FC, 0x28656EE0 } // 31 kB +// { 0x2865AF44, 0x286635A0 } // 33 kB +// { 0x2866F774, 0x2867C680 } // 51 kB +// { 0x2867FAC0, 0x286A2CA0 } // 140 kB +// { 0x286B3540, 0x286C1900 } // 56 kB +// { 0x286C64A4, 0x286DDB80 } // 93 kB +// { 0x286E640C, 0x286F1DC0 } // 46 kB +// { 0x286F3884, 0x2870D3C0 } // 102 kB +// { 0x28710824, 0x28719D80 } // 37 kB +// { 0x2872A674, 0x2873B180 } // 66 kB +// { 0x287402F0, 0x28758780 } // 97 kB +// { 0x287652F0, 0x28771C00 } // 50 kB +// { 0x287F878C, 0x2880A680 } // 71 kB +// { 0x2880F4AC, 0x2881E6E0 } // 60 kB +// { 0x28821488, 0x28829A40 } // 33 kB +// { 0x2882A5D0, 0x288385BC } // 55 kB +// { 0x288385D8, 0x28854780 } // 112 kB +// { 0x28857984, 0x28864F80 } // 53 kB +// { 0x28870AC0, 0x2887CAC0 } // 48 kB +// { 0x2887CAC8, 0x28888CC8 } // 48 kB +// { 0x28888CD0, 0x28894ED0 } // 48 kB +// { 0x28894ED8, 0x288BE0DC } // 164 kB +// { 0x288C1C70, 0x28AD9ED4 } // 2144 kB (2 MB) +// { 0x28AD9F04, 0x28B66100 } // 560 kB +// { 0x28B748A8, 0x28B952E0 } // 130 kB +// { 0x28B9AB58, 0x28BA2480 } // 30 kB +// { 0x28BA3D00, 0x28BC21C0 } // 121 kB +// { 0x28BC2F08, 0x28BD9860 } // 90 kB +// { 0x28BED09C, 0x28BFDD00 } // 67 kB +// { 0x28C068F0, 0x28C2E220 } // 158 kB +// { 0x28CC4C6C, 0x28CF6834 } // 198 kB +// { 0x28D3DD64, 0x28D4BF8C } // 56 kB +// { 0x28D83C4C, 0x28DD0284 } // 305 kB +// { 0x28DDDED4, 0x28E84294 } // 664 kB +// { 0x28E99C7C, 0x28F382A4 } // 633 kB +// { 0x28F45EF4, 0x28FEC2B4 } // 664 kB +// { 0x28FEC800, 0x293B2A18 } // 3864 kB (3 MB) +// { 0x293E187C, 0x293EC7FC } // 43 kB +// { 0x295C7240, 0x295D523C } // 56 kB +// { 0x295DA8DC, 0x295E323C } // 34 kB +// { 0x295ED6C0, 0x295F6FDC } // 38 kB +// { 0x29606340, 0x2960FC5C } // 38 kB +// { 0x2964F040, 0x29657C3C } // 35 kB +// { 0x296E0EBC, 0x296EBDBC } // 43 kB +// { 0x2998DFB4, 0x2999DEE4 } // 63 kB +// { 0x2999E6A8, 0x299BE9C4 } // 128 kB +// { 0x29B8DF40, 0x29BA09DC } // 74 kB +// { 0x29BC200C, 0x29D79B94 } // 1758 kB (1 MB) +// { 0x29DA9694, 0x29DB1694 } // 32 kB +// { 0x2A3D7558, 0x2A427558 } // 320 kB +// { 0x2A42769C, 0x2A47769C } // 320 kB +// { 0x2A4777E0, 0x2A4C77E0 } // 320 kB +// { 0x2A4C7924, 0x2A517924 } // 320 kB +// { 0x2A517A68, 0x2A6794B8 } // 1414 kB (1 MB) +// { 0x2AD17528, 0x2AD4EA24 } // 221 kB +// { 0x2B038C4C, 0x2B1794C8 } // 1282 kB (1 MB) +// { 0x2BBA990C, 0x2BBB983C } // 63 kB +// { 0x2BBBA160, 0x2BC82164 } // 800 kB +// { 0x2BD0000C, 0x2BD71638 } // 453 kB +// { 0x2BD7170C, 0x2BD83B0C } // 73 kB +// { 0x2BDBA000, 0x2BDCA028 } // 64 kB +// { 0x2BDCE000, 0x2BDDE028 } // 64 kB +// { 0x2BDE2E34, 0x2BDF2D64 } // 63 kB +// { 0x2BDF35E8, 0x2BE031BC } // 62 kB +// { 0x2BE052A4, 0x2BE151D4 } // 63 kB +// { 0x2BE174AC, 0x2BE27244 } // 63 kB +// { 0x2BE3AC80, 0x2BE48C80 } // 56 kB +// { 0x2BE49EDC, 0x2BE56C7C } // 51 kB +// { 0x2BE82F70, 0x2BE92E9C } // 63 kB +// { 0x2BE9ADBC, 0x2BEA8DBC } // 56 kB +// { 0x2BEAAB7C, 0x2BEB6DBC } // 48 kB +// { 0x2BEC0F3C, 0x2BECEF3C } // 56 kB +// { 0x2BED45DC, 0x2BEDCF3C } // 34 kB +// { 0x2BEE73C0, 0x2BEF0CDC } // 38 kB +// { 0x2BF00040, 0x2BF0995C } // 38 kB +// { 0x2BF48D40, 0x2BF5193C } // 35 kB +// { 0x2BFDABBC, 0x2BFE5ABC } // 43 kB +// { 0x2C03DA40, 0x2C045D7C } // 32 kB +// { 0x2C179450, 0x2C18937C } // 63 kB +// { 0x2C1DC940, 0x2C1EA93C } // 56 kB +// { 0x2C1EABDC, 0x2C1F893C } // 55 kB +// { 0x2C239A80, 0x2C243D3C } // 40 kB +// { 0x2CE10224, 0x2CE3683C } // 153 kB +// { 0x2CE374F4, 0x2CE473A4 } // 63 kB +// { 0x2CE49830, 0x2D3794D8 } // 5311 kB (5 MB) +// { 0x2D3795AC, 0x2D854300 } // 4971 kB (4 MB) +// { 0x2D8546B0, 0x2D8602C4 } // 47 kB +// { 0x2D86D318, 0x2DFFFFFC } // 7755 kB (7 MB) +// { 0x2E2DCD60, 0x2E2E4D7C } // 32 kB +// { 0x2E33F160, 0x2E365AFC } // 154 kB +// { 0x2E37AC40, 0x2E39BB3C } // 131 kB +// { 0x2E3A6EF0, 0x2E3CA2FC } // 141 kB +// { 0x2E3D9EE0, 0x2E400B3C } // 155 kB +// { 0x2E43A8F0, 0x2E442BBC } // 32 kB +// { 0x2E46EC90, 0x2E48E27C } // 125 kB +// { 0x2E497F90, 0x2E4A147C } // 37 kB +// { 0x2E4A5B40, 0x2E4C67BC } // 131 kB +// { 0x2E4FBEF0, 0x2E52697C } // 170 kB +// { 0x2E550750, 0x2E57333C } // 138 kB +// { 0x2E573F3C, 0x2FF8F07C } // 226732 kB (26 MB) +// { 0x31000000, 0x31E1FFFC } // 614464 kB (14 MB) +// { 0x320A5D80, 0x320AEA3C } // 35 kB +// { 0x320E8670, 0x3210017C } // 94 kB +// { 0x3212609C, 0x3213187C } // 45 kB +// { 0x3219DF08, 0x321B72BC } // 100 kB +// { 0x3300ED34, 0x3301AD3C } // 48 kB +// { 0x33041760, 0x33049D0C } // 33 kB +// { 0x330608F8, 0x3306C97C } // 48 kB +// { 0x33089D80, 0x33095284 } // 45 kB +// { 0x33095470, 0x330A1324 } // 47 kB +// { 0x330A1358, 0x330ADC10 } // 50 kB +// { 0x330C9040, 0x330D0ABC } // 30 kB +// { 0x330D0AD8, 0x3311F9CC } // 315 kB +// { 0x3312575C, 0x3320A63C } // 915 kB +// { 0x33234D00, 0x3324B33C } // 89 kB +// { 0x3324E300, 0x3328D7BC } // 253 kB +// { 0x3329D134, 0x332CA324 } // 180 kB +// { 0x3332B200, 0x33340C88 } // 86 kB +// { 0x3335A440, 0x335021FC } // 1695 kB (1 MB) +// { 0x3350A778, 0x3391680C } // 4144 kB (4 MB) +// { 0x3391A444, 0x3392A25C } // 63 kB +// { 0x3392A444, 0x33939EB4 } // 62 kB +// { 0x3393A444, 0x3394A25C } // 63 kB +// { 0x339587C0, 0x33976C80 } // 121 kB +// { 0x339779C8, 0x3398E320 } // 90 kB +// { 0x3399AE74, 0x339A7D80 } // 51 kB +// { 0x339AB1C0, 0x339CE3A0 } // 140 kB +// { 0x339CEB28, 0x339DEC38 } // 64 kB +// { 0x339DEC40, 0x339ED000 } // 56 kB +// { 0x339F1BA4, 0x33A09280 } // 93 kB +// { 0x33A0C6E4, 0x33A15C40 } // 37 kB +// { 0x33A15D64, 0x33EBFFFC } // 4776 kB (4 MB) +// { 0x33F01380, 0x33F21FFC } // 131 kB +// { 0x33F44820, 0x33F6B1BC } // 154 kB +// { 0x33F80300, 0x33FA11FC } // 131 kB +// { 0x33FA4D3C, 0x33FEDAFC } // 291 kB +// { 0x33FFFFD4, 0x38FFFFFC } // 81920 kB (80 MB) + {0, 0} +}; + +static const memory_values_t mem_vals_500[] = +{ + { 0x2E605CBC, 0x2FF849BC }, // size 26733828 (26107 kB) (25 MB) + { 0x2CAE7878, 0x2D207DB4 }, // size 7472448 (7297 kB) (7 MB) + { 0x2D3B966C, 0x2D8943C0 }, // size 5090648 (4971 kB) (4 MB) + { 0x2D8AD3D8, 0x2DFFFFFC }, // size 7679016 (7499 kB) (7 MB) + // TODO: Check which of those areas are usable +// { 0x283A73DC, 0x284D2AE4 } // size 1226508 (1197 kB) (1 MB) +// { 0x29030800, 0x293F69FC } // size 3957248 (3864 kB) (3 MB) +// { 0x2970200C, 0x298B9C54 } // size 1801292 (1759 kB) (1 MB) +// { 0x2A057B68, 0x2A1B9578 } // size 1448468 (1414 kB) (1 MB) + +// { 0x29030800, 0x293F69FC } // size 3957248 (3864 kB) (3 MB) +// { 0x2970200C, 0x298B9C54 } // size 1801292 (1759 kB) (1 MB) +// { 0x2A057B68, 0x2A1B9578 } // size 1448468 (1414 kB) (1 MB) +// { 0x288EEC30, 0x28B06E94 } // size 2196072 (2144 kB) (2 MB) +// { 0x283A73DC, 0x284D2AE4 } // size 1226508 (1197 kB) (1 MB) +// { 0x3335A4C0, 0x335021FC } // size 1736000 (1695 kB) (1 MB) +// { 0x3350C1D4, 0x339182CC } // size 4243708 (4144 kB) (4 MB) +// { 0x33A14094, 0x33EBFFFC } // size 4898668 (4783 kB) (4 MB) +// { 0x33FFFFD4, 0x38FFFFFC } // size 83886124 (81920 kB) (80 MB) + {0, 0} +}; + +static const memory_values_t mem_vals_532[] = +{ + // TODO: Check which of those areas are usable +// {0x28000000 + 0x000DCC9C, 0x28000000 + 0x00174F80}, // 608 kB +// {0x28000000 + 0x00180B60, 0x28000000 + 0x001C0A00}, // 255 kB +// {0x28000000 + 0x001ECE9C, 0x28000000 + 0x00208CC0}, // 111 kB +// {0x28000000 + 0x00234180, 0x28000000 + 0x0024B444}, // 92 kB +// {0x28000000 + 0x0024D8C0, 0x28000000 + 0x0028D884}, // 255 kB +// {0x28000000 + 0x003A745C, 0x28000000 + 0x004D2B68}, // 1197 kB +// {0x28000000 + 0x004D77B0, 0x28000000 + 0x00502200}, // 170 kB +// {0x28000000 + 0x005B3A88, 0x28000000 + 0x005C6870}, // 75 kB +// {0x28000000 + 0x0061F3E4, 0x28000000 + 0x00632B04}, // 77 kB +// {0x28000000 + 0x00639790, 0x28000000 + 0x00649BC4}, // 65 kB +// {0x28000000 + 0x00691490, 0x28000000 + 0x006B3CA4}, // 138 kB +// {0x28000000 + 0x006D7BCC, 0x28000000 + 0x006EEB84}, // 91 kB +// {0x28000000 + 0x00704E44, 0x28000000 + 0x0071E3C4}, // 101 kB +// {0x28000000 + 0x0073B684, 0x28000000 + 0x0074C184}, // 66 kB +// {0x28000000 + 0x00751354, 0x28000000 + 0x00769784}, // 97 kB +// {0x28000000 + 0x008627DC, 0x28000000 + 0x00872904}, // 64 kB +// {0x28000000 + 0x008C1E98, 0x28000000 + 0x008EB0A0}, // 164 kB +// {0x28000000 + 0x008EEC30, 0x28000000 + 0x00B06E98}, // 2144 kB +// {0x28000000 + 0x00B06EC4, 0x28000000 + 0x00B930C4}, // 560 kB +// {0x28000000 + 0x00BA1868, 0x28000000 + 0x00BC22A4}, // 130 kB +// {0x28000000 + 0x00BC48F8, 0x28000000 + 0x00BDEC84}, // 104 kB +// {0x28000000 + 0x00BE3DC0, 0x28000000 + 0x00C02284}, // 121 kB +// {0x28000000 + 0x00C02FC8, 0x28000000 + 0x00C19924}, // 90 kB +// {0x28000000 + 0x00C2D35C, 0x28000000 + 0x00C3DDC4}, // 66 kB +// {0x28000000 + 0x00C48654, 0x28000000 + 0x00C6E2E4}, // 151 kB +// {0x28000000 + 0x00D04E04, 0x28000000 + 0x00D36938}, // 198 kB +// {0x28000000 + 0x00DC88AC, 0x28000000 + 0x00E14288}, // 302 kB +// {0x28000000 + 0x00E21ED4, 0x28000000 + 0x00EC8298}, // 664 kB +// {0x28000000 + 0x00EDDC7C, 0x28000000 + 0x00F7C2A8}, // 633 kB +// {0x28000000 + 0x00F89EF4, 0x28000000 + 0x010302B8}, // 664 kB +// {0x28000000 + 0x01030800, 0x28000000 + 0x013F69A0}, // 3864 kB +// {0x28000000 + 0x016CE000, 0x28000000 + 0x016E0AA0}, // 74 kB +// {0x28000000 + 0x0170200C, 0x28000000 + 0x018B9C58}, // 1759 kB +// {0x28000000 + 0x01F17658, 0x28000000 + 0x01F6765C}, // 320 kB +// {0x28000000 + 0x01F6779C, 0x28000000 + 0x01FB77A0}, // 320 kB +// {0x28000000 + 0x01FB78E0, 0x28000000 + 0x020078E4}, // 320 kB +// {0x28000000 + 0x02007A24, 0x28000000 + 0x02057A28}, // 320 kB +// {0x28000000 + 0x02057B68, 0x28000000 + 0x021B957C}, // 1414 kB +// {0x28000000 + 0x02891528, 0x28000000 + 0x028C8A28}, // 221 kB +// {0x28000000 + 0x02BBCC4C, 0x28000000 + 0x02CB958C}, // 1010 kB +// {0x28000000 + 0x0378D45C, 0x28000000 + 0x03855464}, // 800 kB +// {0x28000000 + 0x0387800C, 0x28000000 + 0x03944938}, // 818 kB +// {0x28000000 + 0x03944A08, 0x28000000 + 0x03956E0C}, // 73 kB +// {0x28000000 + 0x04A944A4, 0x28000000 + 0x04ABAAC0}, // 153 kB +// {0x28000000 + 0x04ADE370, 0x28000000 + 0x0520EAB8}, // 7361 kB // ok +// {0x28000000 + 0x053B966C, 0x28000000 + 0x058943C4}, // 4971 kB // ok +// {0x28000000 + 0x058AD3D8, 0x28000000 + 0x06000000}, // 7499 kB +// {0x28000000 + 0x0638D320, 0x28000000 + 0x063B0280}, // 139 kB +// {0x28000000 + 0x063C39E0, 0x28000000 + 0x063E62C0}, // 138 kB +// {0x28000000 + 0x063F52A0, 0x28000000 + 0x06414A80}, // 125 kB +// {0x28000000 + 0x06422810, 0x28000000 + 0x0644B2C0}, // 162 kB +// {0x28000000 + 0x064E48D0, 0x28000000 + 0x06503EC0}, // 125 kB +// {0x28000000 + 0x0650E360, 0x28000000 + 0x06537080}, // 163 kB +// {0x28000000 + 0x0653A460, 0x28000000 + 0x0655C300}, // 135 kB +// {0x28000000 + 0x0658AA40, 0x28000000 + 0x065BC4C0}, // 198 kB // ok +// {0x28000000 + 0x065E51A0, 0x28000000 + 0x06608E80}, // 143 kB // ok +// {0x28000000 + 0x06609ABC, 0x28000000 + 0x07F82C00}, // 26084 kB // ok + +// {0x30000000 + 0x000DCC9C, 0x30000000 + 0x00180A00}, // 655 kB +// {0x30000000 + 0x00180B60, 0x30000000 + 0x001C0A00}, // 255 kB +// {0x30000000 + 0x001F5EF0, 0x30000000 + 0x00208CC0}, // 75 kB +// {0x30000000 + 0x00234180, 0x30000000 + 0x0024B444}, // 92 kB +// {0x30000000 + 0x0024D8C0, 0x30000000 + 0x0028D884}, // 255 kB +// {0x30000000 + 0x003A745C, 0x30000000 + 0x004D2B68}, // 1197 kB +// {0x30000000 + 0x006D3334, 0x30000000 + 0x00772204}, // 635 kB +// {0x30000000 + 0x00789C60, 0x30000000 + 0x007C6000}, // 240 kB +// {0x30000000 + 0x00800000, 0x30000000 + 0x01E20000}, // 22876 kB // ok + { 0x2E609ABC, 0x2FF82C00 }, // 26084 kB + { 0x29030800, 0x293F69A0 }, // 3864 kB + { 0x288EEC30, 0x28B06E98 }, // 2144 kB + { 0x2D3B966C, 0x2D8943C4 }, // 4971 kB + { 0x2CAE0370, 0x2D20EAB8 }, // 7361 kB + { 0x2D8AD3D8, 0x2E000000 }, // 7499 kB + + {0, 0} +}; // total : 66mB + 25mB + +static const memory_values_t mem_vals_540[] = +{ + { 0x2E609EFC, 0x2FF82000 }, // 26083 kB + { 0x29030800, 0x293F6000 }, // 3864 kB + { 0x288EEC30, 0x28B06800 }, // 2144 kB + { 0x2D3B966C, 0x2D894000 }, // 4971 kB + { 0x2CB56370, 0x2D1EF000 }, // 6756 kB + { 0x2D8AD3D8, 0x2E000000 }, // 7499 kB + { 0x2970200C, 0x298B9800 }, // 1759 kB + { 0x2A057B68, 0x2A1B9000 }, // 1414 kB + { 0x2ABBCC4C, 0x2ACB9000 }, // 1010 kB + {0, 0} +}; + +s_mem_area * memoryGetAreaTable(void) +{ + return MEM_AREA_TABLE; +} + +static inline void memoryAddArea(int start, int end, int cur_index) +{ + // Create and copy new memory area + s_mem_area * mem_area = memoryGetAreaTable(); + mem_area[cur_index].address = start; + mem_area[cur_index].size = end - start; + mem_area[cur_index].next = 0; + + // Fill pointer to this area in the previous area + if (cur_index > 0) + { + mem_area[cur_index - 1].next = &mem_area[cur_index]; + } +} + +/* Create memory areas arrays */ +void memoryInitAreaTable() +{ + u32 ApplicationMemoryEnd = (u32)APP_BASE_MEM; + + // This one seems to be available on every firmware and therefore its our code area but also our main RPX area behind our code + // 22876 kB - our application // ok + if(OS_FIRMWARE <= 400) { + memoryAddArea(ApplicationMemoryEnd + 0x4B000000, 0x4B000000 + 0x01E20000, 0); + } + else { + memoryAddArea(ApplicationMemoryEnd + 0x30000000, 0x30000000 + 0x01E20000, 0); + } + + const memory_values_t * mem_vals = NULL; + + switch(OS_FIRMWARE) + { + case 400: { + mem_vals = mem_vals_400; + break; + } + case 500: { + mem_vals = mem_vals_500; + break; + } + case 532: { + mem_vals = mem_vals_532; + break; + } + case 540: + case 550: { + mem_vals = mem_vals_540; + break; + } + default: + return; // no known values + } + + // Fill entries + int i = 0; + while (mem_vals[i].start_address) + { + memoryAddArea(mem_vals[i].start_address, mem_vals[i].end_address, i + 1); + i++; + } +} diff --git a/src/system/memory_area_table.h b/src/system/memory_area_table.h new file mode 100644 index 0000000..70d7f2f --- /dev/null +++ b/src/system/memory_area_table.h @@ -0,0 +1,34 @@ +/**************************************************************************** + * Copyright (C) 2015 Dimok + * + * This program is free software: you can redistribute it and/or modify + * it under the terms of the GNU General Public License as published by + * the Free Software Foundation, either version 3 of the License, or + * (at your option) any later version. + * + * This program is distributed in the hope that it will be useful, + * but WITHOUT ANY WARRANTY; without even the implied warranty of + * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the + * GNU General Public License for more details. + * + * You should have received a copy of the GNU General Public License + * along with this program. If not, see . + ****************************************************************************/ +#ifndef _MEMORY_AREA_TABLE_H_ +#define _MEMORY_AREA_TABLE_H_ + +#ifdef __cplusplus +extern "C" { +#endif + +#include "common/common.h" + +void memoryInitAreaTable(); +s_mem_area * memoryGetAreaTable(void); + + +#ifdef __cplusplus +} +#endif + +#endif // _MEMORY_AREA_TABLE_H_ diff --git a/src/utils/StringTools.cpp b/src/utils/StringTools.cpp index debb6c7..7fff008 100644 --- a/src/utils/StringTools.cpp +++ b/src/utils/StringTools.cpp @@ -30,7 +30,7 @@ #include #include #include -#include +#include "common/types.h" const char * fmt(const char * format, ...) { diff --git a/src/utils/StringTools.h b/src/utils/StringTools.h index bcf89c4..897376a 100644 --- a/src/utils/StringTools.h +++ b/src/utils/StringTools.h @@ -26,9 +26,9 @@ #ifndef __STRING_TOOLS_H #define __STRING_TOOLS_H -#include #include #include +#include "common/types.h" const char * fmt(const char * format, ...); const wchar_t * wfmt(const char * format, ...); diff --git a/src/utils/logger.c b/src/utils/logger.c index e1e411f..90f4497 100644 --- a/src/utils/logger.c +++ b/src/utils/logger.c @@ -1,17 +1,17 @@ +#include #include #include #include #include #include -#include "dynamic_libs/os_functions.h" -#include "dynamic_libs/socket_functions.h" +#include +#include "common/common.h" #include "logger.h" #ifdef DEBUG_LOGGER static int log_socket = -1; static volatile int log_lock = 0; - void log_init(const char * ipString) { log_socket = socket(AF_INET, SOCK_DGRAM, IPPROTO_UDP); diff --git a/src/utils/utils.c b/src/utils/utils.c new file mode 100644 index 0000000..c46a559 --- /dev/null +++ b/src/utils/utils.c @@ -0,0 +1,17 @@ +#include + + +#define BUS_SPEED 248625000 +#define SECS_TO_TICKS(sec) (((unsigned long long)(sec)) * (BUS_SPEED/4)) +#define MILLISECS_TO_TICKS(msec) (SECS_TO_TICKS(msec) / 1000) +#define MICROSECS_TO_TICKS(usec) (SECS_TO_TICKS(usec) / 1000000) + +void usleep(unsigned int microsecs) +{ + OSSleepTicks(MICROSECS_TO_TICKS(microsecs)); +} + +void sleep(unsigned int secs) +{ + OSSleepTicks(SECS_TO_TICKS(secs)); +} diff --git a/src/utils/utils.h b/src/utils/utils.h index c460fa2..729e808 100644 --- a/src/utils/utils.h +++ b/src/utils/utils.h @@ -40,6 +40,8 @@ extern "C" { #define le32(i) ((((u32)le16((i) & 0xFFFF)) << 16) | ((u32)le16(((i) & 0xFFFF0000) >> 16))) #define le64(i) ((((u64)le32((i) & 0xFFFFFFFFLL)) << 32) | ((u64)le32(((i) & 0xFFFFFFFF00000000LL) >> 32))) +void SC0x25_KernelCopyData(unsigned int addr, unsigned int src, unsigned int len); + #ifdef __cplusplus } #endif diff --git a/src/utils/utils_asm.S b/src/utils/utils_asm.S new file mode 100644 index 0000000..c92f838 --- /dev/null +++ b/src/utils/utils_asm.S @@ -0,0 +1,5 @@ + .globl SC0x25_KernelCopyData +SC0x25_KernelCopyData: + li r0, 0x2500 + sc + blr diff --git a/src/video/CVideo.cpp b/src/video/CVideo.cpp index 63d134b..adef8a1 100644 --- a/src/video/CVideo.cpp +++ b/src/video/CVideo.cpp @@ -21,9 +21,7 @@ #include "shaders/Texture2DShader.h" #include "shaders/ColorShader.h" #include "shaders/Shader3D.h" -#include "shaders/ShaderFractalColor.h" #include "shaders/FXAAShader.h" -#include "dynamic_libs/os_functions.h" CVideo::CVideo(s32 forceTvScanMode, s32 forceDrcScanMode) { @@ -35,25 +33,22 @@ CVideo::CVideo(s32 forceTvScanMode, s32 forceDrcScanMode) //! initialize GX2 command buffer u32 gx2_init_attributes[9]; - gx2_init_attributes[0] = GX2_INIT_ATTRIB_CB_BASE; + gx2_init_attributes[0] = GX2_INIT_CMD_BUF_BASE; gx2_init_attributes[1] = (u32)gx2CommandBuffer; - gx2_init_attributes[2] = GX2_INIT_ATTRIB_CB_SIZE; + gx2_init_attributes[2] = GX2_INIT_CMD_BUF_POOL_SIZE; gx2_init_attributes[3] = GX2_COMMAND_BUFFER_SIZE; - gx2_init_attributes[4] = GX2_INIT_ATTRIB_ARGC; + gx2_init_attributes[4] = GX2_INIT_ARGC; gx2_init_attributes[5] = 0; - gx2_init_attributes[6] = GX2_INIT_ATTRIB_ARGV; + gx2_init_attributes[6] = GX2_INIT_ARGV; gx2_init_attributes[7] = 0; - gx2_init_attributes[8] = GX2_INIT_ATTRIB_NULL; + gx2_init_attributes[8] = GX2_INIT_END; GX2Init(gx2_init_attributes); - //! GX2 resources are not used in this application but if needed, the allocator is setup - GX2RSetAllocator(&CVideo::GX2RAlloc, &CVideo::GX2RFree); - u32 scanBufferSize = 0; - s32 scaleNeeded = 0; + u32 scaleNeeded = 0; - s32 tvScanMode = (forceTvScanMode >= 0) ? forceTvScanMode : GX2GetSystemTVScanMode(); - s32 drcScanMode = (forceDrcScanMode >= 0) ? forceDrcScanMode : GX2GetSystemDRCScanMode(); + s32 tvScanMode = ((forceTvScanMode >= 0) ? forceTvScanMode : (s32)GX2GetSystemTVScanMode()); + s32 drcScanMode = ((forceDrcScanMode >= 0) ? forceDrcScanMode : (s32)GX2GetSystemDRCScanMode()); s32 tvRenderMode; u32 tvWidth = 0; @@ -65,24 +60,24 @@ CVideo::CVideo(s32 forceTvScanMode, s32 forceDrcScanMode) case GX2_TV_SCAN_MODE_480P: tvWidth = 854; tvHeight = 480; - tvRenderMode = GX2_TV_RENDER_480_WIDE; + tvRenderMode = GX2_TV_RENDER_MODE_WIDE_480P; break; case GX2_TV_SCAN_MODE_1080I: case GX2_TV_SCAN_MODE_1080P: tvWidth = 1920; tvHeight = 1080; - tvRenderMode = GX2_TV_RENDER_1080; + tvRenderMode = GX2_TV_RENDER_MODE_WIDE_1080P; break; case GX2_TV_SCAN_MODE_720P: default: tvWidth = 1280; tvHeight = 720; - tvRenderMode = GX2_TV_RENDER_720; + tvRenderMode = GX2_TV_RENDER_MODE_WIDE_720P; break; } - s32 tvAAMode = GX2_AA_MODE_1X; - s32 drcAAMode = GX2_AA_MODE_4X; + s32 tvAAMode = GX2_AA_MODE1X; + s32 drcAAMode = GX2_AA_MODE4X; //! calculate the scale factor for later texture resize widthScaleFactor = 1.0f / (f32)tvWidth; @@ -90,51 +85,51 @@ CVideo::CVideo(s32 forceTvScanMode, s32 forceDrcScanMode) depthScaleFactor = widthScaleFactor; //! calculate the size needed for the TV scan buffer and allocate the buffer from bucket memory - GX2CalcTVSize(tvRenderMode, GX2_SURFACE_FORMAT_TCS_R8_G8_B8_A8_UNORM, GX2_BUFFERING_DOUBLE, &scanBufferSize, &scaleNeeded); + GX2CalcTVSize((GX2TVRenderMode)tvRenderMode, GX2_SURFACE_FORMAT_UNORM_R8_G8_B8_A8, GX2_BUFFERING_MODE_DOUBLE, &scanBufferSize, &scaleNeeded); tvScanBuffer = MEMBucket_alloc(scanBufferSize, GX2_SCAN_BUFFER_ALIGNMENT); - GX2Invalidate(GX2_INVALIDATE_CPU, tvScanBuffer, scanBufferSize); - GX2SetTVBuffer(tvScanBuffer, scanBufferSize, tvRenderMode, GX2_SURFACE_FORMAT_TCS_R8_G8_B8_A8_UNORM, GX2_BUFFERING_DOUBLE); + GX2Invalidate(GX2_INVALIDATE_MODE_CPU, tvScanBuffer, scanBufferSize); + GX2SetTVBuffer(tvScanBuffer, scanBufferSize, (GX2TVRenderMode)tvRenderMode, GX2_SURFACE_FORMAT_UNORM_R8_G8_B8_A8, GX2_BUFFERING_MODE_DOUBLE); //! calculate the size needed for the DRC scan buffer and allocate the buffer from bucket memory - GX2CalcDRCSize(drcScanMode, GX2_SURFACE_FORMAT_TCS_R8_G8_B8_A8_UNORM, GX2_BUFFERING_DOUBLE, &scanBufferSize, &scaleNeeded); + GX2CalcDRCSize((GX2DrcRenderMode)drcScanMode, GX2_SURFACE_FORMAT_UNORM_R8_G8_B8_A8, GX2_BUFFERING_MODE_DOUBLE, &scanBufferSize, &scaleNeeded); drcScanBuffer = MEMBucket_alloc(scanBufferSize, GX2_SCAN_BUFFER_ALIGNMENT); - GX2Invalidate(GX2_INVALIDATE_CPU, drcScanBuffer, scanBufferSize); - GX2SetDRCBuffer(drcScanBuffer, scanBufferSize, drcScanMode, GX2_SURFACE_FORMAT_TCS_R8_G8_B8_A8_UNORM, GX2_BUFFERING_DOUBLE); + GX2Invalidate(GX2_INVALIDATE_MODE_CPU, drcScanBuffer, scanBufferSize); + GX2SetDRCBuffer(drcScanBuffer, scanBufferSize, (GX2DrcRenderMode)drcScanMode, GX2_SURFACE_FORMAT_UNORM_R8_G8_B8_A8, GX2_BUFFERING_MODE_DOUBLE); //! Setup color buffer for TV rendering - GX2InitColorBuffer(&tvColorBuffer, GX2_SURFACE_DIM_2D, tvWidth, tvHeight, 1, GX2_SURFACE_FORMAT_TCS_R8_G8_B8_A8_UNORM, tvAAMode); - tvColorBuffer.surface.image_data = MEM1_alloc(tvColorBuffer.surface.image_size, tvColorBuffer.surface.align); - GX2Invalidate(GX2_INVALIDATE_CPU, tvColorBuffer.surface.image_data, tvColorBuffer.surface.image_size); + GX2InitColorBuffer(&tvColorBuffer, GX2_SURFACE_DIM_TEXTURE_2D, tvWidth, tvHeight, 1, GX2_SURFACE_FORMAT_UNORM_R8_G8_B8_A8, (GX2AAMode)tvAAMode); + tvColorBuffer.surface.image = MEM1_alloc(tvColorBuffer.surface.imageSize, tvColorBuffer.surface.alignment); + GX2Invalidate(GX2_INVALIDATE_MODE_CPU, tvColorBuffer.surface.image, tvColorBuffer.surface.imageSize); //! due to AA we can only use 16 bit depth buffer in MEM1 otherwise we would have to switch to mem2 for depth buffer //! this should be ok for our purpose i guess //! Setup TV depth buffer (can be the same for both if rendered one after another) u32 size, align; - GX2InitDepthBuffer(&tvDepthBuffer, GX2_SURFACE_DIM_2D, tvColorBuffer.surface.width, tvColorBuffer.surface.height, 1, GX2_SURFACE_FORMAT_TCD_R32_FLOAT, tvAAMode); - tvDepthBuffer.surface.image_data = MEM1_alloc(tvDepthBuffer.surface.image_size, tvDepthBuffer.surface.align); - GX2Invalidate(GX2_INVALIDATE_CPU, tvDepthBuffer.surface.image_data, tvDepthBuffer.surface.image_size); + GX2InitDepthBuffer(&tvDepthBuffer, GX2_SURFACE_DIM_TEXTURE_2D, tvColorBuffer.surface.width, tvColorBuffer.surface.height, 1, GX2_SURFACE_FORMAT_FLOAT_R32, (GX2AAMode)tvAAMode); + tvDepthBuffer.surface.image = MEM1_alloc(tvDepthBuffer.surface.imageSize, tvDepthBuffer.surface.alignment); + GX2Invalidate(GX2_INVALIDATE_MODE_CPU, tvDepthBuffer.surface.image, tvDepthBuffer.surface.imageSize); //! Setup TV HiZ buffer GX2CalcDepthBufferHiZInfo(&tvDepthBuffer, &size, &align); - tvDepthBuffer.hiZ_data = MEM1_alloc(size, align); - GX2Invalidate(GX2_INVALIDATE_CPU, tvDepthBuffer.hiZ_data, size); + tvDepthBuffer.hiZPtr = MEM1_alloc(size, align); + GX2Invalidate(GX2_INVALIDATE_MODE_CPU, tvDepthBuffer.hiZPtr, size); GX2InitDepthBufferHiZEnable(&tvDepthBuffer, GX2_ENABLE); //! Setup color buffer for DRC rendering - GX2InitColorBuffer(&drcColorBuffer, GX2_SURFACE_DIM_2D, 854, 480, 1, GX2_SURFACE_FORMAT_TCS_R8_G8_B8_A8_UNORM, drcAAMode); - drcColorBuffer.surface.image_data = MEM1_alloc(drcColorBuffer.surface.image_size, drcColorBuffer.surface.align); - GX2Invalidate(GX2_INVALIDATE_CPU, drcColorBuffer.surface.image_data, drcColorBuffer.surface.image_size); + GX2InitColorBuffer(&drcColorBuffer, GX2_SURFACE_DIM_TEXTURE_2D, 854, 480, 1, GX2_SURFACE_FORMAT_UNORM_R8_G8_B8_A8, (GX2AAMode)drcAAMode); + drcColorBuffer.surface.image = MEM1_alloc(drcColorBuffer.surface.imageSize, drcColorBuffer.surface.alignment); + GX2Invalidate(GX2_INVALIDATE_MODE_CPU, drcColorBuffer.surface.image, drcColorBuffer.surface.imageSize); //! Setup DRC depth buffer (can be the same for both if rendered one after another) - GX2InitDepthBuffer(&drcDepthBuffer, GX2_SURFACE_DIM_2D, drcColorBuffer.surface.width, drcColorBuffer.surface.height, 1, GX2_SURFACE_FORMAT_TCD_R32_FLOAT, drcAAMode); - drcDepthBuffer.surface.image_data = MEM1_alloc(drcDepthBuffer.surface.image_size, drcDepthBuffer.surface.align); - GX2Invalidate(GX2_INVALIDATE_CPU, drcDepthBuffer.surface.image_data, drcDepthBuffer.surface.image_size); + GX2InitDepthBuffer(&drcDepthBuffer, GX2_SURFACE_DIM_TEXTURE_2D, drcColorBuffer.surface.width, drcColorBuffer.surface.height, 1, GX2_SURFACE_FORMAT_FLOAT_R32, (GX2AAMode)drcAAMode); + drcDepthBuffer.surface.image = MEM1_alloc(drcDepthBuffer.surface.imageSize, drcDepthBuffer.surface.alignment); + GX2Invalidate(GX2_INVALIDATE_MODE_CPU, drcDepthBuffer.surface.image, drcDepthBuffer.surface.imageSize); //! Setup DRC HiZ buffer GX2CalcDepthBufferHiZInfo(&drcDepthBuffer, &size, &align); - drcDepthBuffer.hiZ_data = MEM1_alloc(size, align); - GX2Invalidate(GX2_INVALIDATE_CPU, drcDepthBuffer.hiZ_data, size); + drcDepthBuffer.hiZPtr = MEM1_alloc(size, align); + GX2Invalidate(GX2_INVALIDATE_MODE_CPU, drcDepthBuffer.hiZPtr, size); GX2InitDepthBufferHiZEnable(&drcDepthBuffer, GX2_ENABLE); @@ -143,25 +138,25 @@ CVideo::CVideo(s32 forceTvScanMode, s32 forceDrcScanMode) { u32 auxSize, auxAlign; GX2CalcColorBufferAuxInfo(&tvColorBuffer, &auxSize, &auxAlign); - tvColorBuffer.aux_data = MEM1_alloc(auxSize, auxAlign); - if(!tvColorBuffer.aux_data) - tvColorBuffer.aux_data = MEM2_alloc(auxSize, auxAlign); + tvColorBuffer.aaBuffer = MEM1_alloc(auxSize, auxAlign); + if(!tvColorBuffer.aaBuffer) + tvColorBuffer.aaBuffer = MEM2_alloc(auxSize, auxAlign); - tvColorBuffer.aux_size = auxSize; - memset(tvColorBuffer.aux_data, GX2_AUX_BUFFER_CLEAR_VALUE, auxSize); - GX2Invalidate(GX2_INVALIDATE_CPU, tvColorBuffer.aux_data, auxSize); + tvColorBuffer.aaSize = auxSize; + memset(tvColorBuffer.aaBuffer, GX2_AA_BUFFER_CLEAR_VALUE, auxSize); + GX2Invalidate(GX2_INVALIDATE_MODE_CPU, tvColorBuffer.aaBuffer, auxSize); } if (drcColorBuffer.surface.aa) { u32 auxSize, auxAlign; GX2CalcColorBufferAuxInfo(&drcColorBuffer, &auxSize, &auxAlign); - drcColorBuffer.aux_data = MEM1_alloc(auxSize, auxAlign); - if(!drcColorBuffer.aux_data) - drcColorBuffer.aux_data = MEM2_alloc(auxSize, auxAlign); - drcColorBuffer.aux_size = auxSize; - memset(drcColorBuffer.aux_data, GX2_AUX_BUFFER_CLEAR_VALUE, auxSize); - GX2Invalidate(GX2_INVALIDATE_CPU, drcColorBuffer.aux_data, auxSize ); + drcColorBuffer.aaBuffer = MEM1_alloc(auxSize, auxAlign); + if(!drcColorBuffer.aaBuffer) + drcColorBuffer.aaBuffer = MEM2_alloc(auxSize, auxAlign); + drcColorBuffer.aaSize = auxSize; + memset(drcColorBuffer.aaBuffer, GX2_AA_BUFFER_CLEAR_VALUE, auxSize); + GX2Invalidate(GX2_INVALIDATE_MODE_CPU, drcColorBuffer.aaBuffer, auxSize); } //! allocate memory and setup context state TV @@ -200,11 +195,11 @@ CVideo::CVideo(s32 forceTvScanMode, s32 forceDrcScanMode) viewMtx = glm::translate(viewMtx, glm::vec3(0.0f, 0.0f, -2.5f)); viewMtx = glm::rotate(viewMtx, DegToRad(cam_X_rot), glm::vec3(1.0f, 0.0f, 0.0f)); - GX2InitSampler(&aaSampler, GX2_TEX_CLAMP_CLAMP, GX2_TEX_XY_FILTER_BILINEAR); - GX2InitTexture(&tvAaTexture, tvColorBuffer.surface.width, tvColorBuffer.surface.height, 1, 0, GX2_SURFACE_FORMAT_TCS_R8_G8_B8_A8_UNORM, GX2_SURFACE_DIM_2D, GX2_TILE_MODE_DEFAULT); - tvAaTexture.surface.image_data = tvColorBuffer.surface.image_data; - tvAaTexture.surface.image_size = tvColorBuffer.surface.image_size; - tvAaTexture.surface.mip_data = tvColorBuffer.surface.mip_data; + GX2InitSampler(&aaSampler, GX2_TEX_CLAMP_MODE_CLAMP, GX2_TEX_XY_FILTER_MODE_LINEAR); + GX2InitTexture(&tvAaTexture, tvColorBuffer.surface.width, tvColorBuffer.surface.height, 1, 0, GX2_SURFACE_FORMAT_UNORM_R8_G8_B8_A8, GX2_SURFACE_DIM_TEXTURE_2D, GX2_TILE_MODE_DEFAULT); + tvAaTexture.surface.image = tvColorBuffer.surface.image; + tvAaTexture.surface.imageSize = tvColorBuffer.surface.imageSize; + tvAaTexture.surface.mipmaps = tvColorBuffer.surface.mipmaps; } CVideo::~CVideo() @@ -220,36 +215,35 @@ CVideo::~CVideo() MEMBucket_free(tvScanBuffer); MEMBucket_free(drcScanBuffer); //! free color buffers - MEM1_free(tvColorBuffer.surface.image_data); - MEM1_free(drcColorBuffer.surface.image_data); + MEM1_free(tvColorBuffer.surface.image); + MEM1_free(drcColorBuffer.surface.image); //! free depth buffers - MEM1_free(tvDepthBuffer.surface.image_data); - MEM1_free(tvDepthBuffer.hiZ_data); - MEM1_free(drcDepthBuffer.surface.image_data); - MEM1_free(drcDepthBuffer.hiZ_data); + MEM1_free(tvDepthBuffer.surface.image); + MEM1_free(tvDepthBuffer.hiZPtr); + MEM1_free(drcDepthBuffer.surface.image); + MEM1_free(drcDepthBuffer.hiZPtr); //! free context buffers MEM2_free(tvContextState); MEM2_free(drcContextState); //! free aux buffer - if(tvColorBuffer.aux_data) + if(tvColorBuffer.aaBuffer) { - if(((u32)tvColorBuffer.aux_data & 0xF0000000) == 0xF0000000) - MEM1_free(tvColorBuffer.aux_data); + if(((u32)tvColorBuffer.aaBuffer & 0xF0000000) == 0xF0000000) + MEM1_free(tvColorBuffer.aaBuffer); else - MEM2_free(tvColorBuffer.aux_data); + MEM2_free(tvColorBuffer.aaBuffer); } - if(drcColorBuffer.aux_data) + if(drcColorBuffer.aaBuffer) { - if(((u32)drcColorBuffer.aux_data & 0xF0000000) == 0xF0000000) - MEM1_free(drcColorBuffer.aux_data); + if(((u32)drcColorBuffer.aaBuffer & 0xF0000000) == 0xF0000000) + MEM1_free(drcColorBuffer.aaBuffer); else - MEM2_free(drcColorBuffer.aux_data); + MEM2_free(drcColorBuffer.aaBuffer); } //! destroy shaders ColorShader::destroyInstance(); FXAAShader::destroyInstance(); Shader3D::destroyInstance(); - ShaderFractalColor::destroyInstance(); Texture2DShader::destroyInstance(); } @@ -258,33 +252,13 @@ void CVideo::renderFXAA(const GX2Texture * texture, const GX2Sampler *sampler) resolution[0] = texture->surface.width; resolution[1] = texture->surface.height; - GX2Invalidate(GX2_INVALIDATE_COLOR_BUFFER | GX2_INVALIDATE_TEXTURE, texture->surface.image_data, texture->surface.image_size); + GX2Invalidate((GX2InvalidateMode)(GX2_INVALIDATE_MODE_COLOR_BUFFER | GX2_INVALIDATE_MODE_TEXTURE), texture->surface.image, texture->surface.imageSize); - GX2SetDepthOnlyControl(GX2_ENABLE, GX2_ENABLE, GX2_COMPARE_ALWAYS); + GX2SetDepthOnlyControl(GX2_ENABLE, GX2_ENABLE, GX2_COMPARE_FUNC_ALWAYS); FXAAShader::instance()->setShaders(); FXAAShader::instance()->setAttributeBuffer(); FXAAShader::instance()->setResolution(resolution); FXAAShader::instance()->setTextureAndSampler(texture, sampler); FXAAShader::instance()->draw(); - GX2SetDepthOnlyControl(GX2_ENABLE, GX2_ENABLE, GX2_COMPARE_LEQUAL); -} - -void* CVideo::GX2RAlloc(u32 flags, u32 size, u32 align) -{ - //! min. alignment - if (align < 4) - align = 4; - - if ((flags & 0x2040E) && !(flags & 0x40000)) - return MEM1_alloc(size, align); - else - return MEM2_alloc(size, align); -} - -void CVideo::GX2RFree(u32 flags, void* p) -{ - if ((flags & 0x2040E) && !(flags & 0x40000)) - MEM1_free(p); - else - MEM2_free(p); + GX2SetDepthOnlyControl(GX2_ENABLE, GX2_ENABLE, GX2_COMPARE_FUNC_LEQUAL); } diff --git a/src/video/CVideo.h b/src/video/CVideo.h index e9b457e..2539c21 100644 --- a/src/video/CVideo.h +++ b/src/video/CVideo.h @@ -17,7 +17,14 @@ #ifndef __CVIDEO_H_ #define __CVIDEO_H_ -#include "dynamic_libs/gx2_functions.h" +#include +#include +#include +#include +#include +#include +#include + #include "shaders/Shader.h" class CVideo @@ -42,15 +49,15 @@ public: void prepareRendering(void) { GX2ClearColor(currColorBuffer, 0.0f, 0.0f, 0.0f, 1.0f); - GX2ClearDepthStencilEx(currDepthBuffer, currDepthBuffer->clear_depth, currDepthBuffer->clear_stencil, GX2_CLEAR_BOTH); + GX2ClearDepthStencilEx(currDepthBuffer, currDepthBuffer->depthClear, currDepthBuffer->stencilClear, GX2_CLEAR_FLAGS_BOTH); GX2SetContextState(currContextState); GX2SetViewport(0.0f, 0.0f, currColorBuffer->surface.width, currColorBuffer->surface.height, 0.0f, 1.0f); GX2SetScissor(0, 0, currColorBuffer->surface.width, currColorBuffer->surface.height); - GX2SetDepthOnlyControl(GX2_ENABLE, GX2_ENABLE, GX2_COMPARE_LEQUAL); + GX2SetDepthOnlyControl(GX2_ENABLE, GX2_ENABLE, GX2_COMPARE_FUNC_LEQUAL); GX2SetColorControl(GX2_LOGIC_OP_COPY, 1, GX2_DISABLE, GX2_ENABLE); - GX2SetBlendControl(GX2_RENDER_TARGET_0, GX2_BLEND_SRC_ALPHA, GX2_BLEND_ONE_MINUS_SRC_ALPHA, GX2_BLEND_COMBINE_ADD, GX2_ENABLE, GX2_BLEND_SRC_ALPHA, GX2_BLEND_ONE_MINUS_SRC_ALPHA, GX2_BLEND_COMBINE_ADD); + GX2SetBlendControl(GX2_RENDER_TARGET_0, GX2_BLEND_MODE_SRC_ALPHA, GX2_BLEND_MODE_INV_SRC_ALPHA, GX2_BLEND_COMBINE_MODE_ADD, GX2_ENABLE, GX2_BLEND_MODE_SRC_ALPHA, GX2_BLEND_MODE_INV_SRC_ALPHA, GX2_BLEND_COMBINE_MODE_ADD); GX2SetCullOnlyControl(GX2_FRONT_FACE_CCW, GX2_DISABLE, GX2_ENABLE); } @@ -59,21 +66,21 @@ public: if(bEnable) { GX2SetStencilMask(0xff, 0xff, 0x01, 0xff, 0xff, 0x01); - GX2SetDepthStencilControl(GX2_DISABLE, GX2_DISABLE, GX2_COMPARE_LEQUAL, GX2_ENABLE, GX2_ENABLE, GX2_COMPARE_ALWAYS, GX2_STENCIL_KEEP, GX2_STENCIL_KEEP, GX2_STENCIL_REPLACE, - GX2_COMPARE_ALWAYS, GX2_STENCIL_KEEP, GX2_STENCIL_KEEP, GX2_STENCIL_REPLACE); + GX2SetDepthStencilControl(GX2_DISABLE, GX2_DISABLE, GX2_COMPARE_FUNC_LEQUAL, GX2_ENABLE, GX2_ENABLE, GX2_COMPARE_FUNC_ALWAYS, GX2_STENCIL_FUNCTION_KEEP, GX2_STENCIL_FUNCTION_KEEP, GX2_STENCIL_FUNCTION_REPLACE, + GX2_COMPARE_FUNC_ALWAYS, GX2_STENCIL_FUNCTION_KEEP, GX2_STENCIL_FUNCTION_KEEP, GX2_STENCIL_FUNCTION_REPLACE); } else { GX2SetStencilMask(0xff, 0xff, 0xff, 0xff, 0xff, 0xff); - GX2SetDepthStencilControl(GX2_ENABLE, GX2_ENABLE, GX2_COMPARE_LEQUAL, GX2_DISABLE, GX2_DISABLE, GX2_COMPARE_NEVER, GX2_STENCIL_KEEP, GX2_STENCIL_KEEP, GX2_STENCIL_KEEP, - GX2_COMPARE_NEVER, GX2_STENCIL_KEEP, GX2_STENCIL_KEEP, GX2_STENCIL_KEEP); + GX2SetDepthStencilControl(GX2_ENABLE, GX2_ENABLE, GX2_COMPARE_FUNC_LEQUAL, GX2_DISABLE, GX2_DISABLE, GX2_COMPARE_FUNC_NEVER, GX2_STENCIL_FUNCTION_KEEP, GX2_STENCIL_FUNCTION_KEEP, GX2_STENCIL_FUNCTION_KEEP, + GX2_COMPARE_FUNC_NEVER, GX2_STENCIL_FUNCTION_KEEP, GX2_STENCIL_FUNCTION_KEEP, GX2_STENCIL_FUNCTION_KEEP); } } void drcDrawDone(void) { //! on DRC we do a hardware AA because FXAA does not look good //renderFXAA(&drcAaTexture, &aaSampler); - GX2CopyColorBufferToScanBuffer(&drcColorBuffer, GX2_SCAN_TARGET_DRC_FIRST); + GX2CopyColorBufferToScanBuffer(&drcColorBuffer, GX2_SCAN_TARGET_DRC); } void tvDrawDone(void) { @@ -161,9 +168,6 @@ public: rayDirection = glm::normalize(rayDirectionWorld); } private: - static void *GX2RAlloc(u32 flags, u32 size, u32 align); - static void GX2RFree(u32 flags, void* p); - void renderFXAA(const GX2Texture * texture, const GX2Sampler *sampler); void *gx2CommandBuffer; diff --git a/src/video/shaders/ColorShader.cpp b/src/video/shaders/ColorShader.cpp index d8e963e..bc4a050 100644 --- a/src/video/shaders/ColorShader.cpp +++ b/src/video/shaders/ColorShader.cpp @@ -116,7 +116,7 @@ ColorShader::ColorShader() pixelShader.setProgram(cpPixelShaderProgram, sizeof(cpPixelShaderProgram), cpPixelShaderRegs, sizeof(cpPixelShaderRegs)); colorIntensityLocation = 0; - pixelShader.addUniformVar((GX2UniformVar){ "unf_color_intensity", GX2_VAR_TYPE_VEC4, 1, colorIntensityLocation, 0xffffffff }); + pixelShader.addUniformVar((GX2UniformVar){ "unf_color_intensity", GX2_SHADER_VAR_TYPE_FLOAT4, 1, colorIntensityLocation, -1 }); //! create vertex shader vertexShader.setProgram(cpVertexShaderProgram, sizeof(cpVertexShaderProgram), cpVertexShaderRegs, sizeof(cpVertexShaderRegs)); @@ -124,18 +124,18 @@ ColorShader::ColorShader() angleLocation = 0; offsetLocation = 4; scaleLocation = 8; - vertexShader.addUniformVar((GX2UniformVar){ "unf_angle", GX2_VAR_TYPE_FLOAT, 1, angleLocation, 0xffffffff }); - vertexShader.addUniformVar((GX2UniformVar){ "unf_offset", GX2_VAR_TYPE_VEC3, 1, offsetLocation, 0xffffffff }); - vertexShader.addUniformVar((GX2UniformVar){ "unf_scale", GX2_VAR_TYPE_VEC3, 1, scaleLocation, 0xffffffff }); + vertexShader.addUniformVar((GX2UniformVar){ "unf_angle", GX2_SHADER_VAR_TYPE_FLOAT, 1, angleLocation, -1 }); + vertexShader.addUniformVar((GX2UniformVar){ "unf_offset", GX2_SHADER_VAR_TYPE_FLOAT3, 1, offsetLocation, -1 }); + vertexShader.addUniformVar((GX2UniformVar){ "unf_scale", GX2_SHADER_VAR_TYPE_FLOAT3, 1, scaleLocation, -1 }); colorLocation = 1; positionLocation = 0; - vertexShader.addAttribVar((GX2AttribVar){ "attr_color", GX2_VAR_TYPE_VEC4, 0, colorLocation }); - vertexShader.addAttribVar((GX2AttribVar){ "attr_position", GX2_VAR_TYPE_VEC3, 0, positionLocation }); + vertexShader.addAttribVar((GX2AttribVar){ "attr_color", GX2_SHADER_VAR_TYPE_FLOAT4, 0, colorLocation }); + vertexShader.addAttribVar((GX2AttribVar){ "attr_position", GX2_SHADER_VAR_TYPE_FLOAT3, 0, positionLocation }); //! setup attribute streams - GX2InitAttribStream(vertexShader.getAttributeBuffer(0), positionLocation, 0, 0, GX2_ATTRIB_FORMAT_32_32_32_FLOAT); - GX2InitAttribStream(vertexShader.getAttributeBuffer(1), colorLocation, 1, 0, GX2_ATTRIB_FORMAT_8_8_8_8_UNORM); + GX2InitAttribStream(vertexShader.getAttributeBuffer(0), positionLocation, 0, 0, GX2_ATTRIB_FORMAT_FLOAT_32_32_32); + GX2InitAttribStream(vertexShader.getAttributeBuffer(1), colorLocation, 1, 0, GX2_ATTRIB_FORMAT_UNORM_8_8_8_8); //! create fetch shader fetchShader = new FetchShader(vertexShader.getAttributeBuffer(), vertexShader.getAttributesCount()); @@ -150,7 +150,7 @@ ColorShader::ColorShader() positionVtxs[i++] = 1.0f; positionVtxs[i++] = -1.0f; positionVtxs[i++] = 0.0f; positionVtxs[i++] = 1.0f; positionVtxs[i++] = 1.0f; positionVtxs[i++] = 0.0f; positionVtxs[i++] = -1.0f; positionVtxs[i++] = 1.0f; positionVtxs[i++] = 0.0f; - GX2Invalidate(GX2_INVALIDATE_CPU_ATTRIB_BUFFER, positionVtxs, cuPositionVtxsSize); + GX2Invalidate(GX2_INVALIDATE_MODE_CPU_ATTRIBUTE_BUFFER, positionVtxs, cuPositionVtxsSize); } } diff --git a/src/video/shaders/FXAAShader.cpp b/src/video/shaders/FXAAShader.cpp index f86087b..3b46733 100644 --- a/src/video/shaders/FXAAShader.cpp +++ b/src/video/shaders/FXAAShader.cpp @@ -172,22 +172,22 @@ FXAAShader::FXAAShader() pixelShader.setProgram(cpPixelShaderProgram, sizeof(cpPixelShaderProgram), cpPixelShaderRegs, sizeof(cpPixelShaderRegs)); resolutionLocation = 0; - pixelShader.addUniformVar((GX2UniformVar){ "unf_resolution", GX2_VAR_TYPE_VEC2, 1, resolutionLocation, 0xffffffff }); + pixelShader.addUniformVar((GX2UniformVar){ "unf_resolution", GX2_SHADER_VAR_TYPE_FLOAT2, 1, resolutionLocation, -1 }); samplerLocation = 0; - pixelShader.addSamplerVar((GX2SamplerVar){ "sampl_texture", GX2_SAMPLER_TYPE_2D, samplerLocation }); + pixelShader.addSamplerVar((GX2SamplerVar){ "sampl_texture", GX2_SAMPLER_VAR_TYPE_SAMPLER_2D, samplerLocation }); //! create vertex shader vertexShader.setProgram(cpVertexShaderProgram, sizeof(cpVertexShaderProgram), cpVertexShaderRegs, sizeof(cpVertexShaderRegs)); positionLocation = 0; texCoordLocation = 1; - vertexShader.addAttribVar((GX2AttribVar){ "attr_position", GX2_VAR_TYPE_VEC3, 0, positionLocation }); - vertexShader.addAttribVar((GX2AttribVar){ "attr_texture_coord", GX2_VAR_TYPE_VEC2, 0, texCoordLocation }); + vertexShader.addAttribVar((GX2AttribVar){ "attr_position", GX2_SHADER_VAR_TYPE_FLOAT3, 0, positionLocation }); + vertexShader.addAttribVar((GX2AttribVar){ "attr_texture_coord", GX2_SHADER_VAR_TYPE_FLOAT2, 0, texCoordLocation }); //! setup attribute streams - GX2InitAttribStream(vertexShader.getAttributeBuffer(0), positionLocation, 0, 0, GX2_ATTRIB_FORMAT_32_32_32_FLOAT); - GX2InitAttribStream(vertexShader.getAttributeBuffer(1), texCoordLocation, 1, 0, GX2_ATTRIB_FORMAT_32_32_FLOAT); + GX2InitAttribStream(vertexShader.getAttributeBuffer(0), positionLocation, 0, 0, GX2_ATTRIB_FORMAT_FLOAT_32_32_32); + GX2InitAttribStream(vertexShader.getAttributeBuffer(1), texCoordLocation, 1, 0, GX2_ATTRIB_FORMAT_FLOAT_32_32); //! create fetch shader fetchShader = new FetchShader(vertexShader.getAttributeBuffer(), vertexShader.getAttributesCount()); @@ -202,14 +202,14 @@ FXAAShader::FXAAShader() posVtxs[i++] = 1.0f; posVtxs[i++] = -1.0f; posVtxs[i++] = 0.0f; posVtxs[i++] = 1.0f; posVtxs[i++] = 1.0f; posVtxs[i++] = 0.0f; posVtxs[i++] = -1.0f; posVtxs[i++] = 1.0f; posVtxs[i++] = 0.0f; - GX2Invalidate(GX2_INVALIDATE_CPU_ATTRIB_BUFFER, posVtxs, ciPositionVtxsSize); + GX2Invalidate(GX2_INVALIDATE_MODE_CPU_ATTRIBUTE_BUFFER, posVtxs, ciPositionVtxsSize); i = 0; texCoords[i++] = 0.0f; texCoords[i++] = 1.0f; texCoords[i++] = 1.0f; texCoords[i++] = 1.0f; texCoords[i++] = 1.0f; texCoords[i++] = 0.0f; texCoords[i++] = 0.0f; texCoords[i++] = 0.0f; - GX2Invalidate(GX2_INVALIDATE_CPU_ATTRIB_BUFFER, texCoords, ciTexCoordsVtxsSize); + GX2Invalidate(GX2_INVALIDATE_MODE_CPU_ATTRIBUTE_BUFFER, texCoords, ciTexCoordsVtxsSize); } FXAAShader::~FXAAShader() diff --git a/src/video/shaders/FXAAShader.h b/src/video/shaders/FXAAShader.h index b7604bc..30d9c5d 100644 --- a/src/video/shaders/FXAAShader.h +++ b/src/video/shaders/FXAAShader.h @@ -56,8 +56,8 @@ public: } void setTextureAndSampler(const GX2Texture *texture, const GX2Sampler *sampler) const { - GX2SetPixelTexture(texture, samplerLocation); - GX2SetPixelSampler(sampler, samplerLocation); + GX2SetPixelTexture((GX2Texture*)texture, samplerLocation); + GX2SetPixelSampler((GX2Sampler*)sampler, samplerLocation); } private: diff --git a/src/video/shaders/FetchShader.h b/src/video/shaders/FetchShader.h index 292052f..8152178 100644 --- a/src/video/shaders/FetchShader.h +++ b/src/video/shaders/FetchShader.h @@ -22,17 +22,17 @@ class FetchShader : public Shader { public: - FetchShader(GX2AttribStream * attributes, u32 attrCount, s32 type = GX2_FETCH_SHADER_TESSELATION_NONE, s32 tess = GX2_TESSELLATION_MODE_DISCRETE) + FetchShader(GX2AttribStream * attributes, u32 attrCount, GX2FetchShaderType type = GX2_FETCH_SHADER_TESSELLATION_NONE, GX2TessellationMode tess = GX2_TESSELLATION_MODE_DISCRETE) : fetchShader(NULL) , fetchShaderProgramm(NULL) { u32 shaderSize = GX2CalcFetchShaderSizeEx(attrCount, type, tess); - fetchShaderProgramm = memalign(GX2_SHADER_ALIGNMENT, shaderSize); + fetchShaderProgramm = (uint8_t*)memalign(GX2_SHADER_ALIGNMENT, shaderSize); if(fetchShaderProgramm) { fetchShader = new GX2FetchShader; GX2InitFetchShaderEx(fetchShader, fetchShaderProgramm, attrCount, attributes, type, tess); - GX2Invalidate(GX2_INVALIDATE_CPU_SHADER, fetchShaderProgramm, shaderSize); + GX2Invalidate(GX2_INVALIDATE_MODE_CPU_SHADER, fetchShaderProgramm, shaderSize); } } virtual ~FetchShader() { @@ -52,7 +52,7 @@ public: protected: GX2FetchShader *fetchShader; - void *fetchShaderProgramm; + uint8_t *fetchShaderProgramm; }; #endif // FETCH_SHADER_H diff --git a/src/video/shaders/PixelShader.h b/src/video/shaders/PixelShader.h index a1fa76b..8bb8a8e 100644 --- a/src/video/shaders/PixelShader.h +++ b/src/video/shaders/PixelShader.h @@ -28,39 +28,39 @@ public: if(pixelShader) { memset(pixelShader, 0, sizeof(GX2PixelShader)); - pixelShader->shader_mode = GX2_SHADER_MODE_UNIFORM_REGISTER; + pixelShader->mode = GX2_SHADER_MODE_UNIFORM_REGISTER; } } virtual ~PixelShader() { if(pixelShader) { - if(pixelShader->shader_data) - free(pixelShader->shader_data); + if(pixelShader->program) + free(pixelShader->program); - for(u32 i = 0; i < pixelShader->uniform_blocks_count; i++) - free((void*)pixelShader->uniform_block[i].name); + for(u32 i = 0; i < pixelShader->uniformBlockCount; i++) + free((void*)pixelShader->uniformBlocks[i].name); - if(pixelShader->uniform_block) - free((void*)pixelShader->uniform_block); + if(pixelShader->uniformBlocks) + free((void*)pixelShader->uniformBlocks); - for(u32 i = 0; i < pixelShader->uniform_vars_count; i++) - free((void*)pixelShader->uniform_var[i].name); + for(u32 i = 0; i < pixelShader->uniformVarCount; i++) + free((void*)pixelShader->uniformVars[i].name); - if(pixelShader->uniform_var) - free((void*)pixelShader->uniform_var); + if(pixelShader->uniformVars) + free((void*)pixelShader->uniformVars); - if(pixelShader->initial_value) - free((void*)pixelShader->initial_value); + if(pixelShader->initialValues) + free((void*)pixelShader->initialValues); - for(u32 i = 0; i < pixelShader->sampler_vars_count; i++) - free((void*)pixelShader->sampler_var[i].name); + for(u32 i = 0; i < pixelShader->samplerVarCount; i++) + free((void*)pixelShader->samplerVars[i].name); - if(pixelShader->sampler_var) - free((void*)pixelShader->sampler_var); + if(pixelShader->samplerVars) + free((void*)pixelShader->samplerVars); - if(pixelShader->loops_data) - free((void*)pixelShader->loops_data); + if(pixelShader->loopVars) + free((void*)pixelShader->loopVars); free(pixelShader); } @@ -72,15 +72,15 @@ public: return; //! this must be moved into an area where the graphic engine has access to and must be aligned to 0x100 - pixelShader->shader_size = programSize; - pixelShader->shader_data = memalign(GX2_SHADER_ALIGNMENT, pixelShader->shader_size); - if(pixelShader->shader_data) + pixelShader->size = programSize; + pixelShader->program = (u8*)memalign(GX2_SHADER_ALIGNMENT, pixelShader->size); + if(pixelShader->program) { - memcpy(pixelShader->shader_data, program, pixelShader->shader_size); - GX2Invalidate(GX2_INVALIDATE_CPU_SHADER, pixelShader->shader_data, pixelShader->shader_size); + memcpy(pixelShader->program, program, pixelShader->size); + GX2Invalidate(GX2_INVALIDATE_MODE_CPU_SHADER, pixelShader->program, pixelShader->size); } - memcpy(pixelShader->regs, regs, regsSize); + memcpy(&pixelShader->regs, regs, regsSize); } void addUniformVar(const GX2UniformVar & var) @@ -88,23 +88,23 @@ public: if(!pixelShader) return; - u32 idx = pixelShader->uniform_vars_count; + u32 idx = pixelShader->uniformVarCount; - GX2UniformVar* newVar = (GX2UniformVar*) malloc((pixelShader->uniform_vars_count + 1) * sizeof(GX2UniformVar)); + GX2UniformVar* newVar = (GX2UniformVar*) malloc((pixelShader->uniformVarCount + 1) * sizeof(GX2UniformVar)); if(newVar) { - if(pixelShader->uniform_var) + if(pixelShader->uniformVars) { - memcpy(newVar, pixelShader->uniform_var, pixelShader->uniform_vars_count * sizeof(GX2UniformVar)); - free(pixelShader->uniform_var); + memcpy(newVar, pixelShader->uniformVars, pixelShader->uniformVarCount * sizeof(GX2UniformVar)); + free(pixelShader->uniformVars); } - pixelShader->uniform_var = newVar; + pixelShader->uniformVars = newVar; - memcpy(pixelShader->uniform_var + idx, &var, sizeof(GX2UniformVar)); - pixelShader->uniform_var[idx].name = (char*) malloc(strlen(var.name) + 1); - strcpy((char*)pixelShader->uniform_var[idx].name, var.name); + memcpy(pixelShader->uniformVars + idx, &var, sizeof(GX2UniformVar)); + pixelShader->uniformVars[idx].name = (char*) malloc(strlen(var.name) + 1); + strcpy((char*)pixelShader->uniformVars[idx].name, var.name); - pixelShader->uniform_vars_count++; + pixelShader->uniformVarCount++; } } @@ -113,23 +113,23 @@ public: if(!pixelShader) return; - u32 idx = pixelShader->sampler_vars_count; + u32 idx = pixelShader->samplerVarCount; - GX2SamplerVar* newVar = (GX2SamplerVar*) malloc((pixelShader->sampler_vars_count + 1) * sizeof(GX2SamplerVar)); + GX2SamplerVar* newVar = (GX2SamplerVar*) malloc((pixelShader->samplerVarCount + 1) * sizeof(GX2SamplerVar)); if(newVar) { - if(pixelShader->sampler_var) + if(pixelShader->samplerVars) { - memcpy(newVar, pixelShader->sampler_var, pixelShader->sampler_vars_count * sizeof(GX2SamplerVar)); - free(pixelShader->sampler_var); + memcpy(newVar, pixelShader->samplerVars, pixelShader->samplerVarCount * sizeof(GX2SamplerVar)); + free(pixelShader->samplerVars); } - pixelShader->sampler_var = newVar; + pixelShader->samplerVars = newVar; - memcpy(pixelShader->sampler_var + idx, &var, sizeof(GX2SamplerVar)); - pixelShader->sampler_var[idx].name = (char*) malloc(strlen(var.name) + 1); - strcpy((char*)pixelShader->sampler_var[idx].name, var.name); + memcpy(pixelShader->samplerVars + idx, &var, sizeof(GX2SamplerVar)); + pixelShader->samplerVars[idx].name = (char*) malloc(strlen(var.name) + 1); + strcpy((char*)pixelShader->samplerVars[idx].name, var.name); - pixelShader->sampler_vars_count++; + pixelShader->samplerVarCount++; } } GX2PixelShader * getPixelShader() const { @@ -141,7 +141,7 @@ public: } static inline void setUniformReg(u32 location, u32 size, const void * reg) { - GX2SetPixelUniformReg(location, size, reg); + GX2SetPixelUniformReg(location, size, (uint32_t *)reg); } protected: GX2PixelShader *pixelShader; diff --git a/src/video/shaders/Shader.h b/src/video/shaders/Shader.h index 93741d5..2c4f580 100644 --- a/src/video/shaders/Shader.h +++ b/src/video/shaders/Shader.h @@ -19,9 +19,18 @@ #include "glm/glm.hpp" #include "glm/gtc/matrix_transform.hpp" -#include "dynamic_libs/gx2_functions.h" #include "utils/utils.h" +#include +#include +#include +#include +#include +#include +#include +#include +#include "common/gx2_ext.h" + class Shader { protected: @@ -36,34 +45,34 @@ public: GX2SetLineWidth(width); } - static void draw(s32 primitive = GX2_PRIMITIVE_QUADS, u32 vtxCount = 4) + static void draw(s32 primitive = GX2_PRIMITIVE_MODE_QUADS, u32 vtxCount = 4) { switch(primitive) { default: - case GX2_PRIMITIVE_QUADS: + case GX2_PRIMITIVE_MODE_QUADS: { - GX2DrawEx(GX2_PRIMITIVE_QUADS, vtxCount, 0, 1); + GX2DrawEx(GX2_PRIMITIVE_MODE_QUADS, vtxCount, 0, 1); break; } - case GX2_PRIMITIVE_TRIANGLES: + case GX2_PRIMITIVE_MODE_TRIANGLES: { - GX2DrawEx(GX2_PRIMITIVE_TRIANGLES, vtxCount, 0, 1); + GX2DrawEx(GX2_PRIMITIVE_MODE_TRIANGLES, vtxCount, 0, 1); break; } - case GX2_PRIMITIVE_TRIANGLE_FAN: + case GX2_PRIMITIVE_MODE_TRIANGLE_FAN: { - GX2DrawEx(GX2_PRIMITIVE_TRIANGLE_FAN, vtxCount, 0, 1); + GX2DrawEx(GX2_PRIMITIVE_MODE_TRIANGLE_FAN, vtxCount, 0, 1); break; } - case GX2_PRIMITIVE_LINES: + case GX2_PRIMITIVE_MODE_LINES: { - GX2DrawEx(GX2_PRIMITIVE_LINES, vtxCount, 0, 1); + GX2DrawEx(GX2_PRIMITIVE_MODE_LINES, vtxCount, 0, 1); break; } - case GX2_PRIMITIVE_LINE_STRIP: + case GX2_PRIMITIVE_MODE_LINE_STRIP: { - GX2DrawEx(GX2_PRIMITIVE_LINE_STRIP, vtxCount, 0, 1); + GX2DrawEx(GX2_PRIMITIVE_MODE_LINE_STRIP, vtxCount, 0, 1); break; } //! TODO: add other primitives later diff --git a/src/video/shaders/Shader3D.cpp b/src/video/shaders/Shader3D.cpp index 6857cd1..0824be6 100644 --- a/src/video/shaders/Shader3D.cpp +++ b/src/video/shaders/Shader3D.cpp @@ -198,12 +198,12 @@ Shader3D::Shader3D() colorIntensityLocation = 0; fadeDistanceLocation = 4; fadeOutLocation = 8; - pixelShader.addUniformVar((GX2UniformVar){ "unf_color_intensity", GX2_VAR_TYPE_VEC4, 1, colorIntensityLocation, 0xffffffff }); - pixelShader.addUniformVar((GX2UniformVar){ "unf_fade_distance", GX2_VAR_TYPE_FLOAT, 1, fadeDistanceLocation, 0xffffffff }); - pixelShader.addUniformVar((GX2UniformVar){ "unf_fade_out_alpha", GX2_VAR_TYPE_VEC4, 1, fadeOutLocation, 0xffffffff }); + pixelShader.addUniformVar((GX2UniformVar){ "unf_color_intensity", GX2_SHADER_VAR_TYPE_FLOAT4, 1, colorIntensityLocation, -1 }); + pixelShader.addUniformVar((GX2UniformVar){ "unf_fade_distance", GX2_SHADER_VAR_TYPE_FLOAT, 1, fadeDistanceLocation, -1 }); + pixelShader.addUniformVar((GX2UniformVar){ "unf_fade_out_alpha", GX2_SHADER_VAR_TYPE_FLOAT4, 1, fadeOutLocation, -1 }); samplerLocation = 0; - pixelShader.addSamplerVar((GX2SamplerVar){ "sampl_texture", GX2_SAMPLER_TYPE_2D, samplerLocation }); + pixelShader.addSamplerVar((GX2SamplerVar){ "sampl_texture", GX2_SAMPLER_VAR_TYPE_SAMPLER_2D, samplerLocation }); //! create vertex shader vertexShader.setProgram(cpVertexShaderProgram, sizeof(cpVertexShaderProgram), cpVertexShaderRegs, sizeof(cpVertexShaderRegs)); @@ -211,18 +211,18 @@ Shader3D::Shader3D() modelMatrixLocation = 0; projectionMatrixLocation = 16; viewMatrixLocation = 32; - vertexShader.addUniformVar((GX2UniformVar){ "modelMatrix", GX2_VAR_TYPE_MAT4, 1, modelMatrixLocation, 0xffffffff }); - vertexShader.addUniformVar((GX2UniformVar){ "viewMatrix", GX2_VAR_TYPE_MAT4, 1, projectionMatrixLocation, 0xffffffff }); - vertexShader.addUniformVar((GX2UniformVar){ "projectionMatrix", GX2_VAR_TYPE_MAT4, 1, viewMatrixLocation, 0xffffffff }); + vertexShader.addUniformVar((GX2UniformVar){ "modelMatrix", GX2_SHADER_VAR_TYPE_MATRIX4X4, 1, modelMatrixLocation, -1 }); + vertexShader.addUniformVar((GX2UniformVar){ "viewMatrix", GX2_SHADER_VAR_TYPE_MATRIX4X4, 1, projectionMatrixLocation, -1 }); + vertexShader.addUniformVar((GX2UniformVar){ "projectionMatrix", GX2_SHADER_VAR_TYPE_MATRIX4X4, 1, viewMatrixLocation, -1 }); positionLocation = 0; texCoordLocation = 1; - vertexShader.addAttribVar((GX2AttribVar){ "attr_position", GX2_VAR_TYPE_VEC3, 0, positionLocation }); - vertexShader.addAttribVar((GX2AttribVar){ "attr_texture_coord", GX2_VAR_TYPE_VEC2, 0, texCoordLocation }); + vertexShader.addAttribVar((GX2AttribVar){ "attr_position", GX2_SHADER_VAR_TYPE_FLOAT4, 0, positionLocation }); + vertexShader.addAttribVar((GX2AttribVar){ "attr_texture_coord", GX2_SHADER_VAR_TYPE_FLOAT2, 0, texCoordLocation }); //! setup attribute streams - GX2InitAttribStream(vertexShader.getAttributeBuffer(0), positionLocation, 0, 0, GX2_ATTRIB_FORMAT_32_32_32_FLOAT); - GX2InitAttribStream(vertexShader.getAttributeBuffer(1), texCoordLocation, 1, 0, GX2_ATTRIB_FORMAT_32_32_FLOAT); + GX2InitAttribStream(vertexShader.getAttributeBuffer(0), positionLocation, 0, 0, GX2_ATTRIB_FORMAT_FLOAT_32_32_32); + GX2InitAttribStream(vertexShader.getAttributeBuffer(1), texCoordLocation, 1, 0, GX2_ATTRIB_FORMAT_FLOAT_32_32); //! create fetch shader fetchShader = new FetchShader(vertexShader.getAttributeBuffer(), vertexShader.getAttributesCount()); @@ -238,14 +238,14 @@ Shader3D::Shader3D() posVtxs[i++] = 1.0f; posVtxs[i++] = -1.0f; posVtxs[i++] = 0.0f; posVtxs[i++] = 1.0f; posVtxs[i++] = 1.0f; posVtxs[i++] = 0.0f; posVtxs[i++] = -1.0f; posVtxs[i++] = 1.0f; posVtxs[i++] = 0.0f; - GX2Invalidate(GX2_INVALIDATE_CPU_ATTRIB_BUFFER, posVtxs, ciPositionVtxsSize); + GX2Invalidate(GX2_INVALIDATE_MODE_CPU_ATTRIBUTE_BUFFER, posVtxs, ciPositionVtxsSize); i = 0; texCoords[i++] = 0.0f; texCoords[i++] = 1.0f; texCoords[i++] = 1.0f; texCoords[i++] = 1.0f; texCoords[i++] = 1.0f; texCoords[i++] = 0.0f; texCoords[i++] = 0.0f; texCoords[i++] = 0.0f; - GX2Invalidate(GX2_INVALIDATE_CPU_ATTRIB_BUFFER, texCoords, ciTexCoordsVtxsSize); + GX2Invalidate(GX2_INVALIDATE_MODE_CPU_ATTRIBUTE_BUFFER, texCoords, ciTexCoordsVtxsSize); } Shader3D::~Shader3D() diff --git a/src/video/shaders/Shader3D.h b/src/video/shaders/Shader3D.h index 7289152..1b30b3f 100644 --- a/src/video/shaders/Shader3D.h +++ b/src/video/shaders/Shader3D.h @@ -111,8 +111,8 @@ public: } void setTextureAndSampler(const GX2Texture *texture, const GX2Sampler *sampler) const { - GX2SetPixelTexture(texture, samplerLocation); - GX2SetPixelSampler(sampler, samplerLocation); + GX2SetPixelTexture((GX2Texture*)texture, samplerLocation); + GX2SetPixelSampler((GX2Sampler*)sampler, samplerLocation); } }; diff --git a/src/video/shaders/ShaderFractalColor.cpp b/src/video/shaders/ShaderFractalColor.cpp index 7e8624c..db6579f 100644 --- a/src/video/shaders/ShaderFractalColor.cpp +++ b/src/video/shaders/ShaderFractalColor.cpp @@ -292,10 +292,10 @@ ShaderFractalColor::ShaderFractalColor() colorIntensityLocation = 4; fadeOutLocation = 8; fractalLocation = 12; - pixelShader.addUniformVar((GX2UniformVar){ "unf_blur_border", GX2_VAR_TYPE_FLOAT, 1, blurLocation, 0xffffffff }); - pixelShader.addUniformVar((GX2UniformVar){ "unf_color_intensity", GX2_VAR_TYPE_VEC4, 1, colorIntensityLocation, 0xffffffff }); - pixelShader.addUniformVar((GX2UniformVar){ "unf_fade_out_alpha", GX2_VAR_TYPE_VEC4, 1, fadeOutLocation, 0xffffffff }); - pixelShader.addUniformVar((GX2UniformVar){ "unf_fract_alpha", GX2_VAR_TYPE_INT, 1, fractalLocation, 0xffffffff }); + pixelShader.addUniformVar((GX2UniformVar){ "unf_blur_border", GX2_SHADER_VAR_TYPE_FLOAT, 1, blurLocation, 0xffffffff }); + pixelShader.addUniformVar((GX2UniformVar){ "unf_color_intensity", GX2_SHADER_VAR_TYPE_FLOAT4, 1, colorIntensityLocation, 0xffffffff }); + pixelShader.addUniformVar((GX2UniformVar){ "unf_fade_out_alpha", GX2_SHADER_VAR_TYPE_FLOAT4, 1, fadeOutLocation, 0xffffffff }); + pixelShader.addUniformVar((GX2UniformVar){ "unf_fract_alpha", GX2_SHADER_VAR_TYPE_INT, 1, fractalLocation, 0xffffffff }); //! create vertex shader vertexShader.setProgram(cpVertexShaderProgram, sizeof(cpVertexShaderProgram), cpVertexShaderRegs, sizeof(cpVertexShaderRegs)); @@ -303,21 +303,21 @@ ShaderFractalColor::ShaderFractalColor() modelMatrixLocation = 0; projectionMatrixLocation = 16; viewMatrixLocation = 32; - vertexShader.addUniformVar((GX2UniformVar){ "modelMatrix", GX2_VAR_TYPE_MAT4, 1, modelMatrixLocation, 0xffffffff }); - vertexShader.addUniformVar((GX2UniformVar){ "projectionMatrix", GX2_VAR_TYPE_MAT4, 1, projectionMatrixLocation, 0xffffffff }); - vertexShader.addUniformVar((GX2UniformVar){ "viewMatrix", GX2_VAR_TYPE_MAT4, 1, viewMatrixLocation, 0xffffffff }); + vertexShader.addUniformVar((GX2UniformVar){ "modelMatrix", GX2_SHADER_VAR_TYPE_MATRIX4X4, 1, modelMatrixLocation, 0xffffffff }); + vertexShader.addUniformVar((GX2UniformVar){ "projectionMatrix", GX2_SHADER_VAR_TYPE_MATRIX4X4, 1, projectionMatrixLocation, 0xffffffff }); + vertexShader.addUniformVar((GX2UniformVar){ "viewMatrix", GX2_SHADER_VAR_TYPE_MATRIX4X4, 1, viewMatrixLocation, 0xffffffff }); positionLocation = 0; colorLocation = 1; texCoordLocation = 2; - vertexShader.addAttribVar((GX2AttribVar){ "attr_colors", GX2_VAR_TYPE_VEC4, 0, colorLocation }); - vertexShader.addAttribVar((GX2AttribVar){ "attr_position", GX2_VAR_TYPE_VEC3, 0, positionLocation }); - vertexShader.addAttribVar((GX2AttribVar){ "attr_texture_coord", GX2_VAR_TYPE_VEC2, 0, texCoordLocation }); + vertexShader.addAttribVar((GX2AttribVar){ "attr_colors", GX2_SHADER_VAR_TYPE_FLOAT4, 0, colorLocation }); + vertexShader.addAttribVar((GX2AttribVar){ "attr_position", GX2_SHADER_VAR_TYPE_FLOAT3, 0, positionLocation }); + vertexShader.addAttribVar((GX2AttribVar){ "attr_texture_coord", GX2_SHADER_VAR_TYPE_FLOAT2, 0, texCoordLocation }); //! setup attribute streams - GX2InitAttribStream(vertexShader.getAttributeBuffer(0), positionLocation, 0, 0, GX2_ATTRIB_FORMAT_32_32_32_FLOAT); - GX2InitAttribStream(vertexShader.getAttributeBuffer(1), texCoordLocation, 1, 0, GX2_ATTRIB_FORMAT_32_32_FLOAT); - GX2InitAttribStream(vertexShader.getAttributeBuffer(2), colorLocation, 2, 0, GX2_ATTRIB_FORMAT_8_8_8_8_UNORM); + GX2InitAttribStream(vertexShader.getAttributeBuffer(0), positionLocation, 0, 0, GX2_ATTRIB_FORMAT_FLOAT_32_32_32); + GX2InitAttribStream(vertexShader.getAttributeBuffer(1), texCoordLocation, 1, 0, GX2_ATTRIB_FORMAT_FLOAT_32_32); + GX2InitAttribStream(vertexShader.getAttributeBuffer(2), colorLocation, 2, 0, GX2_ATTRIB_FORMAT_UNORM_8_8_8_8); //! create fetch shader fetchShader = new FetchShader(vertexShader.getAttributeBuffer(), vertexShader.getAttributesCount()); @@ -334,20 +334,20 @@ ShaderFractalColor::ShaderFractalColor() posVtxs[i++] = 1.0f; posVtxs[i++] = -1.0f; posVtxs[i++] = 0.0f; posVtxs[i++] = 1.0f; posVtxs[i++] = 1.0f; posVtxs[i++] = 0.0f; posVtxs[i++] = -1.0f; posVtxs[i++] = 1.0f; posVtxs[i++] = 0.0f; - GX2Invalidate(GX2_INVALIDATE_CPU_ATTRIB_BUFFER, posVtxs, ciPositionVtxsSize); + GX2Invalidate(GX2_INVALIDATE_MODE_CPU_ATTRIBUTE_BUFFER, posVtxs, ciPositionVtxsSize); i = 0; texCoords[i++] = 0.0f; texCoords[i++] = 1.0f; texCoords[i++] = 1.0f; texCoords[i++] = 1.0f; texCoords[i++] = 1.0f; texCoords[i++] = 0.0f; texCoords[i++] = 0.0f; texCoords[i++] = 0.0f; - GX2Invalidate(GX2_INVALIDATE_CPU_ATTRIB_BUFFER, texCoords, ciTexCoordsVtxsSize); + GX2Invalidate(GX2_INVALIDATE_MODE_CPU_ATTRIBUTE_BUFFER, texCoords, ciTexCoordsVtxsSize); for(i = 0; i < (int)ciColorVtxsSize; i++) colorVtxs[i] = 0xff; - GX2Invalidate(GX2_INVALIDATE_CPU_ATTRIB_BUFFER, colorVtxs, ciColorVtxsSize); + GX2Invalidate(GX2_INVALIDATE_MODE_CPU_ATTRIBUTE_BUFFER, colorVtxs, ciColorVtxsSize); } ShaderFractalColor::~ShaderFractalColor() diff --git a/src/video/shaders/Texture2DShader.cpp b/src/video/shaders/Texture2DShader.cpp index ad7ac52..a1973da 100644 --- a/src/video/shaders/Texture2DShader.cpp +++ b/src/video/shaders/Texture2DShader.cpp @@ -204,11 +204,11 @@ Texture2DShader::Texture2DShader() blurLocation = 0; colorIntensityLocation = 4; - pixelShader.addUniformVar((GX2UniformVar){ "unf_blur_texture_direction", GX2_VAR_TYPE_VEC3, 1, blurLocation, 0xffffffff }); - pixelShader.addUniformVar((GX2UniformVar){ "unf_color_intensity", GX2_VAR_TYPE_VEC4, 1, colorIntensityLocation, 0xffffffff }); + pixelShader.addUniformVar((GX2UniformVar){ "unf_blur_texture_direction", GX2_SHADER_VAR_TYPE_FLOAT3, 1, blurLocation, -1 }); + pixelShader.addUniformVar((GX2UniformVar){ "unf_color_intensity", GX2_SHADER_VAR_TYPE_FLOAT4, 1, colorIntensityLocation, -1 }); samplerLocation = 0; - pixelShader.addSamplerVar((GX2SamplerVar){ "sampl_texture", GX2_SAMPLER_TYPE_2D, samplerLocation }); + pixelShader.addSamplerVar((GX2SamplerVar){ "sampl_texture", GX2_SAMPLER_VAR_TYPE_SAMPLER_2D, samplerLocation }); //! create vertex shader vertexShader.setProgram(cpVertexShaderProgram, sizeof(cpVertexShaderProgram), cpVertexShaderRegs, sizeof(cpVertexShaderRegs)); @@ -216,18 +216,18 @@ Texture2DShader::Texture2DShader() angleLocation = 0; offsetLocation = 4; scaleLocation = 8; - vertexShader.addUniformVar((GX2UniformVar){ "unf_angle", GX2_VAR_TYPE_FLOAT, 1, angleLocation, 0xffffffff }); - vertexShader.addUniformVar((GX2UniformVar){ "unf_offset", GX2_VAR_TYPE_VEC3, 1, offsetLocation, 0xffffffff }); - vertexShader.addUniformVar((GX2UniformVar){ "unf_scale", GX2_VAR_TYPE_VEC3, 1, scaleLocation, 0xffffffff }); + vertexShader.addUniformVar((GX2UniformVar){ "unf_angle", GX2_SHADER_VAR_TYPE_FLOAT, 1, angleLocation, -1 }); + vertexShader.addUniformVar((GX2UniformVar){ "unf_offset", GX2_SHADER_VAR_TYPE_FLOAT3, 1, offsetLocation, -1 }); + vertexShader.addUniformVar((GX2UniformVar){ "unf_scale", GX2_SHADER_VAR_TYPE_FLOAT3, 1, scaleLocation, -1 }); positionLocation = 0; texCoordLocation = 1; - vertexShader.addAttribVar((GX2AttribVar){ "attr_position", GX2_VAR_TYPE_VEC3, 0, positionLocation }); - vertexShader.addAttribVar((GX2AttribVar){ "attr_texture_coord", GX2_VAR_TYPE_VEC2, 0, texCoordLocation }); + vertexShader.addAttribVar((GX2AttribVar){ "attr_position", GX2_SHADER_VAR_TYPE_FLOAT3, 0, positionLocation }); + vertexShader.addAttribVar((GX2AttribVar){ "attr_texture_coord", GX2_SHADER_VAR_TYPE_FLOAT2, 0, texCoordLocation }); //! setup attribute streams - GX2InitAttribStream(vertexShader.getAttributeBuffer(0), positionLocation, 0, 0, GX2_ATTRIB_FORMAT_32_32_32_FLOAT); - GX2InitAttribStream(vertexShader.getAttributeBuffer(1), texCoordLocation, 1, 0, GX2_ATTRIB_FORMAT_32_32_FLOAT); + GX2InitAttribStream(vertexShader.getAttributeBuffer(0), positionLocation, 0, 0, GX2_ATTRIB_FORMAT_FLOAT_32_32_32); + GX2InitAttribStream(vertexShader.getAttributeBuffer(1), texCoordLocation, 1, 0, GX2_ATTRIB_FORMAT_FLOAT_32_32); //! create fetch shader fetchShader = new FetchShader(vertexShader.getAttributeBuffer(), vertexShader.getAttributesCount()); @@ -243,14 +243,14 @@ Texture2DShader::Texture2DShader() posVtxs[i++] = 1.0f; posVtxs[i++] = -1.0f; posVtxs[i++] = 0.0f; posVtxs[i++] = 1.0f; posVtxs[i++] = 1.0f; posVtxs[i++] = 0.0f; posVtxs[i++] = -1.0f; posVtxs[i++] = 1.0f; posVtxs[i++] = 0.0f; - GX2Invalidate(GX2_INVALIDATE_CPU_ATTRIB_BUFFER, posVtxs, ciPositionVtxsSize); + GX2Invalidate(GX2_INVALIDATE_MODE_CPU_ATTRIBUTE_BUFFER, posVtxs, ciPositionVtxsSize); i = 0; texCoords[i++] = 0.0f; texCoords[i++] = 1.0f; texCoords[i++] = 1.0f; texCoords[i++] = 1.0f; texCoords[i++] = 1.0f; texCoords[i++] = 0.0f; texCoords[i++] = 0.0f; texCoords[i++] = 0.0f; - GX2Invalidate(GX2_INVALIDATE_CPU_ATTRIB_BUFFER, texCoords, ciTexCoordsVtxsSize); + GX2Invalidate(GX2_INVALIDATE_MODE_CPU_ATTRIBUTE_BUFFER, texCoords, ciTexCoordsVtxsSize); } Texture2DShader::~Texture2DShader() diff --git a/src/video/shaders/Texture2DShader.h b/src/video/shaders/Texture2DShader.h index cddeee0..3ce80de 100644 --- a/src/video/shaders/Texture2DShader.h +++ b/src/video/shaders/Texture2DShader.h @@ -104,8 +104,8 @@ public: } void setTextureAndSampler(const GX2Texture *texture, const GX2Sampler *sampler) const { - GX2SetPixelTexture(texture, samplerLocation); - GX2SetPixelSampler(sampler, samplerLocation); + GX2SetPixelTexture((GX2Texture*)texture, samplerLocation); + GX2SetPixelSampler((GX2Sampler*)sampler, samplerLocation); } }; diff --git a/src/video/shaders/VertexShader.h b/src/video/shaders/VertexShader.h index 18dc0fe..bcd0f13 100644 --- a/src/video/shaders/VertexShader.h +++ b/src/video/shaders/VertexShader.h @@ -31,7 +31,7 @@ public: if(vertexShader) { memset(vertexShader, 0, sizeof(GX2VertexShader)); - vertexShader->shader_mode = GX2_SHADER_MODE_UNIFORM_REGISTER; + vertexShader->mode = GX2_SHADER_MODE_UNIFORM_REGISTER; } } @@ -40,38 +40,38 @@ public: if(vertexShader) { - if(vertexShader->shader_data) - free(vertexShader->shader_data); + if(vertexShader->program) + free(vertexShader->program); - for(u32 i = 0; i < vertexShader->uniform_blocks_count; i++) - free((void*)vertexShader->uniform_block[i].name); + for(u32 i = 0; i < vertexShader->uniformBlockCount; i++) + free((void*)vertexShader->uniformBlocks[i].name); - if(vertexShader->uniform_block) - free((void*)vertexShader->uniform_block); + if(vertexShader->uniformBlocks) + free((void*)vertexShader->uniformBlocks); - for(u32 i = 0; i < vertexShader->uniform_vars_count; i++) - free((void*)vertexShader->uniform_var[i].name); + for(u32 i = 0; i < vertexShader->uniformVarCount; i++) + free((void*)vertexShader->uniformVars[i].name); - if(vertexShader->uniform_var) - free((void*)vertexShader->uniform_var); + if(vertexShader->uniformVars) + free((void*)vertexShader->uniformVars); - if(vertexShader->initial_value) - free((void*)vertexShader->initial_value); + if(vertexShader->initialValues) + free((void*)vertexShader->initialValues); - for(u32 i = 0; i < vertexShader->sampler_vars_count; i++) - free((void*)vertexShader->sampler_var[i].name); + for(u32 i = 0; i < vertexShader->samplerVarCount; i++) + free((void*)vertexShader->samplerVars[i].name); - if(vertexShader->sampler_var) - free((void*)vertexShader->sampler_var); + if(vertexShader->samplerVars) + free((void*)vertexShader->samplerVars); - for(u32 i = 0; i < vertexShader->attribute_vars_count; i++) - free((void*)vertexShader->attribute_var[i].name); + for(u32 i = 0; i < vertexShader->attribVarCount; i++) + free((void*)vertexShader->attribVars[i].name); - if(vertexShader->attribute_var) - free((void*)vertexShader->attribute_var); + if(vertexShader->attribVars) + free((void*)vertexShader->attribVars); - if(vertexShader->loops_data) - free((void*)vertexShader->loops_data); + if(vertexShader->loopVars) + free((void*)vertexShader->loopVars); free(vertexShader); } @@ -83,15 +83,15 @@ public: return; //! this must be moved into an area where the graphic engine has access to and must be aligned to 0x100 - vertexShader->shader_size = programSize; - vertexShader->shader_data = memalign(GX2_SHADER_ALIGNMENT, vertexShader->shader_size); - if(vertexShader->shader_data) + vertexShader->size = programSize; + vertexShader->program = (u8*) memalign(GX2_SHADER_ALIGNMENT, vertexShader->size); + if(vertexShader->program) { - memcpy(vertexShader->shader_data, program, vertexShader->shader_size); - GX2Invalidate(GX2_INVALIDATE_CPU_SHADER, vertexShader->shader_data, vertexShader->shader_size); + memcpy(vertexShader->program, program, vertexShader->size); + GX2Invalidate(GX2_INVALIDATE_MODE_CPU_SHADER, vertexShader->program, vertexShader->size); } - memcpy(vertexShader->regs, regs, regsSize); + memcpy(&vertexShader->regs, regs, regsSize); } void addUniformVar(const GX2UniformVar & var) @@ -99,23 +99,23 @@ public: if(!vertexShader) return; - u32 idx = vertexShader->uniform_vars_count; + u32 idx = vertexShader->uniformVarCount; - GX2UniformVar* newVar = (GX2UniformVar*) malloc((vertexShader->uniform_vars_count + 1) * sizeof(GX2UniformVar)); + GX2UniformVar* newVar = (GX2UniformVar*) malloc((vertexShader->uniformVarCount + 1) * sizeof(GX2UniformVar)); if(newVar) { - if(vertexShader->uniform_vars_count > 0) + if(vertexShader->uniformVarCount > 0) { - memcpy(newVar, vertexShader->uniform_var, vertexShader->uniform_vars_count * sizeof(GX2UniformVar)); - free(vertexShader->uniform_var); + memcpy(newVar, vertexShader->uniformVars, vertexShader->uniformVarCount * sizeof(GX2UniformVar)); + free(vertexShader->uniformVars); } - vertexShader->uniform_var = newVar; + vertexShader->uniformVars = newVar; - memcpy(vertexShader->uniform_var + idx, &var, sizeof(GX2UniformVar)); - vertexShader->uniform_var[idx].name = (char*) malloc(strlen(var.name) + 1); - strcpy((char*)vertexShader->uniform_var[idx].name, var.name); + memcpy(vertexShader->uniformVars + idx, &var, sizeof(GX2UniformVar)); + vertexShader->uniformVars[idx].name = (char*) malloc(strlen(var.name) + 1); + strcpy((char*)vertexShader->uniformVars[idx].name, var.name); - vertexShader->uniform_vars_count++; + vertexShader->uniformVarCount++; } } @@ -124,28 +124,28 @@ public: if(!vertexShader) return; - u32 idx = vertexShader->attribute_vars_count; + u32 idx = vertexShader->attribVarCount; - GX2AttribVar* newVar = (GX2AttribVar*) malloc((vertexShader->attribute_vars_count + 1) * sizeof(GX2AttribVar)); + GX2AttribVar* newVar = (GX2AttribVar*) malloc((vertexShader->attribVarCount + 1) * sizeof(GX2AttribVar)); if(newVar) { - if(vertexShader->attribute_vars_count > 0) + if(vertexShader->attribVarCount > 0) { - memcpy(newVar, vertexShader->attribute_var, vertexShader->attribute_vars_count * sizeof(GX2AttribVar)); - free(vertexShader->attribute_var); + memcpy(newVar, vertexShader->attribVars, vertexShader->attribVarCount * sizeof(GX2AttribVar)); + free(vertexShader->attribVars); } - vertexShader->attribute_var = newVar; + vertexShader->attribVars = newVar; - memcpy(vertexShader->attribute_var + idx, &var, sizeof(GX2AttribVar)); - vertexShader->attribute_var[idx].name = (char*) malloc(strlen(var.name) + 1); - strcpy((char*)vertexShader->attribute_var[idx].name, var.name); + memcpy(vertexShader->attribVars + idx, &var, sizeof(GX2AttribVar)); + vertexShader->attribVars[idx].name = (char*) malloc(strlen(var.name) + 1); + strcpy((char*)vertexShader->attribVars[idx].name, var.name); - vertexShader->attribute_vars_count++; + vertexShader->attribVarCount++; } } static inline void setAttributeBuffer(u32 bufferIdx, u32 bufferSize, u32 stride, const void * buffer) { - GX2SetAttribBuffer(bufferIdx, bufferSize, stride, buffer); + GX2SetAttribBuffer(bufferIdx, bufferSize, stride, (void*)buffer); } GX2VertexShader *getVertexShader() const { @@ -167,7 +167,7 @@ public: } static void setUniformReg(u32 location, u32 size, const void * reg) { - GX2SetVertexUniformReg(location, size, reg); + GX2SetVertexUniformReg(location, size, (uint32_t*)reg); } protected: u32 attributesCount;