Changeset View
Changeset View
Standalone View
Standalone View
source/blender/draw/intern/draw_view_data.cc
| /* SPDX-License-Identifier: GPL-2.0-or-later | /* SPDX-License-Identifier: GPL-2.0-or-later | ||||
| * Copyright 2021 Blender Foundation. */ | * Copyright 2021 Blender Foundation. */ | ||||
| /** \file | /** \file | ||||
| * \ingroup draw | * \ingroup draw | ||||
| */ | */ | ||||
| #include "BLI_vector.hh" | #include "BLI_vector.hh" | ||||
| #include "GPU_capabilities.h" | |||||
| #include "GPU_viewport.h" | #include "GPU_viewport.h" | ||||
| #include "DRW_render.h" | #include "DRW_render.h" | ||||
| #include "draw_instance_data.h" | #include "draw_instance_data.h" | ||||
| #include "draw_manager_text.h" | #include "draw_manager_text.h" | ||||
| #include "draw_manager.h" | #include "draw_manager.h" | ||||
| #include "draw_manager.hh" | |||||
| #include "draw_view_data.h" | #include "draw_view_data.h" | ||||
| using namespace blender; | using namespace blender; | ||||
| struct DRWViewData { | struct DRWViewData { | ||||
| DefaultFramebufferList dfbl = {}; | DefaultFramebufferList dfbl = {}; | ||||
| DefaultTextureList dtxl = {}; | DefaultTextureList dtxl = {}; | ||||
| /** True indicates the textures inside dtxl are from the viewport and should not be freed. */ | /** True indicates the textures inside dtxl are from the viewport and should not be freed. */ | ||||
| bool from_viewport = false; | bool from_viewport = false; | ||||
| /** Common size for texture in the engines texture list. | /** Common size for texture in the engines texture list. | ||||
| * We free all texture lists if it changes. */ | * We free all texture lists if it changes. */ | ||||
| int texture_list_size[2] = {0, 0}; | int texture_list_size[2] = {0, 0}; | ||||
| double cache_time = 0.0; | double cache_time = 0.0; | ||||
| Vector<ViewportEngineData> engines; | Vector<ViewportEngineData> engines; | ||||
| Vector<ViewportEngineData *> enabled_engines; | Vector<ViewportEngineData *> enabled_engines; | ||||
| /** New per view/viewport manager. Null if not supported by current hardware. */ | |||||
| draw::Manager *manager = nullptr; | |||||
| DRWViewData() | |||||
| { | |||||
| /* Only for GL >= 4.3 implementation for now. */ | |||||
| if (GPU_shader_storage_buffer_objects_support() && GPU_compute_shader_support()) { | |||||
| manager = new draw::Manager(); | |||||
| } | |||||
| }; | |||||
| ~DRWViewData() | |||||
| { | |||||
| delete manager; | |||||
| }; | |||||
| }; | }; | ||||
| DRWViewData *DRW_view_data_create(ListBase *engine_types) | DRWViewData *DRW_view_data_create(ListBase *engine_types) | ||||
| { | { | ||||
| const int engine_types_len = BLI_listbase_count(engine_types); | const int engine_types_len = BLI_listbase_count(engine_types); | ||||
| DRWViewData *view_data = new DRWViewData(); | DRWViewData *view_data = new DRWViewData(); | ||||
| view_data->engines.reserve(engine_types_len); | view_data->engines.reserve(engine_types_len); | ||||
| ▲ Show 20 Lines • Show All 188 Lines • ▼ Show 20 Lines | |||||
| ViewportEngineData *DRW_view_data_enabled_engine_iter_step(DRWEngineIterator *iterator) | ViewportEngineData *DRW_view_data_enabled_engine_iter_step(DRWEngineIterator *iterator) | ||||
| { | { | ||||
| if (iterator->id >= iterator->end) { | if (iterator->id >= iterator->end) { | ||||
| return nullptr; | return nullptr; | ||||
| } | } | ||||
| ViewportEngineData *engine = iterator->engines[iterator->id++]; | ViewportEngineData *engine = iterator->engines[iterator->id++]; | ||||
| return engine; | return engine; | ||||
| } | } | ||||
| draw::Manager *DRW_manager_get() | |||||
| { | |||||
| BLI_assert(DST.view_data_active->manager); | |||||
| return reinterpret_cast<draw::Manager *>(DST.view_data_active->manager); | |||||
| } | |||||
| draw::ObjectRef DRW_object_ref_get(Object *object) | |||||
| { | |||||
| BLI_assert(DST.view_data_active->manager); | |||||
| return {object, DST.dupli_source, DST.dupli_parent}; | |||||
| } | |||||
| void DRW_manager_begin_sync() | |||||
| { | |||||
| if (DST.view_data_active->manager == nullptr) { | |||||
| return; | |||||
| } | |||||
| reinterpret_cast<draw::Manager *>(DST.view_data_active->manager)->begin_sync(); | |||||
| } | |||||
| void DRW_manager_end_sync() | |||||
| { | |||||
| if (DST.view_data_active->manager == nullptr) { | |||||
| return; | |||||
| } | |||||
| reinterpret_cast<draw::Manager *>(DST.view_data_active->manager)->end_sync(); | |||||
| } | |||||