[Bf-blender-cvs] [60ff71cc403] temp-eeveelightcache: Eevee: Lightcache: Add own gl context to the baking job
Clément Foucault
noreply at git.blender.org
Fri Jun 15 18:03:11 CEST 2018
Commit: 60ff71cc403bf0a3676d94e4bc79464400c7cee7
Author: Clément Foucault
Date: Wed Jun 13 14:19:04 2018 +0200
Branches: temp-eeveelightcache
https://developer.blender.org/rB60ff71cc403bf0a3676d94e4bc79464400c7cee7
Eevee: Lightcache: Add own gl context to the baking job
This is to follow the recent changes in how we handle gl context in
threads.
===================================================================
M source/blender/draw/DRW_engine.h
M source/blender/draw/engines/eevee/eevee_lightcache.c
M source/blender/draw/engines/eevee/eevee_lightcache.h
M source/blender/draw/engines/eevee/eevee_lightprobes.c
M source/blender/draw/engines/eevee/eevee_private.h
M source/blender/draw/intern/DRW_render.h
M source/blender/draw/intern/draw_manager.c
M source/blender/editors/render/render_shading.c
===================================================================
diff --git a/source/blender/draw/DRW_engine.h b/source/blender/draw/DRW_engine.h
index 524a94e5886..eb314f32ffd 100644
--- a/source/blender/draw/DRW_engine.h
+++ b/source/blender/draw/DRW_engine.h
@@ -133,6 +133,11 @@ void DRW_opengl_context_destroy(void);
void DRW_opengl_context_enable(void);
void DRW_opengl_context_disable(void);
+void DRW_opengl_render_context_enable(void *re_gl_context);
+void DRW_opengl_render_context_disable(void *re_gl_context);
+void DRW_gawain_render_context_enable(void *re_gwn_context);
+void DRW_gawain_render_context_disable(void *re_gwn_context);
+
void DRW_deferred_shader_remove(struct GPUMaterial *mat);
#endif /* __DRW_ENGINE_H__ */
diff --git a/source/blender/draw/engines/eevee/eevee_lightcache.c b/source/blender/draw/engines/eevee/eevee_lightcache.c
index e83b67110e0..6c8cfc06bac 100644
--- a/source/blender/draw/engines/eevee/eevee_lightcache.c
+++ b/source/blender/draw/engines/eevee/eevee_lightcache.c
@@ -40,10 +40,19 @@
#include "eevee_lightcache.h"
#include "eevee_private.h"
+#include "../../../intern/gawain/gawain/gwn_context.h"
+
+#include "WM_api.h"
+
/* TODO should be replace by a more elegant alternative. */
extern void DRW_opengl_context_enable(void);
extern void DRW_opengl_context_disable(void);
+extern void DRW_opengl_render_context_enable(void *re_gl_context);
+extern void DRW_opengl_render_context_disable(void *re_gl_context);
+extern void DRW_gawain_render_context_enable(void *re_gwn_context);
+extern void DRW_gawain_render_context_disable(void *re_gwn_context);
+
typedef struct EEVEE_LightBake {
Depsgraph *depsgraph;
ViewLayer *view_layer;
@@ -53,7 +62,8 @@ typedef struct EEVEE_LightBake {
Object *probe; /* Current probe being rendered. */
GPUTexture *rt_color; /* Target cube color texture. */
GPUTexture *rt_depth; /* Target cube depth texture. */
- GPUFrameBuffer *rt_fb; /* Target cube framebuffer. */
+ GPUFrameBuffer *rt_fb[6]; /* Target cube framebuffers. */
+ GPUFrameBuffer *store_fb; /* Storage framebuffer. */
int rt_res; /* Cube render target resolution. */
/* Shared */
@@ -82,33 +92,11 @@ typedef struct EEVEE_LightBake {
/* Dummy Textures */
struct GPUTexture *dummy_color, *dummy_depth;
struct GPUTexture *dummy_layer_color;
+
+ void *gl_context, *gwn_context; /* If running in parallel (in a separate thread), use this context. */
} EEVEE_LightBake;
-typedef struct EEVEE_LightCache {
- int flag;
- int refcount; /* Light cache can be shared across view layer. Use refcount to know when to free. */
-
- /* only a single cache for now */
- int cube_count, grid_count; /* Number of probes to use for rendering. */
- GPUTexture *grid_tex;
- GPUTexture *cube_tex;
- EEVEE_LightProbe *cube_data;
- EEVEE_LightGrid *grid_data;
-} EEVEE_LightCache;
-
-/* EEVEE_LightCache->flag */
-enum {
- LIGHTCACHE_BAKED = (1 << 0),
- LIGHTCACHE_BAKING = (1 << 1),
- LIGHTCACHE_CUBE_READY = (1 << 2),
- LIGHTCACHE_GRID_READY = (1 << 3),
- /* Update tagging */
- LIGHTCACHE_UPDATE_CUBE = (1 << 4),
- LIGHTCACHE_UPDATE_GRID = (1 << 5),
- LIGHTCACHE_UPDATE_WORLD = (1 << 6),
-};
-
-void *EEVEE_lightcache_job_data_alloc(struct Main *bmain, struct ViewLayer *view_layer, struct Scene *scene)
+void *EEVEE_lightcache_job_data_alloc(struct Main *bmain, struct ViewLayer *view_layer, struct Scene *scene, bool run_as_job)
{
EEVEE_LightBake *lbake = MEM_callocN(sizeof(EEVEE_LightBake), "EEVEE_LightBake");
@@ -116,6 +104,10 @@ void *EEVEE_lightcache_job_data_alloc(struct Main *bmain, struct ViewLayer *view
lbake->scene = scene;
lbake->bmain = bmain;
+ if (run_as_job) {
+ lbake->gl_context = WM_opengl_context_create();
+ }
+
DEG_graph_relations_update(lbake->depsgraph, bmain, scene, view_layer);
return lbake;
@@ -130,26 +122,26 @@ void EEVEE_lightcache_job_data_free(void *custom_data)
MEM_SAFE_FREE(lbake->cube_prb);
MEM_SAFE_FREE(lbake->grid_prb);
- DRW_TEXTURE_FREE_SAFE(lbake->rt_depth);
- DRW_TEXTURE_FREE_SAFE(lbake->rt_color);
- DRW_TEXTURE_FREE_SAFE(lbake->grid_prev);
-
MEM_freeN(lbake);
}
-static void eevee_lightcache_create_resources(SceneEEVEE *eevee, EEVEE_LightBake *lbake, EEVEE_LightCache *lcache)
+static void eevee_lightcache_create_resources(const SceneEEVEE *eevee, EEVEE_LightBake *lbake, EEVEE_LightCache *lcache)
{
- ViewLayer *view_layer = lbake->view_layer;
- EEVEE_ViewLayerData *sldata = EEVEE_view_layer_data_ensure_ex(lbake->view_layer);
-
lbake->bounce_count = eevee->gi_diffuse_bounces;
lbake->vis_res = eevee->gi_visibility_resolution;
lbake->rt_res = eevee->gi_cubemap_resolution;
/* TODO: Remove when multiple drawmanager/context are supported.
- * Currently this lock the viewport without any reason
+ * Currently this locks the viewport without any reason
* (resource creation can be done from another context). */
- DRW_opengl_context_enable();
+ if (lbake->gl_context) {
+ DRW_opengl_render_context_enable(lbake->gl_context);
+ lbake->gwn_context = GWN_context_create();
+ DRW_gawain_render_context_enable(lbake->gwn_context);
+ }
+ else {
+ DRW_opengl_context_enable();
+ }
//lbake->ref_cube_res = octahedral_from_cubemap();
lbake->ref_cube_res = lbake->rt_res;
@@ -159,9 +151,9 @@ static void eevee_lightcache_create_resources(SceneEEVEE *eevee, EEVEE_LightBake
lbake->rt_color = DRW_texture_create_cube(lbake->rt_res, GPU_RGBA16F, DRW_TEX_FILTER | DRW_TEX_MIPMAP, NULL);
for (int i = 0; i < 6; ++i) {
- GPU_framebuffer_ensure_config(&sldata->probe_face_fb[i], {
- GPU_ATTACHMENT_TEXTURE_CUBEFACE(sldata->probe_depth_rt, i),
- GPU_ATTACHMENT_TEXTURE_CUBEFACE(sldata->probe_rt, i)
+ GPU_framebuffer_ensure_config(&lbake->rt_fb[i], {
+ GPU_ATTACHMENT_TEXTURE_CUBEFACE(lbake->rt_depth, i),
+ GPU_ATTACHMENT_TEXTURE_CUBEFACE(lbake->rt_color, i)
});
}
@@ -179,37 +171,112 @@ static void eevee_lightcache_create_resources(SceneEEVEE *eevee, EEVEE_LightBake
lcache->grid_tex = DRW_texture_create_2D_array(irr_size[0], irr_size[1], irr_size[2], irradiance_format, DRW_TEX_FILTER, NULL);
lcache->cube_tex = DRW_texture_create_2D_array(lbake->ref_cube_res, lbake->ref_cube_res, lcache->cube_count, GPU_RGBA8, DRW_TEX_FILTER, NULL);
- /* TODO remove */
- DRW_opengl_context_disable();
+ if (lbake->gl_context) {
+ DRW_opengl_render_context_disable(lbake->gl_context);
+ DRW_gawain_render_context_disable(lbake->gwn_context);
+ }
+ else {
+ DRW_opengl_context_disable();
+ }
}
-static void eevee_lightcache_render_world(EEVEE_LightBake *UNUSED(lbake), EEVEE_LightCache *UNUSED(lcache))
+static void eevee_lightcache_delete_resources(EEVEE_LightBake *lbake)
{
- DRW_opengl_context_enable();
+ if (lbake->gl_context) {
+ DRW_opengl_render_context_enable(lbake->gl_context);
+ DRW_gawain_render_context_enable(lbake->gwn_context);
+ }
+ else {
+ DRW_opengl_context_enable();
+ }
- /* TODO DO SOMETHING HERE!!! */
+ DRW_TEXTURE_FREE_SAFE(lbake->rt_depth);
+ DRW_TEXTURE_FREE_SAFE(lbake->rt_color);
+ DRW_TEXTURE_FREE_SAFE(lbake->grid_prev);
- DRW_opengl_context_disable();
+ if (lbake->gl_context) {
+ /* Delete the baking context. */
+ DRW_gawain_render_context_disable(lbake->gwn_context);
+ DRW_gawain_render_context_enable(lbake->gwn_context);
+ GWN_context_discard(lbake->gwn_context);
+ DRW_opengl_render_context_disable(lbake->gl_context);
+ WM_opengl_context_dispose(lbake->gl_context);
+ lbake->gwn_context = NULL;
+ lbake->gl_context = NULL;
+ }
+ else {
+ DRW_opengl_context_disable();
+ }
}
-void EEVEE_lightcache_bake_job(void *custom_data, short *UNUSED(stop), short *UNUSED(do_update), float *UNUSED(progress))
+static void eevee_lightcache_context_enable(EEVEE_LightBake *lbake)
{
- EEVEE_LightBake *lbake = (EEVEE_LightBake *)custom_data;
- Depsgraph *depsgraph = lbake->depsgraph;
+ if (lbake->gl_context) {
+ DRW_opengl_render_context_enable(lbake->gl_context);
+ DRW_gawain_render_context_enable(lbake->gwn_context);
+ }
+ else {
+ DRW_opengl_context_enable();
+ }
+}
- int frame = 0; /* TODO make it user param. */
- DEG_evaluate_on_framechange(lbake->bmain, lbake->depsgraph, frame);
+static void eevee_lightcache_context_disable(EEVEE_LightBake *lbake)
+{
+ if (lbake->gl_context) {
+ DRW_opengl_render_context_disable(lbake->gl_context);
+ DRW_gawain_render_context_disable(lbake->gwn_context);
+ }
+ else {
+ DRW_opengl_context_disable();
+ }
+}
- ViewLayer *view_layer_ori = DEG_get_input_view_layer(lbake->depsgraph);
- const Scene *scene_eval = DEG_get_evaluated_scene(lbake->depsgraph);
+static void eevee_lightcache_render_world(void *ved, void *UNUSED(user_data))
+{
+ EEVEE_Data *vedata = (EEVEE_Data *)ved;
+ EEVEE_StorageList *stl = vedata->stl;
+ EEVEE_FramebufferList *fbl = vedata->fbl;
+ // EEVEE_LightBake *lbake = user_data;
+ EEVEE_ViewLayerData *sldata = EEVEE_view_layer_data_ensure();
+
+ EEVEE_materials_init(sldata, stl, fbl);
+ EEVEE_lights_init(sldata);
+ EEVEE_lightprobes_init(sldata, vedata);
+
+ EEVEE_lightprobes_cache_init(sldata, vedata);
+ EEVEE_lightprobes_refresh_world(sldata, vedata);
+}
- EEVEE_ViewLayerData *sldata_ori = EEVEE_view_layer_data_ensure_ex(view_layer_ori);
- EEVEE_LightCache *lcache = EEVEE_lightcache_ensure(sldata_ori);
+static void eevee_lightcache_render_probe(void *ved, void *UNUSED(user_data))
+{
+ EEVEE_Data *vedata = (EEVEE_Data *)ved;
+ EEVEE_StorageList *stl = vedata->stl;
+ EEVEE_FramebufferList *fbl = vedata->fbl;
+ // EEVEE_LightBake *lbake = user_data;
+ EEVEE_ViewLayerData *sldata = EEVEE_view_layer_data_ensure();
+
+ EEVEE_materials_init(sldata, stl, fbl);
+ EEVEE_lights_init(sldata);
+ EEVEE_lightprobes_init(sldata, vedata);
+
+ EEVEE_lightprobes_cache_init(sldata, vedata);
+ EEVEE_lights_cache_init(sldata, vedata);
+ EEVEE_materials_cache_init(sldata, vedata);
+
+ /* Disable specular lighting when rendering probes to avoid feedback loops (looks bad).
+ * Disable AO until we find a way to hide really bad discontinuities between cubefaces. */
+ // common_data->spec_toggle = false;
+ // common_data->ssr_toggle = false;
+ // common_data->sss_toggle = false;
+ // common_data->ao_settings = 0.0f;
+
@@ Diff output truncated at 10240 characters. @@
More information about the Bf-blender-cvs
mailing list