Changeset View
Changeset View
Standalone View
Standalone View
source/blender/draw/engines/eevee_next/eevee_engine.cc
| Show First 20 Lines • Show All 134 Lines • ▼ Show 20 Lines | |||||
| static void eevee_instance_free(void *instance) | static void eevee_instance_free(void *instance) | ||||
| { | { | ||||
| if (!GPU_shader_storage_buffer_objects_support()) { | if (!GPU_shader_storage_buffer_objects_support()) { | ||||
| return; | return; | ||||
| } | } | ||||
| delete reinterpret_cast<eevee::Instance *>(instance); | delete reinterpret_cast<eevee::Instance *>(instance); | ||||
| } | } | ||||
| static void eevee_render_to_image(void *UNUSED(vedata), | static void eevee_render_to_image(void *vedata, | ||||
| struct RenderEngine *engine, | struct RenderEngine *engine, | ||||
| struct RenderLayer *layer, | struct RenderLayer *layer, | ||||
| const struct rcti *UNUSED(rect)) | const struct rcti *UNUSED(rect)) | ||||
| { | { | ||||
| if (!GPU_shader_storage_buffer_objects_support()) { | if (!GPU_shader_storage_buffer_objects_support()) { | ||||
| return; | return; | ||||
| } | } | ||||
| eevee::Instance *instance = new eevee::Instance(); | eevee::Instance *instance = new eevee::Instance(); | ||||
| Render *render = engine->re; | Render *render = engine->re; | ||||
| Depsgraph *depsgraph = DRW_context_state_get()->depsgraph; | Depsgraph *depsgraph = DRW_context_state_get()->depsgraph; | ||||
| Object *camera_original_ob = RE_GetCamera(engine->re); | Object *camera_original_ob = RE_GetCamera(engine->re); | ||||
| const char *viewname = RE_GetActiveRenderView(engine->re); | const char *viewname = RE_GetActiveRenderView(engine->re); | ||||
| int size[2] = {engine->resolution_x, engine->resolution_y}; | int size[2] = {engine->resolution_x, engine->resolution_y}; | ||||
| rctf view_rect; | rctf view_rect; | ||||
| rcti rect; | rcti rect; | ||||
| RE_GetViewPlane(render, &view_rect, &rect); | RE_GetViewPlane(render, &view_rect, &rect); | ||||
| instance->init(size, &rect, engine, depsgraph, nullptr, camera_original_ob, layer); | instance->init(size, &rect, engine, depsgraph, nullptr, camera_original_ob, layer); | ||||
| instance->render_frame(layer, viewname); | instance->render_frame(layer, viewname); | ||||
| delete instance; | EEVEE_Data *ved = static_cast<EEVEE_Data *>(vedata); | ||||
| if (ved->instance) { | |||||
| delete ved->instance; | |||||
| } | |||||
| ved->instance = instance; | |||||
| } | } | ||||
fclem: This is kind-of weird. I would like a comment explaining why we need that. | |||||
| static void eevee_render_update_passes(RenderEngine *engine, Scene *scene, ViewLayer *view_layer) | static void eevee_store_metadata(void *vedata, struct RenderResult *render_result) | ||||
| { | { | ||||
| if (!GPU_shader_storage_buffer_objects_support()) { | if (!GPU_shader_storage_buffer_objects_support()) { | ||||
| return; | return; | ||||
| } | } | ||||
| EEVEE_Data *ved = static_cast<EEVEE_Data *>(vedata); | |||||
| RE_engine_register_pass(engine, scene, view_layer, RE_PASSNAME_COMBINED, 4, "RGBA", SOCK_RGBA); | eevee::Instance *instance = ved->instance; | ||||
| instance->store_metadata(render_result); | |||||
| #define CHECK_PASS_LEGACY(name, type, channels, chanid) \ | delete instance; | ||||
| if (view_layer->passflag & (SCE_PASS_##name)) { \ | ved->instance = nullptr; | ||||
| RE_engine_register_pass( \ | |||||
| engine, scene, view_layer, RE_PASSNAME_##name, channels, chanid, type); \ | |||||
| } \ | |||||
| ((void)0) | |||||
| #define CHECK_PASS_EEVEE(name, type, channels, chanid) \ | |||||
| if (view_layer->eevee.render_passes & (EEVEE_RENDER_PASS_##name)) { \ | |||||
| RE_engine_register_pass( \ | |||||
| engine, scene, view_layer, RE_PASSNAME_##name, channels, chanid, type); \ | |||||
| } \ | |||||
| ((void)0) | |||||
| CHECK_PASS_LEGACY(Z, SOCK_FLOAT, 1, "Z"); | |||||
| CHECK_PASS_LEGACY(MIST, SOCK_FLOAT, 1, "Z"); | |||||
| CHECK_PASS_LEGACY(NORMAL, SOCK_VECTOR, 3, "XYZ"); | |||||
| CHECK_PASS_LEGACY(DIFFUSE_DIRECT, SOCK_RGBA, 3, "RGB"); | |||||
| CHECK_PASS_LEGACY(DIFFUSE_COLOR, SOCK_RGBA, 3, "RGB"); | |||||
| CHECK_PASS_LEGACY(GLOSSY_DIRECT, SOCK_RGBA, 3, "RGB"); | |||||
| CHECK_PASS_LEGACY(GLOSSY_COLOR, SOCK_RGBA, 3, "RGB"); | |||||
| CHECK_PASS_EEVEE(VOLUME_LIGHT, SOCK_RGBA, 3, "RGB"); | |||||
| CHECK_PASS_LEGACY(EMIT, SOCK_RGBA, 3, "RGB"); | |||||
| CHECK_PASS_LEGACY(ENVIRONMENT, SOCK_RGBA, 3, "RGB"); | |||||
| /* TODO: CHECK_PASS_LEGACY(SHADOW, SOCK_RGBA, 3, "RGB"); | |||||
| * CHECK_PASS_LEGACY(AO, SOCK_RGBA, 3, "RGB"); | |||||
| * When available they should be converted from Value textures to RGB. */ | |||||
| LISTBASE_FOREACH (ViewLayerAOV *, aov, &view_layer->aovs) { | |||||
| if ((aov->flag & AOV_CONFLICT) != 0) { | |||||
| continue; | |||||
| } | |||||
| switch (aov->type) { | |||||
| case AOV_TYPE_COLOR: | |||||
| RE_engine_register_pass(engine, scene, view_layer, aov->name, 4, "RGBA", SOCK_RGBA); | |||||
| break; | |||||
| case AOV_TYPE_VALUE: | |||||
| RE_engine_register_pass(engine, scene, view_layer, aov->name, 1, "X", SOCK_FLOAT); | |||||
| break; | |||||
| default: | |||||
| break; | |||||
| } | } | ||||
| static void eevee_render_update_passes(RenderEngine *engine, Scene *scene, ViewLayer *view_layer) | |||||
| { | |||||
| if (!GPU_shader_storage_buffer_objects_support()) { | |||||
| return; | |||||
| } | } | ||||
| eevee::Instance::update_passes(engine, scene, view_layer); | |||||
| } | } | ||||
| static const DrawEngineDataSize eevee_data_size = DRW_VIEWPORT_DATA_SIZE(EEVEE_Data); | static const DrawEngineDataSize eevee_data_size = DRW_VIEWPORT_DATA_SIZE(EEVEE_Data); | ||||
| extern "C" { | extern "C" { | ||||
| DrawEngineType draw_engine_eevee_next_type = { | DrawEngineType draw_engine_eevee_next_type = { | ||||
| nullptr, | nullptr, | ||||
| nullptr, | nullptr, | ||||
| N_("Eevee"), | N_("Eevee"), | ||||
| &eevee_data_size, | &eevee_data_size, | ||||
| &eevee_engine_init, | &eevee_engine_init, | ||||
| &eevee_engine_free, | &eevee_engine_free, | ||||
| &eevee_instance_free, | &eevee_instance_free, | ||||
| &eevee_cache_init, | &eevee_cache_init, | ||||
| &eevee_cache_populate, | &eevee_cache_populate, | ||||
| &eevee_cache_finish, | &eevee_cache_finish, | ||||
| &eevee_draw_scene, | &eevee_draw_scene, | ||||
| nullptr, | nullptr, | ||||
| nullptr, | nullptr, | ||||
| &eevee_render_to_image, | &eevee_render_to_image, | ||||
| nullptr, | &eevee_store_metadata, | ||||
| }; | }; | ||||
| RenderEngineType DRW_engine_viewport_eevee_next_type = { | RenderEngineType DRW_engine_viewport_eevee_next_type = { | ||||
| nullptr, | nullptr, | ||||
| nullptr, | nullptr, | ||||
| "BLENDER_EEVEE_NEXT", | "BLENDER_EEVEE_NEXT", | ||||
| N_("Eevee Next"), | N_("Eevee Next"), | ||||
| RE_INTERNAL | RE_USE_PREVIEW | RE_USE_STEREO_VIEWPORT | RE_USE_GPU_CONTEXT, | RE_INTERNAL | RE_USE_PREVIEW | RE_USE_STEREO_VIEWPORT | RE_USE_GPU_CONTEXT, | ||||
| Show All 13 Lines | |||||
This is kind-of weird. I would like a comment explaining why we need that.