#include "vidext.h" #include "interface/common.h" #include "workerthread.h" #include "mainwindow.h" #include "interface/core_commands.h" #include #include static int init; static QThread* rendering_thread; static QVulkanInstance vulkan_inst; static QVulkanInfoVector extensions; static QVector extension_list; m64p_error qtVidExtFuncInit(void) { init = 0; rendering_thread = QThread::currentThread(); return M64ERR_SUCCESS; } m64p_error qtVidExtFuncInitWithRenderMode(m64p_render_mode) { return qtVidExtFuncInit(); } m64p_error qtVidExtFuncQuit(void) { init = 0; w->getWorkerThread()->toggleFS(M64VIDEO_WINDOWED); w->getWorkerThread()->deleteVkWindow(); if (vulkan_inst.isValid()) vulkan_inst.destroy(); return M64ERR_SUCCESS; } m64p_error qtVidExtFuncListModes(m64p_2d_size *SizeArray, int *NumSizes) { QList screens = QGuiApplication::screens(); QRect size = screens.first()->geometry(); SizeArray[0].uiWidth = size.width(); SizeArray[0].uiHeight = size.height(); *NumSizes = 1; return M64ERR_SUCCESS; } m64p_error qtVidExtFuncListRates(m64p_2d_size, int*, int*) { return M64ERR_UNSUPPORTED; } m64p_error qtVidExtFuncSetMode(int Width, int Height, int, int WindowMode, int) { if (WindowMode == M64VIDEO_FULLSCREEN) w->getWorkerThread()->toggleFS(M64VIDEO_FULLSCREEN); else w->getWorkerThread()->resizeMainWindow(Width, Height); return M64ERR_SUCCESS; } m64p_error qtVidExtFuncSetModeWithRate(int, int, int, int, int, int) { return M64ERR_UNSUPPORTED; } m64p_function qtVidExtFuncGLGetProc(const char*) { return NULL; } m64p_error qtVidExtFuncGLSetAttr(m64p_GLattr, int) { return M64ERR_UNSUPPORTED; } m64p_error qtVidExtFuncGLGetAttr(m64p_GLattr, int*) { if (!init) return M64ERR_NOT_INIT; return M64ERR_UNSUPPORTED; } m64p_error qtVidExtFuncGLSwapBuf(void) { w->getWorkerThread()->addFrameCount(); return M64ERR_SUCCESS; } m64p_error qtVidExtFuncSetCaption(const char *) { return M64ERR_SUCCESS; } m64p_error qtVidExtFuncToggleFS(void) { if (QThread::currentThread() == rendering_thread) w->getWorkerThread()->toggleFS(M64VIDEO_NONE); else w->toggleFS(M64VIDEO_NONE); return M64ERR_SUCCESS; } m64p_error qtVidExtFuncResizeWindow(int width, int height) { int response = M64VIDEO_NONE; (*CoreDoCommand)(M64CMD_CORE_STATE_QUERY, M64CORE_VIDEO_MODE, &response); if (response == M64VIDEO_WINDOWED) { int size = (width << 16) + height; int current_size = 0; (*CoreDoCommand)(M64CMD_CORE_STATE_QUERY, M64CORE_VIDEO_SIZE, ¤t_size); if (current_size != size) w->getWorkerThread()->resizeMainWindow(width, height); } return M64ERR_SUCCESS; } uint32_t qtVidExtFuncGLGetDefaultFramebuffer(void) { return 0; } m64p_error qtVidExtFuncGetVkSurface(void** surface, void* instance) { if (!vulkan_inst.vkInstance()) { vulkan_inst.setVkInstance((VkInstance)instance); vulkan_inst.create(); w->getWorkerThread()->createVkWindow(&vulkan_inst); } while (*surface == nullptr) *surface = QVulkanInstance::surfaceForWindow(w->getVkWindow()); init = 1; return M64ERR_SUCCESS; } m64p_error qtVidExtFuncGetVkInstExtensions(const char** ext[], uint32_t* ext_num) { extensions = vulkan_inst.supportedExtensions(); extension_list.clear(); for (int i=0; i