diff --git a/CMakeLists.txt b/CMakeLists.txt index 31bd7742..c6f5ec0b 100644 --- a/CMakeLists.txt +++ b/CMakeLists.txt @@ -852,7 +852,8 @@ if(VITA) set(VPK_FILE_ARGS "") file(GLOB_RECURSE SCE_SYS_FILES packaging/vita/sce_sys/*) - foreach(FILE ${SCE_SYS_FILES}) + file(GLOB_RECURSE SCE_MODULE_FILES packaging/vita/sce_module/*) + foreach(FILE ${SCE_SYS_FILES} ${SCE_MODULE_FILES}) file(RELATIVE_PATH REL_FILE ${CMAKE_CURRENT_SOURCE_DIR}/packaging/vita/ ${FILE}) list(APPEND VPK_FILE_ARGS "FILE") list(APPEND VPK_FILE_ARGS ${FILE}) diff --git a/CONFIG/vita/CMakeLists.txt b/CONFIG/vita/CMakeLists.txt index e9937041..63c38512 100644 --- a/CONFIG/vita/CMakeLists.txt +++ b/CONFIG/vita/CMakeLists.txt @@ -23,6 +23,7 @@ target_link_libraries(iniparser_paf ScePafStdc_stub SceLibKernel_stub SceLibc_stub + SceFios2_stub ) target_include_directories(iniparser_paf PUBLIC @@ -62,8 +63,8 @@ target_link_libraries(isle-config PRIVATE ScePafStdc_stub SceAppSettings_stub SceFios2_stub + SceLibc_stub - #Isle::iniparser iniparser_paf ) diff --git a/CONFIG/vita/cxml/locale/en.xml b/CONFIG/vita/cxml/locale/en.xml index d23fa719..c1a52a65 100644 --- a/CONFIG/vita/cxml/locale/en.xml +++ b/CONFIG/vita/cxml/locale/en.xml @@ -34,6 +34,11 @@ + + + + + diff --git a/CONFIG/vita/cxml/settings.xml b/CONFIG/vita/cxml/settings.xml index f2a27cc6..b26ae2cb 100644 --- a/CONFIG/vita/cxml/settings.xml +++ b/CONFIG/vita/cxml/settings.xml @@ -9,10 +9,10 @@ - - - - + + + + @@ -28,6 +28,11 @@ + + + + + diff --git a/CONFIG/vita/include/fios2.h b/CONFIG/vita/include/fios2.h deleted file mode 100644 index d0b1b690..00000000 --- a/CONFIG/vita/include/fios2.h +++ /dev/null @@ -1,134 +0,0 @@ -#include -#include -#include - -#ifdef __cplusplus -extern "C" -{ -#endif - - typedef struct SceFiosBuffer { - void* pPtr; - size_t length; - } SceFiosBuffer; - -#define SCE_FIOS_THREAD_TYPES 3 - - typedef struct SceFiosParams { - uint32_t initialized : 1; - uint32_t paramsSize : 15; - uint32_t pathMax : 16; - uint32_t profiling; - uint32_t ioThreadCount; - uint32_t threadsPerScheduler; - uint32_t extraFlag1 : 1; - uint32_t extraFlags : 31; - uint32_t maxChunk; - uint8_t maxDecompressorThreadCount; - uint8_t reserved1; - uint8_t reserved2; - uint8_t reserved3; - intptr_t reserved4; - intptr_t reserved5; - SceFiosBuffer opStorage; - SceFiosBuffer fhStorage; - SceFiosBuffer dhStorage; - SceFiosBuffer chunkStorage; - void* pVprintf; - void* pMemcpy; - void* pProfileCallback; - int threadPriority[SCE_FIOS_THREAD_TYPES]; - int threadAffinity[SCE_FIOS_THREAD_TYPES]; - int threadStackSize[SCE_FIOS_THREAD_TYPES]; - } SceFiosParams; - -#define SCE_KERNEL_HIGHEST_PRIORITY_USER (64) -#define SCE_KERNEL_LOWEST_PRIORITY_USER (191) - -#define SCE_FIOS_IO_THREAD_DEFAULT_PRIORITY (SCE_KERNEL_HIGHEST_PRIORITY_USER + 2) -#define SCE_FIOS_DECOMPRESSOR_THREAD_DEFAULT_PRIORITY (SCE_KERNEL_LOWEST_PRIORITY_USER - 2) -#define SCE_FIOS_CALLBACK_THREAD_DEFAULT_PRIORITY (SCE_KERNEL_HIGHEST_PRIORITY_USER + 2) - -#define SCE_FIOS_THREAD_DEFAULT_AFFINITY SCE_KERNEL_CPU_MASK_USER_2 -#define SCE_FIOS_IO_THREAD_DEFAULT_AFFINITY SCE_FIOS_THREAD_DEFAULT_AFFINITY -#define SCE_FIOS_DECOMPRESSOR_THREAD_DEFAULT_AFFINITY SCE_KERNEL_THREAD_CPU_AFFINITY_MASK_DEFAULT -#define SCE_FIOS_CALLBACK_THREAD_DEFAULT_AFFINITY SCE_FIOS_THREAD_DEFAULT_AFFINITY - -#define SCE_FIOS_IO_THREAD_DEFAULT_STACKSIZE (8 * 1024) -#define SCE_FIOS_DECOMPRESSOR_THREAD_DEFAULT_STACKSIZE (16 * 1024) -#define SCE_FIOS_CALLBACK_THREAD_DEFAULT_STACKSIZE (8 * 1024) - -#define SCE_FIOS_PARAMS_INITIALIZER \ - { \ - 0, sizeof(SceFiosParams), 0, 0, 2, 2, 0, 0, (256 * 1024), 2, 0, 0, 0, 0, 0, {0, 0}, {0, 0}, {0, 0}, {0, 0}, \ - NULL, NULL, NULL, \ - {SCE_FIOS_IO_THREAD_DEFAULT_PRIORITY, \ - SCE_FIOS_DECOMPRESSOR_THREAD_DEFAULT_PRIORITY, \ - SCE_FIOS_CALLBACK_THREAD_DEFAULT_PRIORITY}, \ - {SCE_FIOS_IO_THREAD_DEFAULT_AFFINITY, \ - SCE_FIOS_DECOMPRESSOR_THREAD_DEFAULT_AFFINITY, \ - SCE_FIOS_CALLBACK_THREAD_DEFAULT_AFFINITY}, \ - { \ - SCE_FIOS_IO_THREAD_DEFAULT_STACKSIZE, SCE_FIOS_DECOMPRESSOR_THREAD_DEFAULT_STACKSIZE, \ - SCE_FIOS_CALLBACK_THREAD_DEFAULT_STACKSIZE \ - } \ - } - -#define SCE_FIOS_IO_THREAD 0 -#define SCE_FIOS_DECOMPRESSOR_THREAD 1 -#define SCE_FIOS_CALLBACK_THREAD 2 - -#define SCE_FIOS_FH_SIZE 80 -#define SCE_FIOS_DH_SIZE 80 -#define SCE_FIOS_OP_SIZE 168 -#define SCE_FIOS_CHUNK_SIZE 64 - -#define SCE_FIOS_ALIGN_UP(val, align) (((val) + ((align) -1)) & ~((align) -1)) - -#define SCE_FIOS_STORAGE_SIZE(num, size) (((num) * (size)) + SCE_FIOS_ALIGN_UP(SCE_FIOS_ALIGN_UP((num), 8) / 8, 8)) - -#define SCE_FIOS_DH_STORAGE_SIZE(numDHs, pathMax) SCE_FIOS_STORAGE_SIZE(numDHs, SCE_FIOS_DH_SIZE + pathMax) - -#define SCE_FIOS_FH_STORAGE_SIZE(numFHs, pathMax) SCE_FIOS_STORAGE_SIZE(numFHs, SCE_FIOS_FH_SIZE + pathMax) - -#define SCE_FIOS_OP_STORAGE_SIZE(numOps, pathMax) SCE_FIOS_STORAGE_SIZE(numOps, SCE_FIOS_OP_SIZE + pathMax) - -#define SCE_FIOS_CHUNK_STORAGE_SIZE(numChunks) SCE_FIOS_STORAGE_SIZE(numChunks, SCE_FIOS_CHUNK_SIZE) - - int sceFiosInitialize(SceFiosParams* params); - - typedef int64_t SceFiosTime; - - typedef int32_t SceFiosHandle; - - typedef SceFiosHandle SceFiosFH; - - typedef struct SceFiosOpenParams { - uint32_t openFlags : 16; - uint32_t opFlags : 16; - uint32_t reserved; - SceFiosBuffer buffer; - } SceFiosOpenParams; - - typedef struct SceFiosOpAttr { - SceFiosTime deadline; - void* pCallback; - void* pCallbackContext; - int32_t priority : 8; - uint32_t opflags : 24; - uint32_t userTag; - void* userPtr; - void* pReserved; - } SceFiosOpAttr; - - int sceFiosFHOpenWithModeSync( - const SceFiosOpAttr* pAttr, - SceFiosFH* pOutFH, - const char* pPath, - const SceFiosOpenParams* pOpenParams, - int32_t nativeMode - ); - -#ifdef __cplusplus -} -#endif diff --git a/CONFIG/vita/src/app.cpp b/CONFIG/vita/src/app.cpp index 38398915..45749f52 100644 --- a/CONFIG/vita/src/app.cpp +++ b/CONFIG/vita/src/app.cpp @@ -1,4 +1,3 @@ -#include "fios2.h" #include "pafinc.h" #include @@ -9,6 +8,8 @@ #include #include +int sceLibcHeapSize = 10 * 1024 * 1024; + const char* g_iniPath = "ux0:data/isledecomp/isle/isle.ini"; paf::Framework* g_fw; @@ -23,6 +24,7 @@ struct Config { int m_transition_type; int m_texture_quality; int m_model_quality; + int m_msaa; int m_touch_scheme; bool m_wide_view_angle; bool m_music; @@ -48,6 +50,7 @@ struct Config { m_texture_path = "/textures/"; m_model_quality = 2; m_texture_quality = 1; + m_msaa = 4; m_max_lod = 3.5f; m_max_actors = 20; } @@ -61,9 +64,10 @@ struct Config { #define GET_INT(x, name) x = iniparser_getint(dict, name, x) #define GET_FLOAT(x, name) x = iniparser_getdouble(dict, name, x) -#define GET_STRING(x, name) \ - x = iniparser_getstring(dict, name, x.c_str()); \ - sceClibPrintf("%s: %s\n", name, x.c_str()) +#define GET_STRING(x, name) do { \ + const char* val = iniparser_getstring(dict, name, nullptr); \ + if(val != nullptr) x = val; \ +} while(0) #define GET_BOOLEAN(x, name) x = iniparser_getboolean(dict, name, x) GET_STRING(m_base_path, "isle:diskpath"); @@ -82,6 +86,7 @@ struct Config { GET_BOOLEAN(m_draw_cursor, "isle:Draw Cursor"); GET_INT(m_model_quality, "isle:Island Quality"); GET_INT(m_texture_quality, "isle:Island Texture"); + GET_INT(m_msaa, "isle:MSAA"); // GET_BOOLEAN(m_use_joystick, "isle:UseJoystick"); GET_BOOLEAN(m_haptic, "isle:Haptic"); GET_BOOLEAN(m_music, "isle:Music"); @@ -143,6 +148,7 @@ struct Config { SetIniInt("isle:Island Quality", m_model_quality); SetIniInt("isle:Island Texture", m_texture_quality); + SetIniInt("isle:MSAA", m_msaa); SetIniFloat("isle:Max LOD", m_max_lod); SetIniInt("isle:Max Allowed Extras", m_max_actors); @@ -160,6 +166,8 @@ struct Config { FILE* fd = fopen(g_iniPath, "w"); if (fd) { iniparser_dump_ini(dict, fd); + } else { + sceClibPrintf("failed to write isle.ini\n"); } iniparser_freedict(dict); @@ -170,9 +178,39 @@ struct Config { { appSettings->SetString("data_path", this->m_base_path.c_str()); appSettings->SetString("save_path", this->m_save_path.c_str()); + appSettings->SetInt("transition_type", this->m_transition_type); + appSettings->SetBool("music", this->m_music); + appSettings->SetBool("3d_sound", this->m_3d_sound); + appSettings->SetInt("island_texture_quality", this->m_texture_quality); + appSettings->SetInt("island_model_quality", this->m_model_quality); + appSettings->SetInt("msaa", this->m_msaa); + appSettings->SetInt("touch_control_scheme", this->m_touch_scheme); + appSettings->SetBool("rumble", this->m_haptic); + appSettings->SetBool("texture_loader_extension", this->m_texture_load); + appSettings->SetString("texture_loader_path", this->m_texture_path.c_str()); } - void FromSettings(sce::AppSettings* appSettings) {} + void FromSettings(sce::AppSettings* appSettings) { + char text_buf[255]; + + #define GET_STRING(x, name) appSettings->GetString(name, text_buf, sizeof(text_buf), x.c_str()); x = text_buf; + + GET_STRING(this->m_base_path, "data_path"); + GET_STRING(this->m_save_path, "save_path"); + appSettings->GetInt("transition_type", &this->m_transition_type, this->m_transition_type); + printf("this->m_transition_type: %d\n", this->m_transition_type); + appSettings->GetBool("music", &this->m_music, this->m_music); + appSettings->GetBool("3d_sound", &this->m_3d_sound, this->m_3d_sound); + appSettings->GetInt("island_texture_quality", &this->m_texture_quality, this->m_texture_quality); + appSettings->GetInt("island_model_quality", &this->m_model_quality, this->m_model_quality); + appSettings->GetInt("msaa", &this->m_msaa, this->m_msaa); + appSettings->GetInt("touch_control_scheme", &this->m_touch_scheme, this->m_touch_scheme); + appSettings->GetBool("rumble", &this->m_haptic, this->m_haptic); + appSettings->GetBool("texture_loader_extension", &this->m_texture_load, this->m_texture_load); + GET_STRING(this->m_texture_path, "texture_loader_path"); + + #undef GET_STRING + } }; Config g_config; @@ -212,13 +250,14 @@ int load_app_settings_plugin() return 0; } -bool do_launch = false; +int exit_type = 0; void save_and_exit() { g_config.FromSettings(g_appSettings); g_config.SaveIni(); g_fw->RequestShutdown(); + exit_type = 1; } void save_and_launch() @@ -226,7 +265,7 @@ void save_and_launch() g_config.FromSettings(g_appSettings); g_config.SaveIni(); g_fw->RequestShutdown(); - do_launch = true; + exit_type = 2; } void CBOnStartPageTransition(const char* elementId, int32_t type) @@ -280,7 +319,9 @@ int32_t CBOnPress2(const char* elementId, const char* newValue) void CBOnTerm(int32_t result) { - sceKernelExitProcess(0); + if(exit_type == 0) { + sceKernelExitProcess(0); + } } const wchar_t* CBOnGetString(const char* elementId) @@ -328,44 +369,8 @@ void open_settings() g_appSetIf->ShowFooter(); } -#define MAX_PATH_LENGTH 256 - -static int64_t g_OpStorage[SCE_FIOS_OP_STORAGE_SIZE(64, MAX_PATH_LENGTH) / sizeof(int64_t) + 1]; -static int64_t g_ChunkStorage[SCE_FIOS_CHUNK_STORAGE_SIZE(1024) / sizeof(int64_t) + 1]; -static int64_t g_FHStorage[SCE_FIOS_FH_STORAGE_SIZE(1024, MAX_PATH_LENGTH) / sizeof(int64_t) + 1]; -static int64_t g_DHStorage[SCE_FIOS_DH_STORAGE_SIZE(32, MAX_PATH_LENGTH) / sizeof(int64_t) + 1]; - -void init_fios2() -{ - sceSysmoduleLoadModule(SCE_SYSMODULE_FIOS2); - SceFiosParams params = SCE_FIOS_PARAMS_INITIALIZER; - params.opStorage.pPtr = g_OpStorage; - params.opStorage.length = sizeof(g_OpStorage); - params.chunkStorage.pPtr = g_ChunkStorage; - params.chunkStorage.length = sizeof(g_ChunkStorage); - params.fhStorage.pPtr = g_FHStorage; - params.fhStorage.length = sizeof(g_FHStorage); - params.dhStorage.pPtr = g_DHStorage; - params.dhStorage.length = sizeof(g_DHStorage); - params.pathMax = MAX_PATH_LENGTH; - - params.threadAffinity[SCE_FIOS_IO_THREAD] = 0x10000; - params.threadAffinity[SCE_FIOS_CALLBACK_THREAD] = 0; - params.threadAffinity[SCE_FIOS_DECOMPRESSOR_THREAD] = 0; - - params.threadPriority[SCE_FIOS_IO_THREAD] = 64; - params.threadPriority[SCE_FIOS_CALLBACK_THREAD] = 191; - params.threadPriority[SCE_FIOS_DECOMPRESSOR_THREAD] = 191; - int ret = sceFiosInitialize(¶ms); - if (ret < 0) { - sceClibPrintf("sceFiosInitialize: %08x\n", ret); - } -} - int paf_main(void) { - init_fios2(); - paf::Framework::InitParam fwParam; fwParam.mode = paf::Framework::Mode_Normal; @@ -396,8 +401,9 @@ int paf_main(void) open_settings(); paf_fw->Run(); - if (do_launch) { - sceAppMgrLoadExec("app0:/eboot.bin", NULL, NULL); + if (exit_type == 2) { + int ret = sceAppMgrLoadExec("app0:/eboot.bin", NULL, NULL); + printf("sceAppMgrLoadExec: %08x\n", ret); } return 0; } diff --git a/ISLE/vita/config.cpp b/ISLE/vita/config.cpp index 2dbf03f0..412b4a53 100644 --- a/ISLE/vita/config.cpp +++ b/ISLE/vita/config.cpp @@ -9,4 +9,5 @@ void VITA_SetupDefaultConfigOverrides(dictionary* p_dictionary) iniparser_set(p_dictionary, "isle:diskpath", "ux0:data/isledecomp/DATA/disk"); iniparser_set(p_dictionary, "isle:cdpath", "ux0:data/isledecomp/"); + iniparser_set(p_dictionary, "isle:MSAA", "4"); } diff --git a/miniwin/src/d3drm/backends/gxm/gxm_context.h b/miniwin/src/d3drm/backends/gxm/gxm_context.h index e140a8c9..ebf82da5 100644 --- a/miniwin/src/d3drm/backends/gxm/gxm_context.h +++ b/miniwin/src/d3drm/backends/gxm/gxm_context.h @@ -53,12 +53,14 @@ typedef struct GXMContext { // display SceGxmRenderTarget* renderTarget; + bool renderTargetInit = false; void* displayBuffers[GXM_DISPLAY_BUFFER_COUNT]; SceUID displayBuffersUid[GXM_DISPLAY_BUFFER_COUNT]; SceGxmColorSurface displayBuffersSurface[GXM_DISPLAY_BUFFER_COUNT]; SceGxmSyncObject* displayBuffersSync[GXM_DISPLAY_BUFFER_COUNT]; int backBufferIndex = 0; int frontBufferIndex = 1; + SceGxmMultisampleMode displayMsaa; // depth buffer SceUID depthBufferUid; @@ -77,6 +79,15 @@ typedef struct GXMContext { void swap_display(); void copy_frontbuffer(); int init(SceGxmMultisampleMode msaaMode); + void init_cdram_allocator(); + int init_context(); + int create_display_buffers(SceGxmMultisampleMode msaaMode); + void init_clear_mesh(); + void destroy_display_buffers(); + int register_base_shaders(); + int patch_base_shaders(SceGxmMultisampleMode msaaMode); + void destroy_base_shaders(); + void destroy(); void clear(float r, float g, float b, bool new_scene); void* alloc(size_t size, size_t align); diff --git a/miniwin/src/d3drm/backends/gxm/renderer.cpp b/miniwin/src/d3drm/backends/gxm/renderer.cpp index b301df7f..3a491301 100644 --- a/miniwin/src/d3drm/backends/gxm/renderer.cpp +++ b/miniwin/src/d3drm/backends/gxm/renderer.cpp @@ -180,34 +180,30 @@ int gxm_library_init() GXMContext* gxm; -int GXMContext::init(SceGxmMultisampleMode msaaMode) +void GXMContext::init_cdram_allocator() { - if (this->context) { - return 0; - } + // allocator + this->cdramMem = vita_mem_alloc( + SCE_KERNEL_MEMBLOCK_TYPE_USER_CDRAM_RW, + CDRAM_POOL_SIZE, + 16, + SCE_GXM_MEMORY_ATTRIB_READ | SCE_GXM_MEMORY_ATTRIB_WRITE, + &this->cdramUID, + "cdram_pool" + ); + this->cdramPool = SDL_malloc(tlsf_size()); + tlsf_create(this->cdramPool); + tlsf_add_pool(this->cdramPool, this->cdramMem, CDRAM_POOL_SIZE); +} - int ret = gxm_library_init(); - if (ret < 0) { - return ret; - } +int GXMContext::init_context() +{ + int ret; const unsigned int patcherBufferSize = 64 * 1024; const unsigned int patcherVertexUsseSize = 64 * 1024; const unsigned int patcherFragmentUsseSize = 64 * 1024; - const uint32_t alignedWidth = ALIGN(VITA_GXM_SCREEN_WIDTH, SCE_GXM_TILE_SIZEX); - const uint32_t alignedHeight = ALIGN(VITA_GXM_SCREEN_HEIGHT, SCE_GXM_TILE_SIZEY); - uint32_t sampleCount = alignedWidth * alignedHeight; - uint32_t depthStrideInSamples = alignedWidth; - - if (msaaMode == SCE_GXM_MULTISAMPLE_4X) { - sampleCount *= 4; - depthStrideInSamples *= 2; - } - else if (msaaMode == SCE_GXM_MULTISAMPLE_2X) { - sampleCount *= 2; - } - // allocate buffers this->vdmRingBuffer = vita_mem_alloc( SCE_KERNEL_MEMBLOCK_TYPE_USER_RW_UNCACHE, @@ -306,6 +302,25 @@ int GXMContext::init(SceGxmMultisampleMode msaaMode) if (ret < 0) { return ret; } + return 0; +} + +int GXMContext::create_display_buffers(SceGxmMultisampleMode msaaMode) +{ + int ret; + + const uint32_t alignedWidth = ALIGN(VITA_GXM_SCREEN_WIDTH, SCE_GXM_TILE_SIZEX); + const uint32_t alignedHeight = ALIGN(VITA_GXM_SCREEN_HEIGHT, SCE_GXM_TILE_SIZEY); + uint32_t sampleCount = alignedWidth * alignedHeight; + uint32_t depthStrideInSamples = alignedWidth; + + if (msaaMode == SCE_GXM_MULTISAMPLE_4X) { + sampleCount *= 4; + depthStrideInSamples *= 2; + } + else if (msaaMode == SCE_GXM_MULTISAMPLE_2X) { + sampleCount *= 2; + } // render target SceGxmRenderTargetParams renderTargetParams; @@ -321,6 +336,7 @@ int GXMContext::init(SceGxmMultisampleMode msaaMode) if (ret < 0) { return ret; } + this->renderTargetInit = true; for (int i = 0; i < GXM_DISPLAY_BUFFER_COUNT; i++) { this->displayBuffers[i] = vita_mem_alloc( @@ -387,19 +403,56 @@ int GXMContext::init(SceGxmMultisampleMode msaaMode) return ret; } - // allocator - this->cdramMem = vita_mem_alloc( - SCE_KERNEL_MEMBLOCK_TYPE_USER_CDRAM_RW, - CDRAM_POOL_SIZE, - 16, - SCE_GXM_MEMORY_ATTRIB_READ | SCE_GXM_MEMORY_ATTRIB_WRITE, - &this->cdramUID, - "cdram_pool" - ); - this->cdramPool = SDL_malloc(tlsf_size()); - tlsf_create(this->cdramPool); - tlsf_add_pool(this->cdramPool, this->cdramMem, CDRAM_POOL_SIZE); + return 0; +} +void GXMContext::destroy_display_buffers() +{ + if (this->renderTargetInit) { + sceGxmFinish(this->context); + sceGxmDestroyRenderTarget(this->renderTarget); + this->renderTargetInit = false; + } + for (int i = 0; i < GXM_DISPLAY_BUFFER_COUNT; i++) { + if (this->displayBuffers[i]) { + vita_mem_free(this->displayBuffersUid[i]); + this->displayBuffers[i] = nullptr; + this->displayBuffersUid[i] = -1; + sceGxmSyncObjectDestroy(this->displayBuffersSync[i]); + } + } + + if (this->depthBufferData) { + vita_mem_free(this->depthBufferUid); + this->depthBufferData = nullptr; + this->depthBufferUid = -1; + } + + if (this->stencilBufferData) { + vita_mem_free(this->stencilBufferUid); + this->stencilBufferData = nullptr; + this->stencilBufferUid = -1; + } +} + +void GXMContext::init_clear_mesh() +{ + this->clearVertices = static_cast(this->alloc(sizeof(GXMVertex2D) * 4, 4)); + this->clearVertices[0] = {.position = {-1.0, 1.0}, .texCoord = {0, 0}}; + this->clearVertices[1] = {.position = {1.0, 1.0}, .texCoord = {0, 0}}; + this->clearVertices[2] = {.position = {-1.0, -1.0}, .texCoord = {0, 0}}; + this->clearVertices[3] = {.position = {1.0, -1.0}, .texCoord = {0, 0}}; + + this->clearIndices = static_cast(this->alloc(sizeof(uint16_t) * 4, 4)); + this->clearIndices[0] = 0; + this->clearIndices[1] = 1; + this->clearIndices[2] = 2; + this->clearIndices[3] = 3; +} + +int GXMContext::register_base_shaders() +{ + int ret; // register plane, color, image shaders ret = SCE_ERR( sceGxmShaderPatcherRegisterProgram, @@ -430,7 +483,13 @@ int GXMContext::init(SceGxmMultisampleMode msaaMode) if (ret < 0) { return ret; } + this->color_uColor = sceGxmProgramFindParameterByName(colorFragmentProgramGxp, "uColor"); // vec4 + return 0; +} +int GXMContext::patch_base_shaders(SceGxmMultisampleMode msaaMode) +{ + int ret; { GET_SHADER_PARAM(positionAttribute, planeVertexProgramGxp, "aPosition", -1); GET_SHADER_PARAM(texCoordAttribute, planeVertexProgramGxp, "aTexCoord", -1); @@ -498,26 +557,70 @@ int GXMContext::init(SceGxmMultisampleMode msaaMode) } } - this->color_uColor = sceGxmProgramFindParameterByName(colorFragmentProgramGxp, "uColor"); // vec4 + return 0; +} - this->clearVertices = static_cast(this->alloc(sizeof(GXMVertex2D) * 4, 4)); - this->clearVertices[0] = {.position = {-1.0, 1.0}, .texCoord = {0, 0}}; - this->clearVertices[1] = {.position = {1.0, 1.0}, .texCoord = {0, 0}}; - this->clearVertices[2] = {.position = {-1.0, -1.0}, .texCoord = {0, 0}}; - this->clearVertices[3] = {.position = {1.0, -1.0}, .texCoord = {0, 0}}; +void GXMContext::destroy_base_shaders() +{ + sceGxmShaderPatcherReleaseVertexProgram(this->shaderPatcher, this->planeVertexProgram); + sceGxmShaderPatcherReleaseFragmentProgram(this->shaderPatcher, this->colorFragmentProgram); + sceGxmShaderPatcherReleaseFragmentProgram(this->shaderPatcher, this->imageFragmentProgram); +} - this->clearIndices = static_cast(this->alloc(sizeof(uint16_t) * 4, 4)); - this->clearIndices[0] = 0; - this->clearIndices[1] = 1; - this->clearIndices[2] = 2; - this->clearIndices[3] = 3; +int GXMContext::init(SceGxmMultisampleMode msaaMode) +{ + int ret = 0; + ret = gxm_library_init(); + if (ret < 0) { + return ret; + } + if (this->cdramPool == nullptr) { + this->init_cdram_allocator(); + } + if (this->context == nullptr) { + ret = this->init_context(); + if (ret < 0) { + return ret; + } + } + + if (this->planeVertexProgramId == 0) { + ret = this->register_base_shaders(); + if (ret < 0) { + return ret; + } + } + + if (this->clearVertices == nullptr) { + this->init_clear_mesh(); + } + + // recreate when msaa is different + if (msaaMode != this->displayMsaa && this->renderTargetInit) { + this->destroy_display_buffers(); + this->destroy_base_shaders(); + } + + if (!this->renderTargetInit) { + ret = this->create_display_buffers(msaaMode); + if (ret < 0) { + return ret; + } + ret = this->patch_base_shaders(msaaMode); + if (ret < 0) { + return ret; + } + } return 0; } static int inuse_mem = 0; void* GXMContext::alloc(size_t size, size_t align) { + if (this->cdramPool == nullptr) { + this->init_cdram_allocator(); + } DEBUG_ONLY_PRINTF("cdram_alloc(%d, %d) inuse=%d ", size, align, inuse_mem); void* ptr = tlsf_memalign(this->cdramPool, align, size); DEBUG_ONLY_PRINTF("ptr=%p\n", ptr); @@ -602,25 +705,9 @@ void GXMContext::destroy() if (gxm->context) { sceGxmFinish(gxm->context); } - if (this->renderTarget) { - sceGxmDestroyRenderTarget(this->renderTarget); - } - for (int i = 0; i < GXM_DISPLAY_BUFFER_COUNT; i++) { - if (this->displayBuffersUid[i]) { - vita_mem_free(this->displayBuffersUid[i]); - this->displayBuffers[i] = nullptr; - sceGxmSyncObjectDestroy(this->displayBuffersSync[i]); - } - } - if (this->depthBufferUid) { - vita_mem_free(this->depthBufferUid); - } - if (this->stencilBufferUid) { - vita_mem_free(this->stencilBufferUid); - } - this->stencilBufferData = nullptr; - this->depthBufferData = nullptr; + this->destroy_display_buffers(); + this->destroy_base_shaders(); sceGxmShaderPatcherDestroy(this->shaderPatcher); sceGxmDestroyContext(this->context); @@ -695,6 +782,7 @@ GXMRenderer::GXMRenderer(DWORD width, DWORD height, DWORD msaaSamples) int ret; if (!gxm) { gxm = (GXMContext*) SDL_malloc(sizeof(GXMContext)); + memset(gxm, 0, sizeof(GXMContext)); } ret = SCE_ERR(gxm->init, msaaMode); if (ret < 0) { @@ -1020,7 +1108,7 @@ static void convertTextureMetadata( } *textureStride = ALIGN(surface->w, 8) * bytesPerPixel; - *mipLevels = 1; // look weird right now + *mipLevels = 1; // look weird size_t totalSize = 0; int currentW = surface->w; @@ -1242,7 +1330,7 @@ Uint32 GXMRenderer::GetTextureId(IDirect3DRMTexture* iTexture, bool isUi, float // allocate gpu memory uint8_t* textureData = (uint8_t*) gxm->alloc(textureSize, textureAlignment); - copySurfaceToGxm(surface, (uint8_t*) textureData, textureStride, paletteOffset, mipLevels); + copySurfaceToGxm(surface, textureData, textureStride, paletteOffset, mipLevels); SceGxmTexture gxmTexture; SCE_ERR( diff --git a/packaging/vita/sce_module/libc.suprx b/packaging/vita/sce_module/libc.suprx new file mode 100644 index 00000000..077c0005 Binary files /dev/null and b/packaging/vita/sce_module/libc.suprx differ diff --git a/packaging/vita/sce_module/libfios2.suprx b/packaging/vita/sce_module/libfios2.suprx new file mode 100644 index 00000000..c1a50e6b Binary files /dev/null and b/packaging/vita/sce_module/libfios2.suprx differ