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/tileclip.h
core/rend/TexCache.cpp
core/rend/TexCache.h)
core/rend/TexCache.h
core/rend/norend/norend.cpp)
if(NOT LIBRETRO)
target_sources(${PROJECT_NAME} PRIVATE
core/rend/game_scanner.h

View File

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

View File

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

View File

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

View File

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

View File

@ -46,7 +46,7 @@ bool mainui_rend_frame()
{
gui_display_ui();
// TODO refactor android vjoy out of renderer
if (gui_state == GuiState::VJoyEdit && renderer != NULL)
if (gui_state == GuiState::VJoyEdit && renderer != nullptr)
renderer->DrawOSD(true);
#ifndef TARGET_IPHONE
std::this_thread::sleep_for(std::chrono::milliseconds(16));
@ -72,7 +72,10 @@ bool mainui_rend_frame()
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()

View File

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

View File

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

View File

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

View File

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