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