DRW : Add new view_update mechanism.
This makes updates for the viewport cleaner and also add the possibility to add a new callback called when the scene is updated.
This commit is contained in:
@@ -66,6 +66,8 @@ void DRW_engine_viewport_data_size_get(
|
||||
const void *engine_type,
|
||||
int *r_fbl_len, int *r_txl_len, int *r_psl_len, int *r_stl_len);
|
||||
|
||||
void DRW_notify_view_update(const struct bContext *C);
|
||||
|
||||
void DRW_draw_view(const struct bContext *C);
|
||||
|
||||
void DRW_draw_render_loop_ex(
|
||||
|
||||
@@ -261,7 +261,8 @@ DrawEngineType draw_engine_basic_type = {
|
||||
&BASIC_cache_populate,
|
||||
&BASIC_cache_finish,
|
||||
NULL,
|
||||
&BASIC_draw_scene
|
||||
&BASIC_draw_scene,
|
||||
NULL,
|
||||
};
|
||||
|
||||
/* Note: currently unused, we may want to register so we can see this when debugging the view. */
|
||||
|
||||
@@ -923,7 +923,8 @@ DrawEngineType draw_engine_clay_type = {
|
||||
&CLAY_cache_populate,
|
||||
&CLAY_cache_finish,
|
||||
NULL,
|
||||
&CLAY_draw_scene
|
||||
&CLAY_draw_scene,
|
||||
NULL,
|
||||
};
|
||||
|
||||
RenderEngineType DRW_engine_viewport_clay_type = {
|
||||
|
||||
@@ -216,7 +216,8 @@ DrawEngineType draw_engine_external_type = {
|
||||
&EXTERNAL_cache_populate,
|
||||
&EXTERNAL_cache_finish,
|
||||
NULL,
|
||||
&EXTERNAL_draw_scene
|
||||
&EXTERNAL_draw_scene,
|
||||
NULL,
|
||||
};
|
||||
|
||||
/* Note: currently unused, we should not register unless we want to see this when debugging the view. */
|
||||
|
||||
@@ -136,6 +136,8 @@ typedef struct DrawEngineType {
|
||||
|
||||
void (*draw_background)(void *vedata);
|
||||
void (*draw_scene)(void *vedata);
|
||||
|
||||
void (*view_update)(void *vedata);
|
||||
} DrawEngineType;
|
||||
|
||||
#ifndef __DRW_ENGINE_H__
|
||||
|
||||
@@ -2549,6 +2549,8 @@ static void DRW_viewport_var_init(void)
|
||||
if (RST.bound_tex_slots == NULL) {
|
||||
RST.bound_tex_slots = MEM_callocN(sizeof(bool) * GPU_max_textures(), "Bound Texture Slots");
|
||||
}
|
||||
|
||||
memset(viewport_matrix_override.override, 0x0, sizeof(viewport_matrix_override.override));
|
||||
}
|
||||
|
||||
void DRW_viewport_matrix_get(float mat[4][4], DRWViewportMatrixType type)
|
||||
@@ -2615,8 +2617,7 @@ DefaultTextureList *DRW_viewport_texture_list_get(void)
|
||||
|
||||
void DRW_viewport_request_redraw(void)
|
||||
{
|
||||
/* XXXXXXXXXXX HAAAAAAAACKKKK */
|
||||
WM_main_add_notifier(NC_MATERIAL | ND_SHADING_DRAW, NULL);
|
||||
GPU_viewport_tag_update(DST.viewport);
|
||||
}
|
||||
|
||||
/** \} */
|
||||
@@ -3138,6 +3139,50 @@ static void DRW_debug_gpu_stats(void)
|
||||
DRW_stats_draw(&rect);
|
||||
}
|
||||
|
||||
/* -------------------------------------------------------------------- */
|
||||
|
||||
/** \name View Update
|
||||
* \{ */
|
||||
|
||||
void DRW_notify_view_update(const bContext *C)
|
||||
{
|
||||
struct Depsgraph *graph = CTX_data_depsgraph(C);
|
||||
ARegion *ar = CTX_wm_region(C);
|
||||
View3D *v3d = CTX_wm_view3d(C);
|
||||
RegionView3D *rv3d = ar->regiondata;
|
||||
Scene *scene = DEG_get_evaluated_scene(graph);
|
||||
SceneLayer *sl = DEG_get_evaluated_scene_layer(graph);
|
||||
|
||||
if (rv3d->viewport == NULL) {
|
||||
return;
|
||||
}
|
||||
|
||||
|
||||
/* Reset before using it. */
|
||||
memset(&DST, 0x0, sizeof(DST));
|
||||
|
||||
DST.viewport = rv3d->viewport;
|
||||
DST.draw_ctx = (DRWContextState){
|
||||
ar, rv3d, v3d, scene, sl, OBACT_NEW(sl), C,
|
||||
};
|
||||
|
||||
DRW_engines_enable(scene, sl);
|
||||
|
||||
for (LinkData *link = DST.enabled_engines.first; link; link = link->next) {
|
||||
DrawEngineType *engine = link->data;
|
||||
ViewportEngineData *data = DRW_viewport_engine_data_get(engine);
|
||||
|
||||
if (engine->view_update) {
|
||||
engine->view_update(data);
|
||||
}
|
||||
}
|
||||
|
||||
DST.viewport = NULL;
|
||||
|
||||
DRW_engines_disable();
|
||||
}
|
||||
|
||||
/** \} */
|
||||
|
||||
/* -------------------------------------------------------------------- */
|
||||
|
||||
|
||||
@@ -152,5 +152,6 @@ DrawEngineType draw_engine_edit_armature_type = {
|
||||
&EDIT_ARMATURE_cache_populate,
|
||||
NULL,
|
||||
NULL,
|
||||
&EDIT_ARMATURE_draw_scene
|
||||
&EDIT_ARMATURE_draw_scene,
|
||||
NULL,
|
||||
};
|
||||
|
||||
@@ -329,5 +329,6 @@ DrawEngineType draw_engine_edit_curve_type = {
|
||||
&EDIT_CURVE_cache_populate,
|
||||
&EDIT_CURVE_cache_finish,
|
||||
NULL, /* draw_background but not needed by mode engines */
|
||||
&EDIT_CURVE_draw_scene
|
||||
&EDIT_CURVE_draw_scene,
|
||||
NULL,
|
||||
};
|
||||
|
||||
@@ -292,5 +292,6 @@ DrawEngineType draw_engine_edit_lattice_type = {
|
||||
&EDIT_LATTICE_cache_populate,
|
||||
&EDIT_LATTICE_cache_finish,
|
||||
NULL, /* draw_background but not needed by mode engines */
|
||||
&EDIT_LATTICE_draw_scene
|
||||
&EDIT_LATTICE_draw_scene,
|
||||
NULL,
|
||||
};
|
||||
|
||||
@@ -593,5 +593,6 @@ DrawEngineType draw_engine_edit_mesh_type = {
|
||||
&EDIT_MESH_cache_populate,
|
||||
NULL,
|
||||
NULL,
|
||||
&EDIT_MESH_draw_scene
|
||||
&EDIT_MESH_draw_scene,
|
||||
NULL,
|
||||
};
|
||||
|
||||
@@ -264,5 +264,6 @@ DrawEngineType draw_engine_edit_metaball_type = {
|
||||
&EDIT_METABALL_cache_populate,
|
||||
&EDIT_METABALL_cache_finish,
|
||||
NULL, /* draw_background but not needed by mode engines */
|
||||
&EDIT_METABALL_draw_scene
|
||||
&EDIT_METABALL_draw_scene,
|
||||
NULL,
|
||||
};
|
||||
|
||||
@@ -264,5 +264,6 @@ DrawEngineType draw_engine_edit_surface_type = {
|
||||
&EDIT_SURFACE_cache_populate,
|
||||
&EDIT_SURFACE_cache_finish,
|
||||
NULL, /* draw_background but not needed by mode engines */
|
||||
&EDIT_SURFACE_draw_scene
|
||||
&EDIT_SURFACE_draw_scene,
|
||||
NULL,
|
||||
};
|
||||
|
||||
@@ -307,5 +307,6 @@ DrawEngineType draw_engine_edit_text_type = {
|
||||
&EDIT_TEXT_cache_populate,
|
||||
&EDIT_TEXT_cache_finish,
|
||||
NULL, /* draw_background but not needed by mode engines */
|
||||
&EDIT_TEXT_draw_scene
|
||||
&EDIT_TEXT_draw_scene,
|
||||
NULL,
|
||||
};
|
||||
|
||||
@@ -1876,5 +1876,6 @@ DrawEngineType draw_engine_object_type = {
|
||||
&OBJECT_cache_populate,
|
||||
NULL,
|
||||
NULL,
|
||||
&OBJECT_draw_scene
|
||||
&OBJECT_draw_scene,
|
||||
NULL,
|
||||
};
|
||||
|
||||
@@ -412,5 +412,6 @@ DrawEngineType draw_engine_paint_texture_type = {
|
||||
&PAINT_TEXTURE_cache_populate,
|
||||
&PAINT_TEXTURE_cache_finish,
|
||||
NULL, /* draw_background but not needed by mode engines */
|
||||
&PAINT_TEXTURE_draw_scene
|
||||
&PAINT_TEXTURE_draw_scene,
|
||||
NULL,
|
||||
};
|
||||
|
||||
@@ -211,5 +211,6 @@ DrawEngineType draw_engine_paint_vertex_type = {
|
||||
&PAINT_VERTEX_cache_populate,
|
||||
NULL,
|
||||
NULL,
|
||||
&PAINT_VERTEX_draw_scene
|
||||
&PAINT_VERTEX_draw_scene,
|
||||
NULL,
|
||||
};
|
||||
|
||||
@@ -249,5 +249,6 @@ DrawEngineType draw_engine_paint_weight_type = {
|
||||
&PAINT_WEIGHT_cache_populate,
|
||||
NULL,
|
||||
NULL,
|
||||
&PAINT_WEIGHT_draw_scene
|
||||
&PAINT_WEIGHT_draw_scene,
|
||||
NULL,
|
||||
};
|
||||
|
||||
@@ -259,5 +259,6 @@ DrawEngineType draw_engine_particle_type = {
|
||||
&PARTICLE_cache_populate,
|
||||
&PARTICLE_cache_finish,
|
||||
NULL, /* draw_background but not needed by mode engines */
|
||||
&PARTICLE_draw_scene
|
||||
&PARTICLE_draw_scene,
|
||||
NULL,
|
||||
};
|
||||
|
||||
@@ -193,5 +193,6 @@ DrawEngineType draw_engine_pose_type = {
|
||||
&POSE_cache_populate,
|
||||
NULL,
|
||||
NULL,
|
||||
&POSE_draw_scene
|
||||
&POSE_draw_scene,
|
||||
NULL,
|
||||
};
|
||||
|
||||
@@ -300,5 +300,6 @@ DrawEngineType draw_engine_sculpt_type = {
|
||||
&SCULPT_cache_populate,
|
||||
&SCULPT_cache_finish,
|
||||
NULL, /* draw_background but not needed by mode engines */
|
||||
&SCULPT_draw_scene
|
||||
&SCULPT_draw_scene,
|
||||
NULL,
|
||||
};
|
||||
|
||||
@@ -25,6 +25,7 @@ set(INC
|
||||
../../blenloader
|
||||
../../blentranslation
|
||||
../../depsgraph
|
||||
../../draw
|
||||
../../gpu
|
||||
../../imbuf
|
||||
../../bmesh
|
||||
|
||||
@@ -41,6 +41,8 @@
|
||||
#include "DNA_world_types.h"
|
||||
#include "DNA_windowmanager_types.h"
|
||||
|
||||
#include "DRW_engine.h"
|
||||
|
||||
#include "BLI_listbase.h"
|
||||
#include "BLI_threads.h"
|
||||
#include "BLI_utildefines.h"
|
||||
@@ -137,6 +139,16 @@ void ED_render_scene_update(Main *bmain, Scene *scene, int updated)
|
||||
|
||||
engine->flag &= ~RE_ENGINE_DO_UPDATE;
|
||||
engine->type->view_update(engine, C);
|
||||
|
||||
}
|
||||
else if ((RE_engines_find(scene->r.engine)->flag & RE_USE_LEGACY_PIPELINE) == 0) {
|
||||
if (updated) {
|
||||
CTX_wm_screen_set(C, sc);
|
||||
CTX_wm_area_set(C, sa);
|
||||
CTX_wm_region_set(C, ar);
|
||||
|
||||
DRW_notify_view_update(C);
|
||||
}
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
@@ -101,6 +101,9 @@ void *GPU_viewport_texture_list_get(GPUViewport *viewport);
|
||||
void GPU_viewport_size_get(const GPUViewport *viewport, int size[2]);
|
||||
void GPU_viewport_size_set(GPUViewport *viewport, const int size[2]);
|
||||
|
||||
void GPU_viewport_tag_update(GPUViewport *viewport);
|
||||
bool GPU_viewport_do_update(GPUViewport *viewport);
|
||||
|
||||
/* Texture pool */
|
||||
GPUTexture *GPU_viewport_texture_pool_query(GPUViewport *viewport, void *engine, int width, int height, int channels, int format);
|
||||
|
||||
|
||||
@@ -72,7 +72,9 @@ struct GPUViewport {
|
||||
/* debug */
|
||||
GPUTexture *debug_depth;
|
||||
int size[2];
|
||||
|
||||
int samples;
|
||||
int flag;
|
||||
|
||||
ListBase data; /* ViewportEngineData wrapped in LinkData */
|
||||
unsigned int data_hash; /* If hash mismatch we free all ViewportEngineData in this viewport */
|
||||
@@ -83,11 +85,27 @@ struct GPUViewport {
|
||||
ListBase tex_pool; /* ViewportTempTexture list : Temporary textures shared across draw engines */
|
||||
};
|
||||
|
||||
enum {
|
||||
DO_UPDATE = (1 << 0),
|
||||
};
|
||||
|
||||
static void gpu_viewport_buffers_free(FramebufferList *fbl, int fbl_len, TextureList *txl, int txl_len);
|
||||
static void gpu_viewport_storage_free(StorageList *stl, int stl_len);
|
||||
static void gpu_viewport_passes_free(PassList *psl, int psl_len);
|
||||
static void gpu_viewport_texture_pool_free(GPUViewport *viewport);
|
||||
|
||||
void GPU_viewport_tag_update(GPUViewport *viewport)
|
||||
{
|
||||
viewport->flag |= DO_UPDATE;
|
||||
}
|
||||
|
||||
bool GPU_viewport_do_update(GPUViewport *viewport)
|
||||
{
|
||||
bool ret = (viewport->flag & DO_UPDATE);
|
||||
viewport->flag &= ~DO_UPDATE;
|
||||
return ret;
|
||||
}
|
||||
|
||||
GPUViewport *GPU_viewport_create(void)
|
||||
{
|
||||
GPUViewport *viewport = MEM_callocN(sizeof(GPUViewport), "GPUViewport");
|
||||
|
||||
@@ -58,6 +58,7 @@
|
||||
#include "GPU_draw.h"
|
||||
#include "GPU_extensions.h"
|
||||
#include "GPU_immediate.h"
|
||||
#include "GPU_viewport.h"
|
||||
|
||||
#include "RE_engine.h"
|
||||
|
||||
@@ -136,6 +137,7 @@ static void wm_region_test_render_do_draw(const Scene *scene, ScrArea *sa, ARegi
|
||||
if (sa->spacetype == SPACE_VIEW3D) {
|
||||
RegionView3D *rv3d = ar->regiondata;
|
||||
RenderEngine *engine = (rv3d) ? rv3d->render_engine : NULL;
|
||||
GPUViewport *viewport = (rv3d) ? rv3d->viewport : NULL;
|
||||
|
||||
if (engine && (engine->flag & RE_ENGINE_DO_DRAW)) {
|
||||
View3D *v3d = sa->spacedata.first;
|
||||
@@ -149,6 +151,9 @@ static void wm_region_test_render_do_draw(const Scene *scene, ScrArea *sa, ARegi
|
||||
|
||||
engine->flag &= ~RE_ENGINE_DO_DRAW;
|
||||
}
|
||||
else if (viewport && GPU_viewport_do_update(viewport)) {
|
||||
ED_region_tag_redraw(ar);
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
|
||||
Reference in New Issue
Block a user