pvr: recover from renderer init failure
issue MINIDUMP-V fix some warnings
This commit is contained in:
parent
5acfa7d3d6
commit
802f70fedd
|
@ -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
|
||||||
|
|
|
@ -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()
|
||||||
|
|
|
@ -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();
|
||||||
|
|
|
@ -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();
|
||||||
}
|
}
|
||||||
|
|
|
@ -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;
|
||||||
|
|
|
@ -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()
|
||||||
|
|
|
@ -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; }
|
|
||||||
|
|
|
@ -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)
|
||||||
|
|
|
@ -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)
|
||||||
|
|
|
@ -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();
|
||||||
|
}
|
||||||
}
|
}
|
||||||
|
|
Loading…
Reference in New Issue