diff options
author | Clément Foucault <foucault.clem@gmail.com> | 2022-05-19 01:31:01 +0300 |
---|---|---|
committer | Clément Foucault <foucault.clem@gmail.com> | 2022-05-19 01:35:36 +0300 |
commit | f4028630bfdaa0e22be0872f209505dbb6b0aa2d (patch) | |
tree | f496d55445f7c0634007517d6f08ba8fc2ca9e13 /source/blender/draw/engines | |
parent | 769cdccd0e56f1a513f9555d31485f06b363860e (diff) |
EEVEE-Next: Display error instead of crashing on unsupported hardware
This message will remain in effect until we bump up the minimum
hardware requirement.
Diffstat (limited to 'source/blender/draw/engines')
3 files changed, 36 insertions, 2 deletions
diff --git a/source/blender/draw/engines/eevee_next/eevee_engine.cc b/source/blender/draw/engines/eevee_next/eevee_engine.cc index d6d169620ab..be0adfad568 100644 --- a/source/blender/draw/engines/eevee_next/eevee_engine.cc +++ b/source/blender/draw/engines/eevee_next/eevee_engine.cc @@ -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); } diff --git a/source/blender/draw/engines/eevee_next/eevee_instance.cc b/source/blender/draw/engines/eevee_next/eevee_instance.cc index 263acd701a2..d037b46eaef 100644 --- a/source/blender/draw/engines/eevee_next/eevee_instance.cc +++ b/source/blender/draw/engines/eevee_next/eevee_instance.cc @@ -50,6 +50,8 @@ void Instance::init(const int2 &output_res, v3d = v3d_; rv3d = rv3d_; + info = ""; + update_eval_members(); main_view.init(output_res); diff --git a/source/blender/draw/engines/eevee_next/eevee_instance.hh b/source/blender/draw/engines/eevee_next/eevee_instance.hh index dd72169c854..84be59fc5f0 100644 --- a/source/blender/draw/engines/eevee_next/eevee_instance.hh +++ b/source/blender/draw/engines/eevee_next/eevee_instance.hh @@ -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() |