mirror of
https://github.com/isledecomp/isle-portable.git
synced 2026-01-12 02:41:14 +00:00
add messagebox on vita
This commit is contained in:
parent
20460ba623
commit
9909aeae8a
@ -551,6 +551,7 @@ if (ISLE_BUILD_APP)
|
||||
if(VITA)
|
||||
target_sources(isle PRIVATE
|
||||
ISLE/vita/config.cpp
|
||||
ISLE/vita/messagebox.cpp
|
||||
)
|
||||
endif()
|
||||
endif()
|
||||
|
||||
@ -57,6 +57,7 @@
|
||||
|
||||
#ifdef __vita__
|
||||
#include "vita/config.h"
|
||||
#include "vita/messagebox.h"
|
||||
#include <psp2/appmgr.h>
|
||||
#include <psp2/kernel/clib.h>
|
||||
#endif
|
||||
|
||||
56
ISLE/vita/messagebox.cpp
Normal file
56
ISLE/vita/messagebox.cpp
Normal file
@ -0,0 +1,56 @@
|
||||
#include "messagebox.h"
|
||||
|
||||
#include <psp2/common_dialog.h>
|
||||
#include <psp2/message_dialog.h>
|
||||
|
||||
#include "../../miniwin/src/d3drm/backends/gxm/gxm_context.h"
|
||||
|
||||
bool Vita_ShowSimpleMessageBox(
|
||||
SDL_MessageBoxFlags flags,
|
||||
const char* title,
|
||||
const char* message,
|
||||
SDL_Window* window
|
||||
)
|
||||
{
|
||||
int ret;
|
||||
SceMsgDialogParam param;
|
||||
SceMsgDialogUserMessageParam msgParam;
|
||||
SceMsgDialogButtonsParam buttonParam;
|
||||
SceMsgDialogResult dialog_result;
|
||||
SceCommonDialogErrorCode init_result;
|
||||
bool setup_minimal_gxm = false;
|
||||
|
||||
SDL_zero(param);
|
||||
sceMsgDialogParamInit(¶m);
|
||||
param.mode = SCE_MSG_DIALOG_MODE_USER_MSG;
|
||||
|
||||
SDL_zero(msgParam);
|
||||
char message_data[0x1000];
|
||||
SDL_snprintf(message_data, sizeof(message_data), "%s\r\n\r\n%s", title, message);
|
||||
|
||||
msgParam.msg = (const SceChar8 *)message_data;
|
||||
msgParam.buttonType = SCE_MSG_DIALOG_BUTTON_TYPE_OK;
|
||||
param.userMsgParam = &msgParam;
|
||||
|
||||
if(!gxm) {
|
||||
gxm = (GXMContext*)SDL_malloc(sizeof(GXMContext));
|
||||
}
|
||||
if(ret = gxm->init(); ret < 0) {
|
||||
return false;
|
||||
}
|
||||
|
||||
init_result = (SceCommonDialogErrorCode)sceMsgDialogInit(¶m);
|
||||
if (init_result >= 0) {
|
||||
while (sceMsgDialogGetStatus() == SCE_COMMON_DIALOG_STATUS_RUNNING) {
|
||||
gxm->clear(0,0,1, true);
|
||||
gxm->swap_display();
|
||||
}
|
||||
SDL_zero(dialog_result);
|
||||
sceMsgDialogGetResult(&dialog_result);
|
||||
sceMsgDialogTerm();
|
||||
return dialog_result.buttonId == SCE_MSG_DIALOG_BUTTON_ID_OK;
|
||||
} else {
|
||||
return false;
|
||||
}
|
||||
return true;
|
||||
}
|
||||
13
ISLE/vita/messagebox.h
Normal file
13
ISLE/vita/messagebox.h
Normal file
@ -0,0 +1,13 @@
|
||||
#ifndef VITA_MESSAGE_BOX_H
|
||||
#define VITA_MESSAGE_BOX_H
|
||||
|
||||
#include <SDL3/SDL_messagebox.h>
|
||||
|
||||
bool Vita_ShowSimpleMessageBox(
|
||||
SDL_MessageBoxFlags flags,
|
||||
const char* title,
|
||||
const char* message,
|
||||
SDL_Window* window
|
||||
);
|
||||
|
||||
#endif // VITA_MESSAGE_BOX_H
|
||||
79
miniwin/src/d3drm/backends/gxm/gxm_context.h
Normal file
79
miniwin/src/d3drm/backends/gxm/gxm_context.h
Normal file
@ -0,0 +1,79 @@
|
||||
#pragma once
|
||||
|
||||
#include <psp2/gxm.h>
|
||||
#include "tlsf.h"
|
||||
|
||||
#define GXM_DISPLAY_BUFFER_COUNT 3
|
||||
|
||||
typedef struct GXMContext {
|
||||
// context
|
||||
SceUID vdmRingBufferUid;
|
||||
SceUID vertexRingBufferUid;
|
||||
SceUID fragmentRingBufferUid;
|
||||
SceUID fragmentUsseRingBufferUid;
|
||||
size_t fragmentUsseRingBufferOffset;
|
||||
|
||||
void* vdmRingBuffer;
|
||||
void* vertexRingBuffer;
|
||||
void* fragmentRingBuffer;
|
||||
void* fragmentUsseRingBuffer;
|
||||
|
||||
void* contextHostMem;
|
||||
SceGxmContext* context;
|
||||
|
||||
// shader patcher
|
||||
SceUID patcherBufferUid;
|
||||
void* patcherBuffer;
|
||||
|
||||
SceUID patcherVertexUsseUid;
|
||||
size_t patcherVertexUsseOffset;
|
||||
void* patcherVertexUsse;
|
||||
|
||||
SceUID patcherFragmentUsseUid;
|
||||
size_t patcherFragmentUsseOffset;
|
||||
void* patcherFragmentUsse;
|
||||
|
||||
SceGxmShaderPatcher* shaderPatcher;
|
||||
|
||||
// clear
|
||||
SceGxmShaderPatcherId clearVertexProgramId;
|
||||
SceGxmShaderPatcherId clearFragmentProgramId;
|
||||
SceGxmVertexProgram* clearVertexProgram;
|
||||
SceGxmFragmentProgram* clearFragmentProgram;
|
||||
const SceGxmProgramParameter* clear_uColor;
|
||||
float* clearVertices;
|
||||
uint16_t* clearIndices;
|
||||
|
||||
// display
|
||||
SceGxmRenderTarget* renderTarget;
|
||||
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;
|
||||
|
||||
// depth buffer
|
||||
SceUID depthBufferUid;
|
||||
void* depthBufferData;
|
||||
SceUID stencilBufferUid;
|
||||
void* stencilBufferData;
|
||||
SceGxmDepthStencilSurface depthSurface;
|
||||
|
||||
// allocator
|
||||
SceUID cdramUID;
|
||||
void* cdramMem;
|
||||
tlsf_t cdramPool;
|
||||
|
||||
bool sceneStarted;
|
||||
|
||||
void swap_display();
|
||||
int init();
|
||||
void destroy();
|
||||
void clear(float r, float g, float b, bool new_scene);
|
||||
void* alloc(size_t size, size_t align);
|
||||
void free(void* ptr);
|
||||
} GXMContext;
|
||||
|
||||
// global so that common dialog can be rendererd without GXMRenderer
|
||||
extern GXMContext* gxm;
|
||||
@ -13,7 +13,3 @@ void* vita_mem_vertex_usse_alloc(unsigned int size, SceUID* uid, unsigned int* u
|
||||
void vita_mem_vertex_usse_free(SceUID uid);
|
||||
void* vita_mem_fragment_usse_alloc(unsigned int size, SceUID* uid, unsigned int* usse_offset);
|
||||
void vita_mem_fragment_usse_free(SceUID uid);
|
||||
|
||||
bool cdram_allocator_create();
|
||||
void* cdram_alloc(size_t size, size_t align);
|
||||
void cdram_free(void* ptr);
|
||||
|
||||
@ -122,53 +122,3 @@ void vita_mem_fragment_usse_free(SceUID uid)
|
||||
sceGxmUnmapFragmentUsseMemory(mem);
|
||||
sceKernelFreeMemBlock(uid);
|
||||
}
|
||||
|
||||
bool cdram_allocator_create()
|
||||
{
|
||||
int ret;
|
||||
|
||||
ret = sceKernelAllocMemBlock("gpu_cdram_pool", SCE_KERNEL_MEMBLOCK_TYPE_USER_CDRAM_RW, CDRAM_POOL_SIZE, NULL);
|
||||
if (ret < 0) {
|
||||
sceClibPrintf("sceKernelAllocMemBlock failed: %08x\n", ret);
|
||||
return false;
|
||||
}
|
||||
cdramAllocatorUID = ret;
|
||||
|
||||
void* mem;
|
||||
ret = sceKernelGetMemBlockBase(cdramAllocatorUID, &mem);
|
||||
if (ret < 0) {
|
||||
sceClibPrintf("sceKernelGetMemBlockBase failed: %08x\n", ret);
|
||||
return false;
|
||||
}
|
||||
|
||||
ret = sceGxmMapMemory(
|
||||
mem,
|
||||
CDRAM_POOL_SIZE,
|
||||
(SceGxmMemoryAttribFlags) (SCE_GXM_MEMORY_ATTRIB_READ | SCE_GXM_MEMORY_ATTRIB_WRITE)
|
||||
);
|
||||
if (ret < 0) {
|
||||
sceClibPrintf("sceGxmMapMemory failed: %08x\n", ret);
|
||||
return false;
|
||||
}
|
||||
|
||||
cdramAllocator = SDL_malloc(tlsf_size());
|
||||
tlsf_create(cdramAllocator);
|
||||
tlsf_add_pool(cdramAllocator, mem, CDRAM_POOL_SIZE);
|
||||
return true;
|
||||
}
|
||||
|
||||
void* cdram_alloc(size_t size, size_t align)
|
||||
{
|
||||
DEBUG_ONLY_PRINTF("cdram_alloc(%d, %d) inuse=%d ", size, align, inuse_mem);
|
||||
void* ptr = tlsf_memalign(cdramAllocator, align, size);
|
||||
DEBUG_ONLY_PRINTF("ptr=%p\n", ptr);
|
||||
inuse_mem += tlsf_block_size(ptr);
|
||||
return ptr;
|
||||
}
|
||||
|
||||
void cdram_free(void* ptr)
|
||||
{
|
||||
inuse_mem -= tlsf_block_size(ptr);
|
||||
DEBUG_ONLY_PRINTF("cdram_free(%p)\n", ptr);
|
||||
tlsf_free(cdramAllocator, ptr);
|
||||
}
|
||||
|
||||
File diff suppressed because it is too large
Load Diff
@ -1,6 +1,5 @@
|
||||
shaders += main.vert.gxp
|
||||
shaders += color.frag.gxp image.frag.gxp
|
||||
shaders += main.color.frag.gxp main.texture.frag.gxp
|
||||
shaders += clear.vert.gxp clear.frag.gxp image.frag.gxp
|
||||
shaders += main.vert.gxp main.color.frag.gxp main.texture.frag.gxp
|
||||
|
||||
PERFS = $(shaders:.gxp=.perf.txt)
|
||||
|
||||
|
||||
Binary file not shown.
5
miniwin/src/d3drm/backends/gxm/shaders/clear.vert.cg
Normal file
5
miniwin/src/d3drm/backends/gxm/shaders/clear.vert.cg
Normal file
@ -0,0 +1,5 @@
|
||||
|
||||
float4 main(float2 aPosition : POSITION) : POSITION
|
||||
{
|
||||
return float4(aPosition, 1.f, 1.f);
|
||||
}
|
||||
BIN
miniwin/src/d3drm/backends/gxm/shaders/clear.vert.gxp
Normal file
BIN
miniwin/src/d3drm/backends/gxm/shaders/clear.vert.gxp
Normal file
Binary file not shown.
@ -17,7 +17,7 @@
|
||||
if (__sce_err_ret_val < 0) { \
|
||||
sceClibPrintf(#func " error: 0x%x\n", __sce_err_ret_val); \
|
||||
} \
|
||||
__sce_err_ret_val < 0; \
|
||||
__sce_err_ret_val; \
|
||||
})
|
||||
|
||||
#define ALIGN(x, a) (((x) + ((a) - 1)) & ~((a) - 1))
|
||||
|
||||
@ -12,11 +12,8 @@
|
||||
#include <psp2/types.h>
|
||||
#include <psp2/kernel/clib.h>
|
||||
|
||||
#include "gxm_memory.h"
|
||||
|
||||
DEFINE_GUID(GXM_GUID, 0x682656F3, 0x0000, 0x0000, 0x00, 0x00, 0x00, 0x00, 0x00, 0x47, 0x58, 0x4D);
|
||||
|
||||
#define GXM_DISPLAY_BUFFER_COUNT 3
|
||||
#define GXM_VERTEX_BUFFER_COUNT 2
|
||||
#define GXM_FRAGMENT_BUFFER_COUNT 3
|
||||
|
||||
@ -71,38 +68,6 @@ typedef struct Vertex {
|
||||
float texCoord[2];
|
||||
} Vertex;
|
||||
|
||||
|
||||
typedef struct GXMRendererContext {
|
||||
// context
|
||||
SceUID vdmRingBufferUid;
|
||||
SceUID vertexRingBufferUid;
|
||||
SceUID fragmentRingBufferUid;
|
||||
SceUID fragmentUsseRingBufferUid;
|
||||
size_t fragmentUsseRingBufferOffset;
|
||||
|
||||
void* vdmRingBuffer;
|
||||
void* vertexRingBuffer;
|
||||
void* fragmentRingBuffer;
|
||||
void* fragmentUsseRingBuffer;
|
||||
|
||||
void* contextHostMem;
|
||||
SceGxmContext* context;
|
||||
|
||||
// shader patcher
|
||||
SceUID patcherBufferUid;
|
||||
void* patcherBuffer;
|
||||
|
||||
SceUID patcherVertexUsseUid;
|
||||
size_t patcherVertexUsseOffset;
|
||||
void* patcherVertexUsse;
|
||||
|
||||
SceUID patcherFragmentUsseUid;
|
||||
size_t patcherFragmentUsseOffset;
|
||||
void* patcherFragmentUsse;
|
||||
|
||||
SceGxmShaderPatcher* shaderPatcher;
|
||||
} GXMRendererContext;
|
||||
|
||||
class GXMRenderer : public Direct3DRMRenderer {
|
||||
public:
|
||||
static Direct3DRMRenderer* Create(DWORD width, DWORD height);
|
||||
@ -164,32 +129,12 @@ class GXMRenderer : public Direct3DRMRenderer {
|
||||
std::vector<SceneLight> m_lights;
|
||||
|
||||
bool transparencyEnabled = false;
|
||||
bool sceneStarted = false;
|
||||
|
||||
SceGxmContext* context;
|
||||
SceGxmShaderPatcher* shaderPatcher;
|
||||
|
||||
SceGxmRenderTarget* renderTarget;
|
||||
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;
|
||||
|
||||
// depth buffer
|
||||
SceUID depthBufferUid;
|
||||
void* depthBufferData;
|
||||
SceUID stencilBufferUid;
|
||||
void* stencilBufferData;
|
||||
SceGxmDepthStencilSurface depthSurface;
|
||||
|
||||
// shader
|
||||
SceGxmShaderPatcherId mainVertexProgramId;
|
||||
SceGxmShaderPatcherId mainColorFragmentProgramId;
|
||||
SceGxmShaderPatcherId mainTextureFragmentProgramId;
|
||||
SceGxmShaderPatcherId imageFragmentProgramId;
|
||||
SceGxmShaderPatcherId colorFragmentProgramId;
|
||||
|
||||
SceGxmVertexProgram* mainVertexProgram;
|
||||
// with lighting
|
||||
@ -199,7 +144,6 @@ class GXMRenderer : public Direct3DRMRenderer {
|
||||
SceGxmFragmentProgram* blendedTextureFragmentProgram;
|
||||
// no lighting
|
||||
SceGxmFragmentProgram* imageFragmentProgram;
|
||||
SceGxmFragmentProgram* colorFragmentProgram;
|
||||
|
||||
// main shader vertex uniforms
|
||||
const SceGxmProgramParameter* uModelViewMatrix;
|
||||
@ -216,9 +160,6 @@ class GXMRenderer : public Direct3DRMRenderer {
|
||||
const SceGxmProgramParameter* texture_uShininess;
|
||||
const SceGxmProgramParameter* texture_uColor;
|
||||
|
||||
// color shader frament uniforms
|
||||
const SceGxmProgramParameter* colorShader_uColor;
|
||||
|
||||
// uniforms / quad meshes
|
||||
GXMSceneLightUniform* lights[GXM_FRAGMENT_BUFFER_COUNT];
|
||||
Vertex* quadVertices[GXM_VERTEX_BUFFER_COUNT];
|
||||
@ -231,16 +172,16 @@ class GXMRenderer : public Direct3DRMRenderer {
|
||||
int currentVertexBufferIndex = 0;
|
||||
|
||||
SDL_Gamepad* gamepad;
|
||||
|
||||
bool button_dpad_up;
|
||||
bool button_dpad_down;
|
||||
bool button_dpad_left;
|
||||
bool button_dpad_right;
|
||||
|
||||
|
||||
bool m_initialized = false;
|
||||
};
|
||||
|
||||
int gxm_library_init();
|
||||
|
||||
inline static void GXMRenderer_EnumDevice(LPD3DENUMDEVICESCALLBACK cb, void* ctx)
|
||||
{
|
||||
D3DDEVICEDESC halDesc = {};
|
||||
@ -255,6 +196,12 @@ inline static void GXMRenderer_EnumDevice(LPD3DENUMDEVICESCALLBACK cb, void* ctx
|
||||
D3DDEVICEDESC helDesc = {};
|
||||
helDesc.dwDeviceRenderBitDepth = DDBD_32;
|
||||
|
||||
int ret = gxm_library_init();
|
||||
if(ret < 0) {
|
||||
SDL_Log("gxm_library_init failed: %08x", ret);
|
||||
return;
|
||||
}
|
||||
|
||||
EnumDevice(cb, ctx, "GXM HAL", &halDesc, &helDesc, GXM_GUID);
|
||||
}
|
||||
|
||||
|
||||
@ -21,6 +21,8 @@
|
||||
// See: https://github.com/libsdl-org/SDL/issues/12943
|
||||
#ifdef __EMSCRIPTEN__
|
||||
#define Any_ShowSimpleMessageBox Emscripten_ShowSimpleMessageBox
|
||||
#elif defined(__vita__)
|
||||
#define Any_ShowSimpleMessageBox Vita_ShowSimpleMessageBox
|
||||
#else
|
||||
#define Any_ShowSimpleMessageBox SDL_ShowSimpleMessageBox
|
||||
#endif
|
||||
|
||||
Loading…
Reference in New Issue
Block a user