pvr: recover from renderer init failure

issue MINIDUMP-V
fix some warnings
This commit is contained in:
Flyinghead 2022-12-29 19:18:19 +01:00
parent 5acfa7d3d6
commit 802f70fedd
10 changed files with 41 additions and 32 deletions

View File

@ -1117,7 +1117,8 @@ target_sources(${PROJECT_NAME} PRIVATE
core/rend/sorter.h core/rend/sorter.h
core/rend/tileclip.h core/rend/tileclip.h
core/rend/TexCache.cpp core/rend/TexCache.cpp
core/rend/TexCache.h) core/rend/TexCache.h
core/rend/norend/norend.cpp)
if(NOT LIBRETRO) if(NOT LIBRETRO)
target_sources(${PROJECT_NAME} PRIVATE target_sources(${PROJECT_NAME} PRIVATE
core/rend/game_scanner.h core/rend/game_scanner.h

View File

@ -302,12 +302,17 @@ static void rend_create_renderer()
#endif #endif
} }
void rend_init_renderer() bool rend_init_renderer()
{ {
if (renderer == nullptr) if (renderer == nullptr)
rend_create_renderer(); rend_create_renderer();
if (!renderer->Init()) bool success = renderer->Init();
die("Renderer initialization failed\n"); if (!success) {
delete renderer;
renderer = rend_norend();
renderer->Init();
}
return success;
} }
void rend_term_renderer() void rend_term_renderer()

View File

@ -4,7 +4,7 @@
extern u32 FrameCount; extern u32 FrameCount;
void rend_init_renderer(); bool rend_init_renderer();
void rend_term_renderer(); void rend_term_renderer();
void rend_vblank(); void rend_vblank();
void rend_start_render(); void rend_start_render();

View File

@ -176,8 +176,11 @@ void DXContext::resize()
void DXContext::resetDevice() void DXContext::resetDevice()
{ {
D3DRenderer *dxrenderer{};
if (renderer != nullptr) if (renderer != nullptr)
((D3DRenderer *)renderer)->preReset(); dxrenderer = dynamic_cast<D3DRenderer*>(renderer);
if (dxrenderer != nullptr)
dxrenderer->preReset();
overlay.term(); overlay.term();
ImGui_ImplDX9_InvalidateDeviceObjects(); ImGui_ImplDX9_InvalidateDeviceObjects();
HRESULT hr = pDevice->Reset(&d3dpp); HRESULT hr = pDevice->Reset(&d3dpp);
@ -188,6 +191,6 @@ void DXContext::resetDevice()
} }
ImGui_ImplDX9_CreateDeviceObjects(); ImGui_ImplDX9_CreateDeviceObjects();
overlay.init(pDevice); overlay.init(pDevice);
if (renderer != nullptr) if (dxrenderer != nullptr)
((D3DRenderer *)renderer)->postReset(); dxrenderer->postReset();
} }

View File

@ -292,8 +292,6 @@ private:
} }
} }
GLuint _array_buffer;
GLuint _element_array_buffer;
GLuint _texture; GLuint _texture;
GLenum _src_blend_factor; GLenum _src_blend_factor;
GLenum _dst_blend_factor; GLenum _dst_blend_factor;

View File

@ -46,7 +46,7 @@ bool mainui_rend_frame()
{ {
gui_display_ui(); gui_display_ui();
// TODO refactor android vjoy out of renderer // TODO refactor android vjoy out of renderer
if (gui_state == GuiState::VJoyEdit && renderer != NULL) if (gui_state == GuiState::VJoyEdit && renderer != nullptr)
renderer->DrawOSD(true); renderer->DrawOSD(true);
#ifndef TARGET_IPHONE #ifndef TARGET_IPHONE
std::this_thread::sleep_for(std::chrono::milliseconds(16)); std::this_thread::sleep_for(std::chrono::milliseconds(16));
@ -72,7 +72,10 @@ bool mainui_rend_frame()
void mainui_init() void mainui_init()
{ {
rend_init_renderer(); if (!rend_init_renderer()) {
ERROR_LOG(RENDERER, "Renderer initialization failed");
gui_error("Renderer initialization failed.\nPlease select a different graphics API");
}
} }
void mainui_term() void mainui_term()

View File

@ -1,29 +1,23 @@
#include "hw/pvr/ta_ctx.h" #include "hw/pvr/ta.h"
#include "hw/pvr/ta_structs.h"
#include "hw/pvr/Renderer_if.h" #include "hw/pvr/Renderer_if.h"
struct norend : Renderer struct norend : Renderer
{ {
bool Init() bool Init() override {
{
return true; return true;
} }
void Term() override { }
void Resize(int w, int h) { } bool Process(TA_context* ctx) override {
void Term() { } return ta_parse(ctx, true);
}
bool Render() override {
bool Process(TA_context* ctx) { return true; }
void DrawOSD() { }
bool Render()
{
return !pvrrc.isRTT; return !pvrrc.isRTT;
} }
void RenderFramebuffer(const FramebufferInfo& info) override { }
}; };
Renderer *rend_norend() {
Renderer* rend_norend() { return new norend(); } return new norend();
}
u32 GetTexture(TSP tsp,TCW tcw) { return 0; }

View File

@ -21,6 +21,8 @@
#pragma once #pragma once
#include <cinttypes> #include <cinttypes>
#include "vulkan.h" #include "vulkan.h"
#define VMA_NOT_NULL
#define VMA_NULLABLE
#include "vk_mem_alloc.h" #include "vk_mem_alloc.h"
#if !defined(PRIu64) && defined(_WIN32) #if !defined(PRIu64) && defined(_WIN32)

View File

@ -210,7 +210,7 @@ bool VulkanContext::InitInstance(const char** extensions, uint32_t extensions_co
} }
} }
if (!physicalDevice) if (!physicalDevice)
physicalDevice = instance->enumeratePhysicalDevices().front(); physicalDevice = devices.front();
const vk::PhysicalDeviceProperties *properties; const vk::PhysicalDeviceProperties *properties;
if (vulkan11) if (vulkan11)

View File

@ -121,6 +121,9 @@ Renderer* rend_Vulkan()
void ReInitOSD() void ReInitOSD()
{ {
if (renderer != nullptr) if (renderer != nullptr) {
((BaseVulkanRenderer *)renderer)->ReInitOSD(); BaseVulkanRenderer *vkrenderer = dynamic_cast<BaseVulkanRenderer*>(renderer);
if (vkrenderer != nullptr)
vkrenderer->ReInitOSD();
}
} }