From c8abc88cd0e4cc1ec9aee6757d9199321a436fe0 Mon Sep 17 00:00:00 2001 From: uyjulian Date: Fri, 29 Jan 2021 01:26:35 -0600 Subject: [PATCH] Add support for message box --- .../vitagxm/SDL_render_vita_gxm_tools.c | 86 ++++++++++ .../vitagxm/SDL_render_vita_gxm_tools.h | 6 + src/video/SDL_video.c | 9 ++ src/video/vita/SDL_vitamessagebox.c | 147 ++++++++++++++++++ src/video/vita/SDL_vitamessagebox.h | 33 ++++ 5 files changed, 281 insertions(+) create mode 100644 src/video/vita/SDL_vitamessagebox.c create mode 100644 src/video/vita/SDL_vitamessagebox.h diff --git a/src/render/vitagxm/SDL_render_vita_gxm_tools.c b/src/render/vitagxm/SDL_render_vita_gxm_tools.c index f410f08c5..e98d826fe 100644 --- a/src/render/vitagxm/SDL_render_vita_gxm_tools.c +++ b/src/render/vitagxm/SDL_render_vita_gxm_tools.c @@ -32,6 +32,7 @@ #include #include #include +#include #include #include @@ -1178,6 +1179,91 @@ gxm_texture_set_filters(gxm_texture *texture, SceGxmTextureFilter min_filter, Sc sceGxmTextureSetMagFilter(&texture->gxm_tex, mag_filter); } +static unsigned int back_buffer_index_for_common_dialog = 0; +static unsigned int front_buffer_index_for_common_dialog = 0; +struct +{ + VITA_GXM_DisplayData displayData; + SceGxmSyncObject* sync; + SceGxmColorSurface surf; + SceUID uid; +} buffer_for_common_dialog[VITA_GXM_BUFFERS]; + +void gxm_minimal_init_for_common_dialog(void) +{ + SceGxmInitializeParams initializeParams; + SDL_zero(initializeParams); + initializeParams.flags = 0; + initializeParams.displayQueueMaxPendingCount = VITA_GXM_PENDING_SWAPS; + initializeParams.displayQueueCallback = display_callback; + initializeParams.displayQueueCallbackDataSize = sizeof(VITA_GXM_DisplayData); + initializeParams.parameterBufferSize = SCE_GXM_DEFAULT_PARAMETER_BUFFER_SIZE; + sceGxmInitialize(&initializeParams); +} + +void gxm_minimal_term_for_common_dialog(void) +{ + sceGxmTerminate(); +} + +void gxm_init_for_common_dialog(void) +{ + for (int i = 0; i < VITA_GXM_BUFFERS; i += 1) + { + buffer_for_common_dialog[i].displayData.wait_vblank = SDL_TRUE; + buffer_for_common_dialog[i].displayData.address = mem_gpu_alloc( + SCE_KERNEL_MEMBLOCK_TYPE_USER_CDRAM_RW, + 4 * VITA_GXM_SCREEN_STRIDE * VITA_GXM_SCREEN_HEIGHT, + SCE_GXM_COLOR_SURFACE_ALIGNMENT, + SCE_GXM_MEMORY_ATTRIB_READ | SCE_GXM_MEMORY_ATTRIB_WRITE, + &buffer_for_common_dialog[i].uid); + sceGxmColorSurfaceInit( + &buffer_for_common_dialog[i].surf, + VITA_GXM_PIXEL_FORMAT, + SCE_GXM_COLOR_SURFACE_LINEAR, + SCE_GXM_COLOR_SURFACE_SCALE_NONE, + SCE_GXM_OUTPUT_REGISTER_SIZE_32BIT, + VITA_GXM_SCREEN_WIDTH, + VITA_GXM_SCREEN_HEIGHT, + VITA_GXM_SCREEN_STRIDE, + buffer_for_common_dialog[i].displayData.address + ); + sceGxmSyncObjectCreate(&buffer_for_common_dialog[i].sync); + } + sceGxmDisplayQueueFinish(); +} + +void gxm_swap_for_common_dialog(void) +{ + SceCommonDialogUpdateParam updateParam; + SDL_zero(updateParam); + updateParam.renderTarget.colorFormat = VITA_GXM_PIXEL_FORMAT; + updateParam.renderTarget.surfaceType = SCE_GXM_COLOR_SURFACE_LINEAR; + updateParam.renderTarget.width = VITA_GXM_SCREEN_WIDTH; + updateParam.renderTarget.height = VITA_GXM_SCREEN_HEIGHT; + updateParam.renderTarget.strideInPixels = VITA_GXM_SCREEN_STRIDE; + + updateParam.renderTarget.colorSurfaceData = buffer_for_common_dialog[back_buffer_index_for_common_dialog].displayData.address; + + updateParam.displaySyncObject = buffer_for_common_dialog[back_buffer_index_for_common_dialog].sync; + SDL_memset(buffer_for_common_dialog[back_buffer_index_for_common_dialog].displayData.address, 0, 4 * VITA_GXM_SCREEN_STRIDE * VITA_GXM_SCREEN_HEIGHT); + sceCommonDialogUpdate(&updateParam); + + sceGxmDisplayQueueAddEntry(buffer_for_common_dialog[front_buffer_index_for_common_dialog].sync, buffer_for_common_dialog[back_buffer_index_for_common_dialog].sync, &buffer_for_common_dialog[back_buffer_index_for_common_dialog].displayData); + front_buffer_index_for_common_dialog = back_buffer_index_for_common_dialog; + back_buffer_index_for_common_dialog = (back_buffer_index_for_common_dialog + 1) % VITA_GXM_BUFFERS; +} + +void gxm_term_for_common_dialog(void) +{ + sceGxmDisplayQueueFinish(); + for (int i = 0; i < VITA_GXM_BUFFERS; i += 1) + { + mem_gpu_free(buffer_for_common_dialog[i].uid); + sceGxmSyncObjectDestroy(buffer_for_common_dialog[i].sync); + } +} + #endif /* SDL_VIDEO_RENDER_VITA_GXM */ /* vi: set ts=4 sw=4 expandtab: */ diff --git a/src/render/vitagxm/SDL_render_vita_gxm_tools.h b/src/render/vitagxm/SDL_render_vita_gxm_tools.h index c1dfc6c0e..c103b00ff 100644 --- a/src/render/vitagxm/SDL_render_vita_gxm_tools.h +++ b/src/render/vitagxm/SDL_render_vita_gxm_tools.h @@ -59,6 +59,12 @@ unsigned int gxm_texture_get_height(const gxm_texture *texture); unsigned int gxm_texture_get_stride(const gxm_texture *texture); void *gxm_texture_get_datap(const gxm_texture *texture); +void gxm_minimal_init_for_common_dialog(void); +void gxm_minimal_term_for_common_dialog(void); +void gxm_init_for_common_dialog(void); +void gxm_swap_for_common_dialog(void); +void gxm_term_for_common_dialog(void); + #endif /* SDL_RENDER_VITA_GXM_TOOLS_H */ /* vi: set ts=4 sw=4 expandtab: */ diff --git a/src/video/SDL_video.c b/src/video/SDL_video.c index e262a1969..62da1020f 100644 --- a/src/video/SDL_video.c +++ b/src/video/SDL_video.c @@ -4048,6 +4048,9 @@ SDL_IsScreenKeyboardShown(SDL_Window *window) #if SDL_VIDEO_DRIVER_OS2 #include "os2/SDL_os2messagebox.h" #endif +#if SDL_VIDEO_DRIVER_VITA +#include "vita/SDL_vitamessagebox.h" +#endif #if SDL_VIDEO_DRIVER_WINDOWS || SDL_VIDEO_DRIVER_WINRT || SDL_VIDEO_DRIVER_COCOA || SDL_VIDEO_DRIVER_UIKIT || SDL_VIDEO_DRIVER_X11 || SDL_VIDEO_DRIVER_HAIKU || SDL_VIDEO_DRIVER_OS2 static SDL_bool SDL_MessageboxValidForDriver(const SDL_MessageBoxData *messageboxdata, SDL_SYSWM_TYPE drivertype) @@ -4161,6 +4164,12 @@ SDL_ShowMessageBox(const SDL_MessageBoxData *messageboxdata, int *buttonid) OS2_ShowMessageBox(messageboxdata, buttonid) == 0) { retval = 0; } +#endif +#if SDL_VIDEO_DRIVER_VITA + if (retval == -1 && + VITA_ShowMessageBox(messageboxdata, buttonid) == 0) { + retval = 0; + } #endif if (retval == -1) { SDL_SetError("No message system available"); diff --git a/src/video/vita/SDL_vitamessagebox.c b/src/video/vita/SDL_vitamessagebox.c new file mode 100644 index 000000000..65d4bad87 --- /dev/null +++ b/src/video/vita/SDL_vitamessagebox.c @@ -0,0 +1,147 @@ +/* + Simple DirectMedia Layer + Copyright (C) 1997-2020 Sam Lantinga + + 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 "../../SDL_internal.h" + +#if SDL_VIDEO_DRIVER_VITA + +#include "SDL_vitavideo.h" +#include "SDL_vitamessagebox.h" +#include + +#if SDL_VIDEO_RENDER_VITA_GXM +#include "../../render/vitagxm/SDL_render_vita_gxm_tools.h" +#endif /* SDL_VIDEO_RENDER_VITA_GXM */ + +int VITA_ShowMessageBox(const SDL_MessageBoxData *messageboxdata, int *buttonid) +{ + SceCommonDialogConfigParam commonDialogConfigParam; + SceMsgDialogParam param; + SceMsgDialogUserMessageParam msgParam; + SceMsgDialogButtonsParam buttonParam; + SceDisplayFrameBuf dispparam; + + SceMsgDialogResult dialog_result; + SceCommonDialogErrorCode init_result; + SDL_bool setup_minimal_gxm = SDL_FALSE; +#if !SDL_VIDEO_RENDER_VITA_GXM + { + return -1; + } +#endif +#if SDL_VIDEO_RENDER_VITA_GXM + if (messageboxdata->numbuttons > 3) + { + return -1; + } + SDL_zero(commonDialogConfigParam); + sceCommonDialogSetConfigParam(&commonDialogConfigParam); + SDL_zero(param); + sceMsgDialogParamInit(¶m); + param.mode = SCE_MSG_DIALOG_MODE_USER_MSG; + SDL_zero(msgParam); + msgParam.msg = (const SceChar8*)messageboxdata->message; + SDL_zero(buttonParam); + if (messageboxdata->numbuttons == 3) + { + msgParam.buttonType = SCE_MSG_DIALOG_BUTTON_TYPE_3BUTTONS; + msgParam.buttonParam = &buttonParam; + buttonParam.msg1 = messageboxdata->buttons[0].text; + buttonParam.msg2 = messageboxdata->buttons[1].text; + buttonParam.msg3 = messageboxdata->buttons[2].text; + } + else if (messageboxdata->numbuttons == 2) + { + msgParam.buttonType = SCE_MSG_DIALOG_BUTTON_TYPE_YESNO; + } + else if (messageboxdata->numbuttons == 1) + { + msgParam.buttonType = SCE_MSG_DIALOG_BUTTON_TYPE_OK; + } + param.userMsgParam = &msgParam; + + dispparam.size = sizeof(dispparam); + + init_result = sceMsgDialogInit(¶m); + + // Setup display if it hasn't been initialized before + if (init_result == SCE_COMMON_DIALOG_ERROR_GXM_IS_UNINITIALIZED) + { + gxm_minimal_init_for_common_dialog(); + init_result = sceMsgDialogInit(¶m); + setup_minimal_gxm = SDL_TRUE; + } + + gxm_init_for_common_dialog(); + + if (init_result >= 0) + { + while (sceMsgDialogGetStatus() == SCE_COMMON_DIALOG_STATUS_RUNNING) + { + gxm_swap_for_common_dialog(); + } + SDL_zero(dialog_result); + sceMsgDialogGetResult(&dialog_result); + + if (dialog_result.buttonId == SCE_MSG_DIALOG_BUTTON_ID_BUTTON1) + { + *buttonid = messageboxdata->buttons[0].buttonid; + } + else if (dialog_result.buttonId == SCE_MSG_DIALOG_BUTTON_ID_BUTTON2) + { + *buttonid = messageboxdata->buttons[1].buttonid; + } + else if (dialog_result.buttonId == SCE_MSG_DIALOG_BUTTON_ID_BUTTON3) + { + *buttonid = messageboxdata->buttons[2].buttonid; + } + else if (dialog_result.buttonId == SCE_MSG_DIALOG_BUTTON_ID_YES) + { + *buttonid = messageboxdata->buttons[0].buttonid; + } + else if (dialog_result.buttonId == SCE_MSG_DIALOG_BUTTON_ID_NO) + { + *buttonid = messageboxdata->buttons[1].buttonid; + } + else if (dialog_result.buttonId == SCE_MSG_DIALOG_BUTTON_ID_OK) + { + *buttonid = messageboxdata->buttons[0].buttonid; + } + sceMsgDialogTerm(); + } + else + { + return -1; + } + + gxm_term_for_common_dialog(); + + if (setup_minimal_gxm) + { + gxm_minimal_term_for_common_dialog(); + } + + return 0; +#endif +} + +#endif /* SDL_VIDEO_DRIVER_VITA */ + +/* vi: set ts=4 sw=4 expandtab: */ diff --git a/src/video/vita/SDL_vitamessagebox.h b/src/video/vita/SDL_vitamessagebox.h new file mode 100644 index 000000000..65ce73be6 --- /dev/null +++ b/src/video/vita/SDL_vitamessagebox.h @@ -0,0 +1,33 @@ +/* + Simple DirectMedia Layer + Copyright (C) 1997-2020 Sam Lantinga + + 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 SDL_vitamessagebox_h_ +#define SDL_vitamessagebox_h_ + +#if SDL_VIDEO_DRIVER_VITA + +extern int VITA_ShowMessageBox(const SDL_MessageBoxData *messageboxdata, int *buttonid); + +#endif /* SDL_VIDEO_DRIVER_VITA */ + +#endif /* SDL_vitamessagebox_h_ */ + +/* vi: set ts=4 sw=4 expandtab: */