WIP: eevee-next-world-irradiance #108304
|
@ -16,15 +16,8 @@
|
||||||
#include "DEG_depsgraph_build.h"
|
#include "DEG_depsgraph_build.h"
|
||||||
#include "DEG_depsgraph_query.h"
|
#include "DEG_depsgraph_query.h"
|
||||||
|
|
||||||
#include "BKE_object.h"
|
|
||||||
|
|
||||||
#include "DNA_collection_types.h"
|
|
||||||
#include "DNA_lightprobe_types.h"
|
|
||||||
|
|
||||||
#include "PIL_time.h"
|
#include "PIL_time.h"
|
||||||
|
|
||||||
#include "eevee_lightcache.h"
|
|
||||||
|
|
||||||
#include "GPU_capabilities.h"
|
#include "GPU_capabilities.h"
|
||||||
#include "GPU_context.h"
|
#include "GPU_context.h"
|
||||||
|
|
||||||
|
@ -35,19 +28,14 @@
|
||||||
|
|
||||||
#include "wm_window.h"
|
#include "wm_window.h"
|
||||||
|
|
||||||
|
#include "eevee_instance.hh"
|
||||||
|
|
||||||
|
#include "eevee_lightcache.h"
|
||||||
|
|
||||||
/* -------------------------------------------------------------------- */
|
/* -------------------------------------------------------------------- */
|
||||||
/** \name Light Probe Baking
|
/** \name Light Probe Baking
|
||||||
* \{ */
|
* \{ */
|
||||||
|
|
||||||
/* 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_gpu_render_context_enable(void *re_gpu_context);
|
|
||||||
extern void DRW_gpu_render_context_disable(void *re_gpu_context);
|
|
||||||
|
|
||||||
namespace blender::eevee {
|
namespace blender::eevee {
|
||||||
|
|
||||||
class LightBake {
|
class LightBake {
|
||||||
|
@ -64,8 +52,11 @@ class LightBake {
|
||||||
* Created on main thread but first bound in worker thread.
|
* Created on main thread but first bound in worker thread.
|
||||||
*/
|
*/
|
||||||
void *gl_context_ = nullptr;
|
void *gl_context_ = nullptr;
|
||||||
/** GPUContext associated to `gl_context_`. Created in the worker thread. */
|
/** Context associated to `gl_context_`. Created in the worker thread. */
|
||||||
void *gpu_context_ = nullptr;
|
GPUContext *gpu_context_ = nullptr;
|
||||||
|
|
||||||
|
/** Baking instance. Created and freed in the worker thread. */
|
||||||
|
Instance *instance_ = nullptr;
|
||||||
|
|
||||||
public:
|
public:
|
||||||
LightBake(struct Main *bmain,
|
LightBake(struct Main *bmain,
|
||||||
|
@ -84,13 +75,11 @@ class LightBake {
|
||||||
gl_context_ = WM_opengl_context_create();
|
gl_context_ = WM_opengl_context_create();
|
||||||
wm_window_reset_drawable();
|
wm_window_reset_drawable();
|
||||||
}
|
}
|
||||||
std::cout << "Create" << std::endl;
|
|
||||||
}
|
}
|
||||||
|
|
||||||
~LightBake()
|
~LightBake()
|
||||||
{
|
{
|
||||||
BLI_assert(BLI_thread_is_main());
|
BLI_assert(BLI_thread_is_main());
|
||||||
std::cout << "Delete" << std::endl;
|
|
||||||
DEG_graph_free(depsgraph_);
|
DEG_graph_free(depsgraph_);
|
||||||
}
|
}
|
||||||
|
|
||||||
|
@ -103,7 +92,6 @@ class LightBake {
|
||||||
void update()
|
void update()
|
||||||
{
|
{
|
||||||
BLI_assert(BLI_thread_is_main());
|
BLI_assert(BLI_thread_is_main());
|
||||||
std::cout << "update" << std::endl;
|
|
||||||
}
|
}
|
||||||
|
|
||||||
/**
|
/**
|
||||||
|
@ -117,18 +105,62 @@ class LightBake {
|
||||||
DEG_evaluate_on_framechange(depsgraph_, frame_);
|
DEG_evaluate_on_framechange(depsgraph_, frame_);
|
||||||
|
|
||||||
PIL_sleep_ms(1000);
|
PIL_sleep_ms(1000);
|
||||||
std::cout << "run" << std::endl;
|
|
||||||
|
context_enable();
|
||||||
|
|
||||||
|
instance_ = new eevee::Instance();
|
||||||
|
|
||||||
|
context_disable();
|
||||||
|
|
||||||
delete_resources();
|
delete_resources();
|
||||||
}
|
}
|
||||||
|
|
||||||
private:
|
private:
|
||||||
void context_enable()
|
void context_enable(bool render_begin = true)
|
||||||
{
|
{
|
||||||
|
if (GPU_use_main_context_workaround() && !BLI_thread_is_main()) {
|
||||||
|
/* Reuse main draw context. */
|
||||||
|
GPU_context_main_lock();
|
||||||
|
DRW_opengl_context_enable();
|
||||||
|
}
|
||||||
|
else if (gl_context_ == nullptr) {
|
||||||
|
/* Main thread case. */
|
||||||
|
DRW_opengl_context_enable();
|
||||||
|
}
|
||||||
|
else {
|
||||||
|
/* Worker thread case. */
|
||||||
|
DRW_opengl_render_context_enable(gl_context_);
|
||||||
|
if (gpu_context_ == nullptr) {
|
||||||
|
/* Create GPUContext in worker thread as it needs the correct gl context bound (which can
|
||||||
|
* only be bound in worker thread because of some GL driver requirements). */
|
||||||
|
gpu_context_ = GPU_context_create(nullptr, gl_context_);
|
||||||
|
}
|
||||||
|
DRW_gpu_render_context_enable(gpu_context_);
|
||||||
|
}
|
||||||
|
|
||||||
|
if (render_begin) {
|
||||||
|
GPU_render_begin();
|
||||||
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
void context_disable()
|
void context_disable()
|
||||||
{
|
{
|
||||||
|
GPU_render_end();
|
||||||
|
|
||||||
|
if (GPU_use_main_context_workaround() && !BLI_thread_is_main()) {
|
||||||
|
/* Reuse main draw context. */
|
||||||
|
DRW_opengl_context_disable();
|
||||||
|
GPU_context_main_unlock();
|
||||||
|
}
|
||||||
|
else if (gl_context_ == nullptr) {
|
||||||
|
/* Main thread case. */
|
||||||
|
DRW_opengl_context_disable();
|
||||||
|
}
|
||||||
|
else {
|
||||||
|
/* Worker thread case. */
|
||||||
|
DRW_gpu_render_context_disable(gpu_context_);
|
||||||
|
DRW_opengl_render_context_disable(gl_context_);
|
||||||
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
/**
|
/**
|
||||||
|
@ -139,6 +171,30 @@ class LightBake {
|
||||||
*/
|
*/
|
||||||
void delete_resources()
|
void delete_resources()
|
||||||
{
|
{
|
||||||
|
/* Bind context without GPU_render_begin(). */
|
||||||
|
context_enable(false);
|
||||||
|
|
||||||
|
/* Free instance and its resources (Textures, Framebuffers, etc...). */
|
||||||
|
delete instance_;
|
||||||
|
|
||||||
|
/* Delete / unbind the GL & GPU context. Assumes it is currently bound. */
|
||||||
|
if (GPU_use_main_context_workaround() && !BLI_thread_is_main()) {
|
||||||
|
/* Reuse main draw context. */
|
||||||
|
DRW_opengl_context_disable();
|
||||||
|
GPU_context_main_unlock();
|
||||||
|
}
|
||||||
|
else if (gl_context_ == nullptr) {
|
||||||
|
/* Main thread case. */
|
||||||
|
DRW_opengl_context_disable();
|
||||||
|
}
|
||||||
|
else {
|
||||||
|
/* Worker thread case. */
|
||||||
|
if (gpu_context_ != nullptr) {
|
||||||
|
GPU_context_discard(gpu_context_);
|
||||||
|
}
|
||||||
|
DRW_opengl_render_context_disable(gl_context_);
|
||||||
|
WM_opengl_context_dispose(gl_context_);
|
||||||
|
}
|
||||||
}
|
}
|
||||||
};
|
};
|
||||||
|
|
||||||
|
|
Loading…
Reference in New Issue