EEVEE-Next: Display error instead of crashing on unsupported hardware

This message will remain in effect until we bump up the minimum
hardware requirement.
This commit is contained in:
Clément Foucault 2022-05-19 00:31:01 +02:00
parent 769cdccd0e
commit f4028630bf
3 changed files with 36 additions and 2 deletions

View File

@ -5,6 +5,7 @@
#include "BKE_global.h"
#include "BLI_rect.h"
#include "GPU_capabilities.h"
#include "GPU_framebuffer.h"
#include "ED_view3d.h"
@ -24,10 +25,17 @@ struct EEVEE_Data {
DRWViewportEmptyList *psl;
DRWViewportEmptyList *stl;
eevee::Instance *instance;
char info[GPU_INFO_SIZE];
};
static void eevee_engine_init(void *vedata)
{
/* TODO(fclem): Remove once it is minimum required. */
if (!GPU_shader_storage_buffer_objects_support()) {
return;
}
EEVEE_Data *ved = reinterpret_cast<EEVEE_Data *>(vedata);
if (ved->instance == nullptr) {
ved->instance = new eevee::Instance();
@ -81,22 +89,37 @@ static void eevee_engine_init(void *vedata)
static void eevee_draw_scene(void *vedata)
{
EEVEE_Data *ved = reinterpret_cast<EEVEE_Data *>(vedata);
if (!GPU_shader_storage_buffer_objects_support()) {
STRNCPY(ved->info, "Error: No shader storage buffer support");
return;
}
DefaultFramebufferList *dfbl = DRW_viewport_framebuffer_list_get();
reinterpret_cast<EEVEE_Data *>(vedata)->instance->draw_viewport(dfbl);
ved->instance->draw_viewport(dfbl);
STRNCPY(ved->info, ved->instance->info.c_str());
}
static void eevee_cache_init(void *vedata)
{
if (!GPU_shader_storage_buffer_objects_support()) {
return;
}
reinterpret_cast<EEVEE_Data *>(vedata)->instance->begin_sync();
}
static void eevee_cache_populate(void *vedata, Object *object)
{
if (!GPU_shader_storage_buffer_objects_support()) {
return;
}
reinterpret_cast<EEVEE_Data *>(vedata)->instance->object_sync(object);
}
static void eevee_cache_finish(void *vedata)
{
if (!GPU_shader_storage_buffer_objects_support()) {
return;
}
reinterpret_cast<EEVEE_Data *>(vedata)->instance->end_sync();
}
@ -107,6 +130,9 @@ static void eevee_engine_free()
static void eevee_instance_free(void *instance)
{
if (!GPU_shader_storage_buffer_objects_support()) {
return;
}
delete reinterpret_cast<eevee::Instance *>(instance);
}
@ -115,11 +141,17 @@ static void eevee_render_to_image(void *UNUSED(vedata),
struct RenderLayer *layer,
const struct rcti *UNUSED(rect))
{
if (!GPU_shader_storage_buffer_objects_support()) {
return;
}
UNUSED_VARS(engine, layer);
}
static void eevee_render_update_passes(RenderEngine *engine, Scene *scene, ViewLayer *view_layer)
{
if (!GPU_shader_storage_buffer_objects_support()) {
return;
}
UNUSED_VARS(engine, scene, view_layer);
}

View File

@ -50,6 +50,8 @@ void Instance::init(const int2 &output_res,
v3d = v3d_;
rv3d = rv3d_;
info = "";
update_eval_members();
main_view.init(output_res);

View File

@ -58,7 +58,7 @@ class Instance {
const RegionView3D *rv3d;
/* Info string displayed at the top of the render / viewport. */
char info[64];
std::string info = "";
public:
Instance()