Welcome to mirror list, hosted at ThFree Co, Russian Federation.

git.blender.org/blender.git - Unnamed repository; edit this file 'description' to name the repository.
summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authorBastien Montagne <montagne29@wanadoo.fr>2018-08-01 15:16:41 +0300
committerBastien Montagne <montagne29@wanadoo.fr>2018-08-01 15:16:41 +0300
commit936d1cef6e6124a8f8f3ce50182afa2e1c947c6f (patch)
tree429a7503472bd8fe38ceb062086e447cb3a83423 /source/blender/draw/intern
parent4e6bcd10e559ab541df53a3d7b645faac1a7fe27 (diff)
parentddd62f1b1063d69df5171c7b3457ffcffcc6b0e4 (diff)
Merge branch 'blender2.8' into soc-2018-bevel
Conflicts: release/scripts/addons release/scripts/startup/bl_ui/space_view3d_toolbar.py source/blender/editors/space_outliner/outliner_draw.c
Diffstat (limited to 'source/blender/draw/intern')
-rw-r--r--source/blender/draw/intern/DRW_render.h20
-rw-r--r--source/blender/draw/intern/draw_anim_viz.c13
-rw-r--r--source/blender/draw/intern/draw_armature.c31
-rw-r--r--source/blender/draw/intern/draw_cache.c110
-rw-r--r--source/blender/draw/intern/draw_cache.h3
-rw-r--r--source/blender/draw/intern/draw_cache_impl.h4
-rw-r--r--source/blender/draw/intern/draw_cache_impl_metaball.c2
-rw-r--r--source/blender/draw/intern/draw_common.c10
-rw-r--r--source/blender/draw/intern/draw_common.h10
-rw-r--r--source/blender/draw/intern/draw_manager.c222
-rw-r--r--source/blender/draw/intern/draw_manager_data.c27
-rw-r--r--source/blender/draw/intern/draw_manager_shader.c11
-rw-r--r--source/blender/draw/intern/draw_view.c11
13 files changed, 388 insertions, 86 deletions
diff --git a/source/blender/draw/intern/DRW_render.h b/source/blender/draw/intern/DRW_render.h
index adcfe2524c7..abba8d3ce91 100644
--- a/source/blender/draw/intern/DRW_render.h
+++ b/source/blender/draw/intern/DRW_render.h
@@ -120,11 +120,21 @@ typedef char DRWViewportEmptyList;
if (dfbl->multisample_fb != NULL) { \
DRW_stats_query_start("Multisample Resolve"); \
GPU_framebuffer_bind(dfbl->default_fb); \
- DRW_multisamples_resolve(dtxl->multisample_depth, dtxl->multisample_color); \
+ DRW_multisamples_resolve(dtxl->multisample_depth, dtxl->multisample_color, true); \
DRW_stats_query_end(); \
} \
}
+#define MULTISAMPLE_SYNC_DISABLE_NO_DEPTH(dfbl, dtxl) { \
+ if (dfbl->multisample_fb != NULL) { \
+ DRW_stats_query_start("Multisample Resolve"); \
+ GPU_framebuffer_bind(dfbl->default_fb); \
+ DRW_multisamples_resolve(dtxl->multisample_depth, dtxl->multisample_color, false); \
+ DRW_stats_query_end(); \
+ } \
+}
+
+
typedef struct DrawEngineDataSize {
@@ -225,10 +235,10 @@ void DRW_uniformbuffer_free(struct GPUUniformBuffer *ubo);
} \
} while (0)
-void DRW_transform_to_display(struct GPUTexture *tex);
+void DRW_transform_to_display(struct GPUTexture *tex, bool use_view_settings);
void DRW_transform_none(struct GPUTexture *tex);
void DRW_multisamples_resolve(
- struct GPUTexture *src_depth, struct GPUTexture *src_color);
+ struct GPUTexture *src_depth, struct GPUTexture *src_color, bool use_depth);
/* Shaders */
struct GPUShader *DRW_shader_create(
@@ -402,6 +412,8 @@ void DRW_shgroup_uniform_int_copy(DRWShadingGroup *shgroup, const char *name, co
void DRW_shgroup_uniform_bool_copy(DRWShadingGroup *shgroup, const char *name, const bool value);
void DRW_shgroup_uniform_float_copy(DRWShadingGroup *shgroup, const char *name, const float value);
+bool DRW_shgroup_is_empty(DRWShadingGroup *shgroup);
+
/* Passes */
DRWPass *DRW_pass_create(const char *name, DRWState state);
void DRW_pass_state_set(DRWPass *pass, DRWState state);
@@ -410,6 +422,8 @@ void DRW_pass_state_remove(DRWPass *pass, DRWState state);
void DRW_pass_foreach_shgroup(DRWPass *pass, void (*callback)(void *userData, DRWShadingGroup *shgrp), void *userData);
void DRW_pass_sort_shgroup_z(DRWPass *pass);
+bool DRW_pass_is_empty(DRWPass *pass);
+
/* Viewport */
typedef enum {
/* keep in sync with the union struct DRWMatrixState. */
diff --git a/source/blender/draw/intern/draw_anim_viz.c b/source/blender/draw/intern/draw_anim_viz.c
index 95894783cfe..7ddcb306cea 100644
--- a/source/blender/draw/intern/draw_anim_viz.c
+++ b/source/blender/draw/intern/draw_anim_viz.c
@@ -90,10 +90,12 @@ typedef struct MPATH_Data {
MPATH_StorageList *stl;
} MPATH_Data;
-struct {
+#if 0
+static struct {
GPUShader *mpath_line_sh;
GPUShader *mpath_points_sh;
} e_data = {0};
+#endif
/* *************************** Path Cache *********************************** */
@@ -322,12 +324,19 @@ static void MPATH_draw_scene(void *vedata)
DefaultFramebufferList *dfbl = DRW_viewport_framebuffer_list_get();
DefaultTextureList *dtxl = DRW_viewport_texture_list_get();
+ if (DRW_pass_is_empty(psl->lines) &&
+ DRW_pass_is_empty(psl->points))
+ {
+ /* Nothing to draw. */
+ return;
+ }
+
MULTISAMPLE_SYNC_ENABLE(dfbl, dtxl)
DRW_draw_pass(psl->lines);
DRW_draw_pass(psl->points);
- MULTISAMPLE_SYNC_DISABLE(dfbl, dtxl)
+ MULTISAMPLE_SYNC_DISABLE_NO_DEPTH(dfbl, dtxl)
}
/* *************************** Draw Engine Defines ****************************** */
diff --git a/source/blender/draw/intern/draw_armature.c b/source/blender/draw/intern/draw_armature.c
index f0a32dfc8e0..a84b3fdeb41 100644
--- a/source/blender/draw/intern/draw_armature.c
+++ b/source/blender/draw/intern/draw_armature.c
@@ -95,6 +95,8 @@ static struct {
DRWShadingGroup *lines_ik_spline;
DRWArmaturePasses passes;
+
+ bool transparent;
} g_data = {NULL};
@@ -139,7 +141,8 @@ static void drw_shgroup_bone_octahedral(
}
if (g_data.bone_octahedral_solid == NULL) {
struct GPUBatch *geom = DRW_cache_bone_octahedral_get();
- g_data.bone_octahedral_solid = shgroup_instance_bone_shape_solid(g_data.passes.bone_solid, geom);
+ g_data.bone_octahedral_solid = shgroup_instance_bone_shape_solid(g_data.passes.bone_solid, geom,
+ g_data.transparent);
}
float final_bonemat[4][4];
mul_m4_m4m4(final_bonemat, g_data.ob->obmat, bone_mat);
@@ -160,7 +163,7 @@ static void drw_shgroup_bone_box(
}
if (g_data.bone_box_solid == NULL) {
struct GPUBatch *geom = DRW_cache_bone_box_get();
- g_data.bone_box_solid = shgroup_instance_bone_shape_solid(g_data.passes.bone_solid, geom);
+ g_data.bone_box_solid = shgroup_instance_bone_shape_solid(g_data.passes.bone_solid, geom, g_data.transparent);
}
float final_bonemat[4][4];
mul_m4_m4m4(final_bonemat, g_data.ob->obmat, bone_mat);
@@ -234,13 +237,13 @@ static void drw_shgroup_bone_envelope(
g_data.bone_point_wire = shgroup_instance_bone_sphere_outline(g_data.passes.bone_wire);
}
if (g_data.bone_point_solid == NULL) {
- g_data.bone_point_solid = shgroup_instance_bone_sphere_solid(g_data.passes.bone_solid);
+ g_data.bone_point_solid = shgroup_instance_bone_sphere_solid(g_data.passes.bone_solid, g_data.transparent);
}
if (g_data.bone_envelope_wire == NULL) {
g_data.bone_envelope_wire = shgroup_instance_bone_envelope_outline(g_data.passes.bone_wire);
}
if (g_data.bone_envelope_solid == NULL) {
- g_data.bone_envelope_solid = shgroup_instance_bone_envelope_solid(g_data.passes.bone_solid);
+ g_data.bone_envelope_solid = shgroup_instance_bone_envelope_solid(g_data.passes.bone_solid, g_data.transparent);
/* We can have a lot of overdraw if we don't do this. Also envelope are not subject to
* inverted matrix. */
DRW_shgroup_state_enable(g_data.bone_envelope_solid, DRW_STATE_CULL_BACK);
@@ -329,7 +332,8 @@ static void drw_shgroup_bone_custom_solid(
}
if (surf) {
- DRWShadingGroup *shgrp_geom_solid = shgroup_instance_bone_shape_solid(g_data.passes.bone_solid, surf);
+ DRWShadingGroup *shgrp_geom_solid = shgroup_instance_bone_shape_solid(g_data.passes.bone_solid, surf,
+ g_data.transparent);
DRW_shgroup_call_dynamic_add(shgrp_geom_solid, final_bonemat, bone_color, hint_color);
}
@@ -372,7 +376,7 @@ static void drw_shgroup_bone_point(
g_data.bone_point_wire = shgroup_instance_bone_sphere_outline(g_data.passes.bone_wire);
}
if (g_data.bone_point_solid == NULL) {
- g_data.bone_point_solid = shgroup_instance_bone_sphere_solid(g_data.passes.bone_solid);
+ g_data.bone_point_solid = shgroup_instance_bone_sphere_solid(g_data.passes.bone_solid, g_data.transparent);
}
float final_bonemat[4][4];
mul_m4_m4m4(final_bonemat, g_data.ob->obmat, bone_mat);
@@ -456,7 +460,7 @@ static void drw_shgroup_bone_ik_spline_lines(const float start[3], const float e
* \{ */
/* global here is reset before drawing each bone */
-struct {
+static struct {
const ThemeWireColor *bcolor;
} g_color;
@@ -1732,11 +1736,12 @@ static void draw_armature_pose(Object *ob, const float const_color[4])
/**
* This function set the object space to use for all subsequent `DRW_shgroup_bone_*` calls.
*/
-static void drw_shgroup_armature(Object *ob, DRWArmaturePasses passes)
+static void drw_shgroup_armature(Object *ob, DRWArmaturePasses passes, bool transp)
{
memset(&g_data, 0x0, sizeof(g_data));
g_data.ob = ob;
g_data.passes = passes;
+ g_data.transparent = transp;
memset(&g_color, 0x0, sizeof(g_color));
}
@@ -1745,19 +1750,19 @@ void DRW_shgroup_armature_object(Object *ob, ViewLayer *view_layer, DRWArmatureP
float *color;
DRW_object_wire_theme_get(ob, view_layer, &color);
passes.bone_envelope = NULL; /* Don't do envelope distance in object mode. */
- drw_shgroup_armature(ob, passes);
+ drw_shgroup_armature(ob, passes, false);
draw_armature_pose(ob, color);
}
-void DRW_shgroup_armature_pose(Object *ob, DRWArmaturePasses passes)
+void DRW_shgroup_armature_pose(Object *ob, DRWArmaturePasses passes, bool transp)
{
- drw_shgroup_armature(ob, passes);
+ drw_shgroup_armature(ob, passes, transp);
draw_armature_pose(ob, NULL);
}
-void DRW_shgroup_armature_edit(Object *ob, DRWArmaturePasses passes)
+void DRW_shgroup_armature_edit(Object *ob, DRWArmaturePasses passes, bool transp)
{
- drw_shgroup_armature(ob, passes);
+ drw_shgroup_armature(ob, passes, transp);
draw_armature_edit(ob);
}
diff --git a/source/blender/draw/intern/draw_cache.c b/source/blender/draw/intern/draw_cache.c
index dff863b11bb..c3fa9f5c1aa 100644
--- a/source/blender/draw/intern/draw_cache.c
+++ b/source/blender/draw/intern/draw_cache.c
@@ -107,6 +107,7 @@ static struct DRWShapeCache {
GPUBatch *drw_particle_cross;
GPUBatch *drw_particle_circle;
GPUBatch *drw_particle_axis;
+ GPUBatch *drw_gpencil_axes;
} SHC = {NULL};
void DRW_shape_cache_free(void)
@@ -241,13 +242,15 @@ static GPUVertBuf *sphere_wire_vbo(const float rad)
cv[0] = p[(i + j) % NSEGMENTS][0];
cv[1] = p[(i + j) % NSEGMENTS][1];
- if (axis == 0)
- v[0] = cv[0], v[1] = cv[1], v[2] = 0.0f;
- else if (axis == 1)
- v[0] = cv[0], v[1] = 0.0f, v[2] = cv[1];
- else
- v[0] = 0.0f, v[1] = cv[0], v[2] = cv[1];
-
+ if (axis == 0) {
+ ARRAY_SET_ITEMS(v, cv[0], cv[1], 0.0f);
+ }
+ else if (axis == 1) {
+ ARRAY_SET_ITEMS(v, cv[0], 0.0f, cv[1]);
+ }
+ else {
+ ARRAY_SET_ITEMS(v, 0.0f, cv[0], cv[1]);
+ }
GPU_vertbuf_attr_set(vbo, attr_id.pos, i * 2 + j + (NSEGMENTS * 2 * axis), v);
}
}
@@ -551,12 +554,67 @@ GPUBatch *DRW_cache_screenspace_circle_get(void)
#undef CIRCLE_RESOL
}
-/** \} */
+/* Grease Pencil object */
+GPUBatch *DRW_cache_gpencil_axes_get(void)
+{
+ if (!SHC.drw_gpencil_axes) {
+ int axis;
+ float v1[3] = { 0.0f, 0.0f, 0.0f };
+ float v2[3] = { 0.0f, 0.0f, 0.0f };
+
+ /* cube data */
+ const GLfloat verts[8][3] = {
+ { -0.25f, -0.25f, -0.25f },
+ { -0.25f, -0.25f, 0.25f },
+ { -0.25f, 0.25f, -0.25f },
+ { -0.25f, 0.25f, 0.25f },
+ { 0.25f, -0.25f, -0.25f },
+ { 0.25f, -0.25f, 0.25f },
+ { 0.25f, 0.25f, -0.25f },
+ { 0.25f, 0.25f, 0.25f }
+ };
+
+ const GLubyte indices[24] = { 0, 1, 1, 3, 3, 2, 2, 0, 0, 4, 4, 5, 5, 7, 7, 6, 6, 4, 1, 5, 3, 7, 2, 6 };
+
+ /* Position Only 3D format */
+ static GPUVertFormat format = { 0 };
+ static uint pos_id;
+ if (format.attr_len == 0) {
+ pos_id = GPU_vertformat_attr_add(&format, "pos", GPU_COMP_F32, 3, GPU_FETCH_FLOAT);
+ }
+
+ GPUVertBuf *vbo = GPU_vertbuf_create_with_format(&format);
+
+ /* alloc 30 elements for cube and 3 axis */
+ GPU_vertbuf_data_alloc(vbo, ARRAY_SIZE(indices) + 6);
+
+ /* draw axis */
+ for (axis = 0; axis < 3; axis++) {
+ v1[axis] = 1.0f;
+ v2[axis] = -1.0f;
+
+ GPU_vertbuf_attr_set(vbo, pos_id, axis * 2, v1);
+ GPU_vertbuf_attr_set(vbo, pos_id, axis * 2 + 1, v2);
+
+ /* reset v1 & v2 to zero for next axis */
+ v1[axis] = v2[axis] = 0.0f;
+ }
+
+ /* draw cube */
+ for (int i = 0; i < 24; ++i) {
+ GPU_vertbuf_attr_set(vbo, pos_id, i + 6, verts[indices[i]]);
+ }
+
+ SHC.drw_gpencil_axes = GPU_batch_create_ex(GPU_PRIM_LINES, vbo, NULL, GPU_BATCH_OWNS_VBO);
+ }
+ return SHC.drw_gpencil_axes;
+}
+
/* -------------------------------------------------------------------- */
/** \name Common Object API
- * \{ */
+* \{ */
GPUBatch *DRW_cache_object_wire_outline_get(Object *ob)
{
@@ -769,17 +827,17 @@ GPUBatch *DRW_cache_empty_cone_get(void)
cv[1] = p[(i) % NSEGMENTS][1];
/* cone sides */
- v[0] = cv[0], v[1] = 0.0f, v[2] = cv[1];
+ ARRAY_SET_ITEMS(v, cv[0], 0.0f, cv[1]);
GPU_vertbuf_attr_set(vbo, attr_id.pos, i * 4, v);
- v[0] = 0.0f, v[1] = 2.0f, v[2] = 0.0f;
+ ARRAY_SET_ITEMS(v, 0.0f, 2.0f, 0.0f);
GPU_vertbuf_attr_set(vbo, attr_id.pos, i * 4 + 1, v);
/* end ring */
- v[0] = cv[0], v[1] = 0.0f, v[2] = cv[1];
+ ARRAY_SET_ITEMS(v, cv[0], 0.0f, cv[1]);
GPU_vertbuf_attr_set(vbo, attr_id.pos, i * 4 + 2, v);
cv[0] = p[(i + 1) % NSEGMENTS][0];
cv[1] = p[(i + 1) % NSEGMENTS][1];
- v[0] = cv[0], v[1] = 0.0f, v[2] = cv[1];
+ ARRAY_SET_ITEMS(v, cv[0], 0.0f, cv[1]);
GPU_vertbuf_attr_set(vbo, attr_id.pos, i * 4 + 3, v);
}
@@ -1522,9 +1580,9 @@ GPUBatch *DRW_cache_lamp_spot_get(void)
cv[1] = p[i % NSEGMENTS][1];
/* cone sides */
- v[0] = cv[0], v[1] = cv[1], v[2] = -1.0f;
+ ARRAY_SET_ITEMS(v, cv[0], cv[1], -1.0f);
GPU_vertbuf_attr_set(vbo, attr_id.pos, i * 4, v);
- v[0] = 0.0f, v[1] = 0.0f, v[2] = 0.0f;
+ ARRAY_SET_ITEMS(v, 0.0f, 0.0f, 0.0f);
GPU_vertbuf_attr_set(vbo, attr_id.pos, i * 4 + 1, v);
GPU_vertbuf_attr_set(vbo, attr_id.n1, i * 4, n[(i) % NSEGMENTS]);
@@ -1533,11 +1591,11 @@ GPUBatch *DRW_cache_lamp_spot_get(void)
GPU_vertbuf_attr_set(vbo, attr_id.n2, i * 4 + 1, n[(i + 1) % NSEGMENTS]);
/* end ring */
- v[0] = cv[0], v[1] = cv[1], v[2] = -1.0f;
+ ARRAY_SET_ITEMS(v, cv[0], cv[1], -1.0f);
GPU_vertbuf_attr_set(vbo, attr_id.pos, i * 4 + 2, v);
cv[0] = p[(i + 1) % NSEGMENTS][0];
cv[1] = p[(i + 1) % NSEGMENTS][1];
- v[0] = cv[0], v[1] = cv[1], v[2] = -1.0f;
+ ARRAY_SET_ITEMS(v, cv[0], cv[1], -1.0f);
GPU_vertbuf_attr_set(vbo, attr_id.pos, i * 4 + 3, v);
GPU_vertbuf_attr_set(vbo, attr_id.n1, i * 4 + 2, n[(i) % NSEGMENTS]);
@@ -2954,7 +3012,7 @@ GPUBatch *DRW_cache_curve_edge_wire_get(Object *ob)
BLI_assert(ob->type == OB_CURVE);
struct Curve *cu = ob->data;
- return DRW_curve_batch_cache_get_wire_edge(cu, ob->curve_cache);
+ return DRW_curve_batch_cache_get_wire_edge(cu, ob->runtime.curve_cache);
}
GPUBatch *DRW_cache_curve_edge_normal_get(Object *ob, float normal_size)
@@ -2962,7 +3020,7 @@ GPUBatch *DRW_cache_curve_edge_normal_get(Object *ob, float normal_size)
BLI_assert(ob->type == OB_CURVE);
struct Curve *cu = ob->data;
- return DRW_curve_batch_cache_get_normal_edge(cu, ob->curve_cache, normal_size);
+ return DRW_curve_batch_cache_get_normal_edge(cu, ob->runtime.curve_cache, normal_size);
}
GPUBatch *DRW_cache_curve_edge_overlay_get(Object *ob)
@@ -2986,7 +3044,7 @@ GPUBatch *DRW_cache_curve_surface_get(Object *ob)
BLI_assert(ob->type == OB_CURVE);
struct Curve *cu = ob->data;
- return DRW_curve_batch_cache_get_triangles_with_normals(cu, ob->curve_cache);
+ return DRW_curve_batch_cache_get_triangles_with_normals(cu, ob->runtime.curve_cache);
}
/* Return list of batches */
@@ -2996,7 +3054,7 @@ GPUBatch **DRW_cache_curve_surface_shaded_get(
BLI_assert(ob->type == OB_CURVE);
struct Curve *cu = ob->data;
- return DRW_curve_batch_cache_get_surface_shaded(cu, ob->curve_cache, gpumat_array, gpumat_array_len);
+ return DRW_curve_batch_cache_get_surface_shaded(cu, ob->runtime.curve_cache, gpumat_array, gpumat_array_len);
}
/** \} */
@@ -3032,7 +3090,7 @@ GPUBatch *DRW_cache_text_edge_wire_get(Object *ob)
BLI_assert(ob->type == OB_FONT);
struct Curve *cu = ob->data;
- return DRW_curve_batch_cache_get_wire_edge(cu, ob->curve_cache);
+ return DRW_curve_batch_cache_get_wire_edge(cu, ob->runtime.curve_cache);
}
GPUBatch *DRW_cache_text_surface_get(Object *ob)
@@ -3042,7 +3100,7 @@ GPUBatch *DRW_cache_text_surface_get(Object *ob)
if (cu->editfont && (cu->flag & CU_FAST)) {
return NULL;
}
- return DRW_curve_batch_cache_get_triangles_with_normals(cu, ob->curve_cache);
+ return DRW_curve_batch_cache_get_triangles_with_normals(cu, ob->runtime.curve_cache);
}
GPUBatch **DRW_cache_text_surface_shaded_get(
@@ -3053,7 +3111,7 @@ GPUBatch **DRW_cache_text_surface_shaded_get(
if (cu->editfont && (cu->flag & CU_FAST)) {
return NULL;
}
- return DRW_curve_batch_cache_get_surface_shaded(cu, ob->curve_cache, gpumat_array, gpumat_array_len);
+ return DRW_curve_batch_cache_get_surface_shaded(cu, ob->runtime.curve_cache, gpumat_array, gpumat_array_len);
}
GPUBatch *DRW_cache_text_cursor_overlay_get(Object *ob)
@@ -3082,7 +3140,7 @@ GPUBatch *DRW_cache_surf_surface_get(Object *ob)
BLI_assert(ob->type == OB_SURF);
struct Curve *cu = ob->data;
- return DRW_curve_batch_cache_get_triangles_with_normals(cu, ob->curve_cache);
+ return DRW_curve_batch_cache_get_triangles_with_normals(cu, ob->runtime.curve_cache);
}
/* Return list of batches */
@@ -3092,7 +3150,7 @@ GPUBatch **DRW_cache_surf_surface_shaded_get(
BLI_assert(ob->type == OB_SURF);
struct Curve *cu = ob->data;
- return DRW_curve_batch_cache_get_surface_shaded(cu, ob->curve_cache, gpumat_array, gpumat_array_len);
+ return DRW_curve_batch_cache_get_surface_shaded(cu, ob->runtime.curve_cache, gpumat_array, gpumat_array_len);
}
/** \} */
diff --git a/source/blender/draw/intern/draw_cache.h b/source/blender/draw/intern/draw_cache.h
index 129c0252f30..7d0996b3059 100644
--- a/source/blender/draw/intern/draw_cache.h
+++ b/source/blender/draw/intern/draw_cache.h
@@ -82,6 +82,9 @@ struct GPUBatch *DRW_cache_field_vortex_get(void);
struct GPUBatch *DRW_cache_field_tube_limit_get(void);
struct GPUBatch *DRW_cache_field_cone_limit_get(void);
+/* Grease Pencil */
+struct GPUBatch *DRW_cache_gpencil_axes_get(void);
+
/* Lamps */
struct GPUBatch *DRW_cache_lamp_get(void);
struct GPUBatch *DRW_cache_lamp_shadows_get(void);
diff --git a/source/blender/draw/intern/draw_cache_impl.h b/source/blender/draw/intern/draw_cache_impl.h
index eeb7b1c41ee..d4dbe5db80d 100644
--- a/source/blender/draw/intern/draw_cache_impl.h
+++ b/source/blender/draw/intern/draw_cache_impl.h
@@ -41,6 +41,7 @@ struct Curve;
struct Lattice;
struct Mesh;
struct MetaBall;
+struct bGPdata;
/* Expose via BKE callbacks */
void DRW_mball_batch_cache_dirty(struct MetaBall *mb, int mode);
@@ -58,6 +59,9 @@ void DRW_lattice_batch_cache_free(struct Lattice *lt);
void DRW_particle_batch_cache_dirty(struct ParticleSystem *psys, int mode);
void DRW_particle_batch_cache_free(struct ParticleSystem *psys);
+void DRW_gpencil_batch_cache_dirty(struct bGPdata *gpd);
+void DRW_gpencil_batch_cache_free(struct bGPdata *gpd);
+
/* Curve */
struct GPUBatch *DRW_curve_batch_cache_get_wire_edge(struct Curve *cu, struct CurveCache *ob_curve_cache);
struct GPUBatch *DRW_curve_batch_cache_get_normal_edge(
diff --git a/source/blender/draw/intern/draw_cache_impl_metaball.c b/source/blender/draw/intern/draw_cache_impl_metaball.c
index 375b0ba6bb2..2172997a714 100644
--- a/source/blender/draw/intern/draw_cache_impl_metaball.c
+++ b/source/blender/draw/intern/draw_cache_impl_metaball.c
@@ -140,7 +140,7 @@ GPUBatch *DRW_metaball_batch_cache_get_triangles_with_normals(Object *ob)
MetaBallBatchCache *cache = metaball_batch_cache_get(mb);
if (cache->batch == NULL) {
- ListBase *lb = &ob->curve_cache->disp;
+ ListBase *lb = &ob->runtime.curve_cache->disp;
cache->batch = GPU_batch_create_ex(
GPU_PRIM_TRIS,
DRW_displist_vertbuf_calc_pos_with_normals(lb),
diff --git a/source/blender/draw/intern/draw_common.c b/source/blender/draw/intern/draw_common.c
index c9fc5eba079..77d6e888771 100644
--- a/source/blender/draw/intern/draw_common.c
+++ b/source/blender/draw/intern/draw_common.c
@@ -552,7 +552,7 @@ DRWShadingGroup *shgroup_instance_bone_envelope_distance(DRWPass *pass)
return grp;
}
-DRWShadingGroup *shgroup_instance_bone_envelope_solid(DRWPass *pass)
+DRWShadingGroup *shgroup_instance_bone_envelope_solid(DRWPass *pass, bool transp)
{
if (g_shaders.bone_envelope == NULL) {
g_shaders.bone_envelope = DRW_shader_create(
@@ -572,6 +572,7 @@ DRWShadingGroup *shgroup_instance_bone_envelope_solid(DRWPass *pass)
g_shaders.bone_envelope,
pass, DRW_cache_bone_envelope_solid_get(),
g_formats.instance_bone_envelope);
+ DRW_shgroup_uniform_float_copy(grp, "alpha", transp ? 0.6f : 1.0f);
return grp;
}
@@ -623,7 +624,7 @@ DRWShadingGroup *shgroup_instance_bone_shape_outline(DRWPass *pass, struct GPUBa
return grp;
}
-DRWShadingGroup *shgroup_instance_bone_shape_solid(DRWPass *pass, struct GPUBatch *geom)
+DRWShadingGroup *shgroup_instance_bone_shape_solid(DRWPass *pass, struct GPUBatch *geom, bool transp)
{
if (g_shaders.shape_solid == NULL) {
g_shaders.shape_solid = DRW_shader_create(
@@ -641,11 +642,12 @@ DRWShadingGroup *shgroup_instance_bone_shape_solid(DRWPass *pass, struct GPUBatc
g_shaders.shape_solid,
pass, geom, g_formats.instance_bone);
DRW_shgroup_uniform_vec2(grp, "viewportSize", DRW_viewport_size_get(), 1);
+ DRW_shgroup_uniform_float_copy(grp, "alpha", transp ? 0.6f : 1.0f);
return grp;
}
-DRWShadingGroup *shgroup_instance_bone_sphere_solid(DRWPass *pass)
+DRWShadingGroup *shgroup_instance_bone_sphere_solid(DRWPass *pass, bool transp)
{
if (g_shaders.bone_sphere == NULL) {
g_shaders.bone_sphere = DRW_shader_create(
@@ -662,6 +664,8 @@ DRWShadingGroup *shgroup_instance_bone_sphere_solid(DRWPass *pass)
DRWShadingGroup *grp = DRW_shgroup_instance_create(
g_shaders.bone_sphere,
pass, DRW_cache_bone_point_get(), g_formats.instance_bone);
+ /* More transparent than the shape to be less distractive. */
+ DRW_shgroup_uniform_float_copy(grp, "alpha", transp ? 0.4f : 1.0f);
return grp;
}
diff --git a/source/blender/draw/intern/draw_common.h b/source/blender/draw/intern/draw_common.h
index 80b2ec8db71..0ad1402f29e 100644
--- a/source/blender/draw/intern/draw_common.h
+++ b/source/blender/draw/intern/draw_common.h
@@ -128,11 +128,11 @@ struct DRWShadingGroup *shgroup_instance_mball_handles(struct DRWPass *pass);
struct DRWShadingGroup *shgroup_instance_bone_axes(struct DRWPass *pass);
struct DRWShadingGroup *shgroup_instance_bone_envelope_distance(struct DRWPass *pass);
struct DRWShadingGroup *shgroup_instance_bone_envelope_outline(struct DRWPass *pass);
-struct DRWShadingGroup *shgroup_instance_bone_envelope_solid(struct DRWPass *pass);
+struct DRWShadingGroup *shgroup_instance_bone_envelope_solid(struct DRWPass *pass, bool transp);
struct DRWShadingGroup *shgroup_instance_bone_shape_outline(struct DRWPass *pass, struct GPUBatch *geom);
-struct DRWShadingGroup *shgroup_instance_bone_shape_solid(struct DRWPass *pass, struct GPUBatch *geom);
+struct DRWShadingGroup *shgroup_instance_bone_shape_solid(struct DRWPass *pass, struct GPUBatch *geom, bool transp);
struct DRWShadingGroup *shgroup_instance_bone_sphere_outline(struct DRWPass *pass);
-struct DRWShadingGroup *shgroup_instance_bone_sphere_solid(struct DRWPass *pass);
+struct DRWShadingGroup *shgroup_instance_bone_sphere_solid(struct DRWPass *pass, bool transp);
struct DRWShadingGroup *shgroup_instance_bone_stick(struct DRWPass *pass);
struct GPUShader *mpath_line_shader_get(void);
@@ -155,8 +155,8 @@ typedef struct DRWArmaturePasses {
} DRWArmaturePasses;
void DRW_shgroup_armature_object(struct Object *ob, struct ViewLayer *view_layer, struct DRWArmaturePasses passes);
-void DRW_shgroup_armature_pose(struct Object *ob, struct DRWArmaturePasses passes);
-void DRW_shgroup_armature_edit(struct Object *ob, struct DRWArmaturePasses passes);
+void DRW_shgroup_armature_pose(struct Object *ob, struct DRWArmaturePasses passes, bool transp);
+void DRW_shgroup_armature_edit(struct Object *ob, struct DRWArmaturePasses passes, bool transp);
/* draw_hair.c */
diff --git a/source/blender/draw/intern/draw_manager.c b/source/blender/draw/intern/draw_manager.c
index cc4f8ec7947..ba53c3aa664 100644
--- a/source/blender/draw/intern/draw_manager.c
+++ b/source/blender/draw/intern/draw_manager.c
@@ -48,6 +48,7 @@
#include "ED_space_api.h"
#include "ED_screen.h"
+#include "ED_gpencil.h"
#include "ED_particle.h"
#include "ED_view3d.h"
@@ -94,7 +95,7 @@
/** Render State: No persistent data between draw calls. */
DRWManager DST = {NULL};
-ListBase DRW_engines = {NULL, NULL};
+static ListBase DRW_engines = {NULL, NULL};
extern struct GPUUniformBuffer *view_ubo; /* draw_manager_exec.c */
@@ -224,7 +225,7 @@ bool DRW_check_psys_visible_within_active_context(
* \{ */
/* Use color management profile to draw texture to framebuffer */
-void DRW_transform_to_display(GPUTexture *tex)
+void DRW_transform_to_display(GPUTexture *tex, bool use_view_settings)
{
drw_state_set(DRW_STATE_WRITE_COLOR);
@@ -239,8 +240,11 @@ void DRW_transform_to_display(GPUTexture *tex)
/* View transform is already applied for offscreen, don't apply again, see: T52046 */
if (!(DST.options.is_image_render && !DST.options.is_scene_render)) {
Scene *scene = DST.draw_ctx.scene;
+ ColorManagedDisplaySettings *display_settings = &scene->display_settings;
+ ColorManagedViewSettings *view_settings = (use_view_settings) ? &scene->view_settings : NULL;
+
use_ocio = IMB_colormanagement_setup_glsl_draw_from_space(
- &scene->view_settings, &scene->display_settings, NULL, dither, false);
+ view_settings, display_settings, NULL, dither, false);
}
if (!use_ocio) {
@@ -317,10 +321,14 @@ void DRW_transform_none(GPUTexture *tex)
/* Use manual multisample resolve pass.
* Much quicker than blitting back and forth.
* Assume destination fb is bound*/
-void DRW_multisamples_resolve(GPUTexture *src_depth, GPUTexture *src_color)
+void DRW_multisamples_resolve(GPUTexture *src_depth, GPUTexture *src_color, bool use_depth)
{
- drw_state_set(DRW_STATE_WRITE_COLOR | DRW_STATE_BLEND_PREMUL |
- DRW_STATE_WRITE_DEPTH | DRW_STATE_DEPTH_LESS_EQUAL);
+ DRWState state = DRW_STATE_WRITE_COLOR | DRW_STATE_BLEND_PREMUL;
+
+ if (use_depth) {
+ state |= DRW_STATE_WRITE_DEPTH | DRW_STATE_DEPTH_LESS_EQUAL;
+ }
+ drw_state_set(state);
int samples = GPU_texture_samples(src_depth);
@@ -330,22 +338,39 @@ void DRW_multisamples_resolve(GPUTexture *src_depth, GPUTexture *src_color)
GPUBatch *geom = DRW_cache_fullscreen_quad_get();
int builtin;
- switch (samples) {
- case 2: builtin = GPU_SHADER_2D_IMAGE_MULTISAMPLE_2; break;
- case 4: builtin = GPU_SHADER_2D_IMAGE_MULTISAMPLE_4; break;
- case 8: builtin = GPU_SHADER_2D_IMAGE_MULTISAMPLE_8; break;
- case 16: builtin = GPU_SHADER_2D_IMAGE_MULTISAMPLE_16; break;
- default:
- BLI_assert(0);
- builtin = GPU_SHADER_2D_IMAGE_MULTISAMPLE_2;
- break;
+ if (use_depth) {
+ switch (samples) {
+ case 2: builtin = GPU_SHADER_2D_IMAGE_MULTISAMPLE_2_DEPTH_TEST; break;
+ case 4: builtin = GPU_SHADER_2D_IMAGE_MULTISAMPLE_4_DEPTH_TEST; break;
+ case 8: builtin = GPU_SHADER_2D_IMAGE_MULTISAMPLE_8_DEPTH_TEST; break;
+ case 16: builtin = GPU_SHADER_2D_IMAGE_MULTISAMPLE_16_DEPTH_TEST; break;
+ default:
+ BLI_assert("Mulisample count unsupported by blit shader.");
+ builtin = GPU_SHADER_2D_IMAGE_MULTISAMPLE_2_DEPTH_TEST;
+ break;
+ }
+ }
+ else {
+ switch (samples) {
+ case 2: builtin = GPU_SHADER_2D_IMAGE_MULTISAMPLE_2; break;
+ case 4: builtin = GPU_SHADER_2D_IMAGE_MULTISAMPLE_4; break;
+ case 8: builtin = GPU_SHADER_2D_IMAGE_MULTISAMPLE_8; break;
+ case 16: builtin = GPU_SHADER_2D_IMAGE_MULTISAMPLE_16; break;
+ default:
+ BLI_assert("Mulisample count unsupported by blit shader.");
+ builtin = GPU_SHADER_2D_IMAGE_MULTISAMPLE_2;
+ break;
+ }
}
GPU_batch_program_set_builtin(geom, builtin);
- GPU_texture_bind(src_depth, 0);
+ if (use_depth) {
+ GPU_texture_bind(src_depth, 0);
+ GPU_batch_uniform_1i(geom, "depthMulti", 0);
+ }
+
GPU_texture_bind(src_color, 1);
- GPU_batch_uniform_1i(geom, "depthMulti", 0);
GPU_batch_uniform_1i(geom, "colorMulti", 1);
float mat[4][4];
@@ -1198,10 +1223,17 @@ static void drw_engines_enable_from_mode(int mode)
break;
case CTX_MODE_OBJECT:
break;
+ case CTX_MODE_GPENCIL_PAINT:
+ case CTX_MODE_GPENCIL_EDIT:
+ case CTX_MODE_GPENCIL_SCULPT:
+ case CTX_MODE_GPENCIL_WEIGHT:
+ break;
default:
BLI_assert(!"Draw mode invalid");
break;
}
+ /* grease pencil */
+ use_drw_engine(&draw_engine_gpencil_type);
}
static void drw_engines_enable_from_overlays(int overlay_flag)
@@ -1234,6 +1266,10 @@ static void drw_engines_enable(ViewLayer *view_layer, RenderEngineType *engine_t
drw_engines_enable_from_object_mode();
drw_engines_enable_from_mode(mode);
}
+ else {
+ /* if gpencil must draw the strokes, but not the object */
+ drw_engines_enable_from_mode(mode);
+ }
}
static void drw_engines_disable(void)
@@ -1353,6 +1389,7 @@ void DRW_draw_render_loop_ex(
Scene *scene = DEG_get_evaluated_scene(depsgraph);
ViewLayer *view_layer = DEG_get_evaluated_view_layer(depsgraph);
RegionView3D *rv3d = ar->regiondata;
+ bool do_annotations = (((v3d->flag2 & V3D_SHOW_ANNOTATION) != 0) && ((v3d->flag2 & V3D_RENDER_OVERRIDE) == 0));
DST.draw_ctx.evil_C = evil_C;
DST.viewport = viewport;
@@ -1382,7 +1419,7 @@ void DRW_draw_render_loop_ex(
DRW_hair_init();
/* No framebuffer allowed before drawing. */
- BLI_assert(GPU_framebuffer_current_get() == 0);
+ BLI_assert(GPU_framebuffer_active_get() == NULL);
/* Init engines */
drw_engines_init();
@@ -1447,6 +1484,17 @@ void DRW_draw_render_loop_ex(
drw_engines_draw_scene();
+ /* annotations - temporary drawing buffer (3d space) */
+ /* XXX: Or should we use a proper draw/overlay engine for this case? */
+ if (((v3d->flag2 & V3D_RENDER_OVERRIDE) == 0) &&
+ (do_annotations))
+ {
+ glDisable(GL_DEPTH_TEST);
+ /* XXX: as scene->gpd is not copied for COW yet */
+ ED_gpencil_draw_view3d_annotations(DEG_get_input_scene(depsgraph), depsgraph, v3d, ar, true);
+ glEnable(GL_DEPTH_TEST);
+ }
+
DRW_draw_callbacks_post_scene();
if (DST.draw_ctx.evil_C) {
ED_region_draw_cb_draw(DST.draw_ctx.evil_C, DST.draw_ctx.ar, REGION_DRAW_POST_VIEW);
@@ -1471,6 +1519,17 @@ void DRW_draw_render_loop_ex(
DRW_draw_region_info();
+ /* annotations - temporary drawing buffer (screenspace) */
+ /* XXX: Or should we use a proper draw/overlay engine for this case? */
+ if (((v3d->flag2 & V3D_RENDER_OVERRIDE) == 0) &&
+ (do_annotations))
+ {
+ glDisable(GL_DEPTH_TEST);
+ /* XXX: as scene->gpd is not copied for COW yet */
+ ED_gpencil_draw_view3d_annotations(DEG_get_input_scene(depsgraph), depsgraph, v3d, ar, false);
+ glEnable(GL_DEPTH_TEST);
+ }
+
if ((v3d->flag2 & V3D_RENDER_OVERRIDE) == 0) {
/* Draw 2D after region info so we can draw on top of the camera passepartout overlay.
* 'DRW_draw_region_info' sets the projection in pixel-space. */
@@ -1559,6 +1618,121 @@ void DRW_draw_render_loop_offscreen(
GPU_offscreen_bind(ofs, false);
}
+/* helper to check if exit object type to render */
+static bool DRW_render_check_object_type(struct Depsgraph *depsgraph, short obtype)
+{
+ DEG_OBJECT_ITER_FOR_RENDER_ENGINE_BEGIN(depsgraph, ob)
+ {
+ if ((ob->type == obtype) && (DRW_check_object_visible_within_active_context(ob))) {
+ return true;
+ }
+ }
+ DEG_OBJECT_ITER_FOR_RENDER_ENGINE_END
+
+ return false;
+}
+
+static void DRW_render_gpencil_to_image(RenderEngine *engine, struct Depsgraph *depsgraph, struct RenderLayer *render_layer, const rcti *rect)
+{
+ if (draw_engine_gpencil_type.render_to_image) {
+ if (DRW_render_check_object_type(depsgraph, OB_GPENCIL)) {
+ ViewportEngineData *gpdata = drw_viewport_engine_data_ensure(&draw_engine_gpencil_type);
+ draw_engine_gpencil_type.render_to_image(gpdata, engine, render_layer, rect);
+ }
+ }
+}
+
+void DRW_render_gpencil(struct RenderEngine *engine, struct Depsgraph *depsgraph)
+{
+ /* This function is only valid for Cycles
+ * Eevee done all work in the Eevee render directly.
+ * Maybe it can be done equal for both engines?
+ */
+ if (STREQ(engine->type->name, "Eevee")) {
+ return;
+ }
+
+ Scene *scene = DEG_get_evaluated_scene(depsgraph);
+ ViewLayer *view_layer = DEG_get_evaluated_view_layer(depsgraph);
+ RenderEngineType *engine_type = engine->type;
+ RenderData *r = &scene->r;
+ Render *render = engine->re;
+ /* Changing Context */
+ if (G.background && DST.gl_context == NULL) {
+ WM_init_opengl(G_MAIN);
+ }
+
+ void *re_gl_context = RE_gl_context_get(render);
+ void *re_gpu_context = NULL;
+
+ /* Changing Context */
+ if (re_gl_context != NULL) {
+ DRW_opengl_render_context_enable(re_gl_context);
+ /* We need to query gpu context after a gl context has been bound. */
+ re_gpu_context = RE_gpu_context_get(render);
+ DRW_gawain_render_context_enable(re_gpu_context);
+ }
+ else {
+ DRW_opengl_context_enable();
+ }
+
+ /* Reset before using it. */
+ drw_state_prepare_clean_for_draw(&DST);
+ DST.options.is_image_render = true;
+ DST.options.is_scene_render = true;
+ DST.options.draw_background = scene->r.alphamode == R_ADDSKY;
+ DST.buffer_finish_called = true;
+
+ DST.draw_ctx = (DRWContextState) {
+ .scene = scene, .view_layer = view_layer,
+ .engine_type = engine_type,
+ .depsgraph = depsgraph, .object_mode = OB_MODE_OBJECT,
+ };
+ drw_context_state_init();
+
+ DST.viewport = GPU_viewport_create();
+ const int size[2] = { (r->size * r->xsch) / 100, (r->size * r->ysch) / 100 };
+ GPU_viewport_size_set(DST.viewport, size);
+
+ drw_viewport_var_init();
+
+ /* set default viewport */
+ gpuPushAttrib(GPU_ENABLE_BIT | GPU_VIEWPORT_BIT);
+ glDisable(GL_SCISSOR_TEST);
+ glViewport(0, 0, size[0], size[1]);
+
+ /* Main rendering. */
+ rctf view_rect;
+ rcti render_rect;
+ RE_GetViewPlane(render, &view_rect, &render_rect);
+ if (BLI_rcti_is_empty(&render_rect)) {
+ BLI_rcti_init(&render_rect, 0, size[0], 0, size[1]);
+ }
+
+ RenderResult *render_result = RE_engine_get_result(engine);
+ RenderLayer *render_layer = render_result->layers.first;
+
+ DRW_render_gpencil_to_image(engine, depsgraph, render_layer, &render_rect);
+
+ /* Force cache to reset. */
+ drw_viewport_cache_resize();
+ GPU_viewport_free(DST.viewport);
+ DRW_state_reset();
+
+ glDisable(GL_DEPTH_TEST);
+
+ /* Restore Drawing area. */
+ gpuPopAttrib();
+ glEnable(GL_SCISSOR_TEST);
+ GPU_framebuffer_restore();
+
+ /* Changing Context */
+ /* GPXX Review this context */
+ DRW_opengl_context_disable();
+
+ DST.buffer_finish_called = false;
+}
+
void DRW_render_to_image(RenderEngine *engine, struct Depsgraph *depsgraph)
{
Scene *scene = DEG_get_evaluated_scene(depsgraph);
@@ -1639,6 +1813,8 @@ void DRW_render_to_image(RenderEngine *engine, struct Depsgraph *depsgraph)
{
RE_SetActiveRenderView(render, render_view->name);
engine_type->draw_engine->render_to_image(data, engine, render_layer, &render_rect);
+ /* grease pencil: render result is merged in the previous render result. */
+ DRW_render_gpencil_to_image(engine, depsgraph, render_layer, &render_rect);
DST.buffer_finish_called = false;
}
@@ -1647,8 +1823,6 @@ void DRW_render_to_image(RenderEngine *engine, struct Depsgraph *depsgraph)
/* Force cache to reset. */
drw_viewport_cache_resize();
- /* TODO grease pencil */
-
GPU_viewport_free(DST.viewport);
GPU_framebuffer_restore();
@@ -2262,6 +2436,7 @@ void DRW_engines_register(void)
DRW_engine_register(&draw_engine_particle_type);
DRW_engine_register(&draw_engine_pose_type);
DRW_engine_register(&draw_engine_sculpt_type);
+ DRW_engine_register(&draw_engine_gpencil_type);
/* setup callbacks */
{
@@ -2280,6 +2455,9 @@ void DRW_engines_register(void)
/* BKE: particle.c */
extern void *BKE_particle_batch_cache_dirty_cb;
extern void *BKE_particle_batch_cache_free_cb;
+ /* BKE: gpencil.c */
+ extern void *BKE_gpencil_batch_cache_dirty_cb;
+ extern void *BKE_gpencil_batch_cache_free_cb;
BKE_mball_batch_cache_dirty_cb = DRW_mball_batch_cache_dirty;
BKE_mball_batch_cache_free_cb = DRW_mball_batch_cache_free;
@@ -2295,6 +2473,9 @@ void DRW_engines_register(void)
BKE_particle_batch_cache_dirty_cb = DRW_particle_batch_cache_dirty;
BKE_particle_batch_cache_free_cb = DRW_particle_batch_cache_free;
+
+ BKE_gpencil_batch_cache_dirty_cb = DRW_gpencil_batch_cache_dirty;
+ BKE_gpencil_batch_cache_free_cb = DRW_gpencil_batch_cache_free;
}
}
@@ -2351,6 +2532,7 @@ void DRW_opengl_context_create(void)
}
/* This changes the active context. */
DST.gl_context = WM_opengl_context_create();
+ WM_opengl_context_activate(DST.gl_context);
/* Be sure to create gawain.context too. */
DST.gpu_context = GPU_context_create();
if (!G.background) {
diff --git a/source/blender/draw/intern/draw_manager_data.c b/source/blender/draw/intern/draw_manager_data.c
index dccb869c133..407eea16d91 100644
--- a/source/blender/draw/intern/draw_manager_data.c
+++ b/source/blender/draw/intern/draw_manager_data.c
@@ -998,6 +998,23 @@ void DRW_shgroup_stencil_mask(DRWShadingGroup *shgroup, uint mask)
shgroup->stencil_mask = mask;
}
+bool DRW_shgroup_is_empty(DRWShadingGroup *shgroup)
+{
+ switch (shgroup->type) {
+ case DRW_SHG_NORMAL:
+ case DRW_SHG_FEEDBACK_TRANSFORM:
+ return shgroup->calls.first == NULL;
+ case DRW_SHG_POINT_BATCH:
+ case DRW_SHG_LINE_BATCH:
+ case DRW_SHG_TRIANGLE_BATCH:
+ case DRW_SHG_INSTANCE:
+ case DRW_SHG_INSTANCE_EXTERNAL:
+ return shgroup->instance_count == 0;
+ }
+ BLI_assert(!"Shading Group type not supported");
+ return true;
+}
+
/** \} */
/* -------------------------------------------------------------------- */
@@ -1019,6 +1036,16 @@ DRWPass *DRW_pass_create(const char *name, DRWState state)
return pass;
}
+bool DRW_pass_is_empty(DRWPass *pass)
+{
+ for (DRWShadingGroup *shgroup = pass->shgroups.first; shgroup; shgroup = shgroup->next) {
+ if (!DRW_shgroup_is_empty(shgroup)) {
+ return false;
+ }
+ }
+ return true;
+}
+
void DRW_pass_state_set(DRWPass *pass, DRWState state)
{
pass->state = state;
diff --git a/source/blender/draw/intern/draw_manager_shader.c b/source/blender/draw/intern/draw_manager_shader.c
index b0aec4a7600..b85e6267687 100644
--- a/source/blender/draw/intern/draw_manager_shader.c
+++ b/source/blender/draw/intern/draw_manager_shader.c
@@ -72,6 +72,7 @@ typedef struct DRWShaderCompiler {
ThreadMutex compilation_lock;
void *gl_context;
+ bool own_context;
int shaders_done; /* To compute progress. */
} DRWShaderCompiler;
@@ -146,7 +147,7 @@ static void drw_deferred_shader_compilation_free(void *custom_data)
BLI_spin_end(&comp->list_lock);
BLI_mutex_end(&comp->compilation_lock);
- if (comp->gl_context) {
+ if (comp->own_context) {
/* Only destroy if the job owns the context. */
WM_opengl_context_dispose(comp->gl_context);
}
@@ -189,8 +190,11 @@ static void drw_deferred_shader_add(GPUMaterial *mat, bool deferred)
BLI_movelisttolist(&comp->queue, &old_comp->queue);
BLI_spin_unlock(&old_comp->list_lock);
/* Do not recreate context, just pass ownership. */
- comp->gl_context = old_comp->gl_context;
- old_comp->gl_context = NULL;
+ if (old_comp->gl_context) {
+ comp->gl_context = old_comp->gl_context;
+ old_comp->own_context = false;
+ comp->own_context = true;
+ }
}
BLI_addtail(&comp->queue, dsh);
@@ -199,6 +203,7 @@ static void drw_deferred_shader_add(GPUMaterial *mat, bool deferred)
if (comp->gl_context == NULL) {
comp->gl_context = WM_opengl_context_create();
WM_opengl_context_activate(DST.gl_context);
+ comp->own_context = true;
}
WM_jobs_customdata_set(wm_job, comp, drw_deferred_shader_compilation_free);
diff --git a/source/blender/draw/intern/draw_view.c b/source/blender/draw/intern/draw_view.c
index 05aecea1d7a..95835a691a3 100644
--- a/source/blender/draw/intern/draw_view.c
+++ b/source/blender/draw/intern/draw_view.c
@@ -561,21 +561,12 @@ void DRW_draw_grid(void)
void DRW_draw_background(void)
{
- const DRWContextState *draw_ctx = DRW_context_state_get();
-
/* Just to make sure */
glDepthMask(GL_TRUE);
glColorMask(GL_TRUE, GL_TRUE, GL_TRUE, GL_TRUE);
glStencilMask(0xFF);
- if ((draw_ctx->v3d->flag3 & V3D_SHOW_WORLD) &&
- (draw_ctx->scene->world != NULL))
- {
- const World *world = draw_ctx->scene->world;
- glClearColor(world->horr, world->horg, world->horb, 1.0f);
- glClear(GL_COLOR_BUFFER_BIT | GL_DEPTH_BUFFER_BIT | GL_STENCIL_BUFFER_BIT);
- }
- else if (UI_GetThemeValue(TH_SHOW_BACK_GRAD)) {
+ if (UI_GetThemeValue(TH_SHOW_BACK_GRAD)) {
float m[4][4];
unit_m4(m);