| 584 | log::message(log::level::info, "Destroyed runtime environment on runtime %p ('%s').", this, _config_path.u8string().c_str()); |
| 585 | } |
| 586 | void reshade::runtime::on_present() |
| 587 | { |
| 588 | if (!_is_initialized) |
| 589 | return; |
| 590 | |
| 591 | #if RESHADE_ADDON |
| 592 | _is_in_present_call = true; |
| 593 | #endif |
| 594 | |
| 595 | api::command_list *const cmd_list = _graphics_queue->get_immediate_command_list(); |
| 596 | |
| 597 | capture_state(cmd_list, _app_state); |
| 598 | |
| 599 | uint32_t back_buffer_index = (_back_buffer_resolved != 0 ? 2 : 0) + _swapchain->get_current_back_buffer_index() * 2; |
| 600 | const api::resource back_buffer_resource = _device->get_resource_from_view(_back_buffer_targets[back_buffer_index]); |
| 601 | |
| 602 | // Resolve MSAA back buffer if MSAA is active or copy when format conversion is required |
| 603 | if (_back_buffer_resolved != 0) |
| 604 | { |
| 605 | if (_back_buffer_samples == 1) |
| 606 | { |
| 607 | cmd_list->barrier(back_buffer_resource, api::resource_usage::present, api::resource_usage::copy_source); |
| 608 | cmd_list->copy_texture_region(back_buffer_resource, 0, nullptr, _back_buffer_resolved, 0, nullptr); |
| 609 | cmd_list->barrier(_back_buffer_resolved, api::resource_usage::copy_dest, api::resource_usage::render_target); |
| 610 | } |
| 611 | else |
| 612 | { |
| 613 | cmd_list->barrier(back_buffer_resource, api::resource_usage::present, api::resource_usage::resolve_source); |
| 614 | cmd_list->resolve_texture_region(back_buffer_resource, 0, nullptr, _back_buffer_resolved, 0, 0, 0, 0, _back_buffer_format); |
| 615 | cmd_list->barrier(_back_buffer_resolved, api::resource_usage::resolve_dest, api::resource_usage::render_target); |
| 616 | } |
| 617 | } |
| 618 | |
| 619 | // Lock input so it cannot be modified by other threads while we are reading it here |
| 620 | std::unique_lock<std::recursive_mutex> input_lock; |
| 621 | if (_input != nullptr) |
| 622 | input_lock = _input->lock(); |
| 623 | |
| 624 | update_effects(); |
| 625 | |
| 626 | _current_time = std::chrono::system_clock::now(); |
| 627 | |
| 628 | if (_should_save_screenshot && _screenshot_save_before && _effects_enabled && !_effects_rendered_this_frame) |
| 629 | save_screenshot("Before"); |
| 630 | |
| 631 | if (!is_loading() && !_techniques.empty()) |
| 632 | { |
| 633 | if (_back_buffer_resolved != 0) |
| 634 | { |
| 635 | runtime::render_effects(cmd_list, _back_buffer_targets[0], _back_buffer_targets[1]); |
| 636 | } |
| 637 | else |
| 638 | { |
| 639 | cmd_list->barrier(back_buffer_resource, api::resource_usage::present, api::resource_usage::render_target); |
| 640 | runtime::render_effects(cmd_list, _back_buffer_targets[back_buffer_index], _back_buffer_targets[back_buffer_index + 1]); |
| 641 | cmd_list->barrier(back_buffer_resource, api::resource_usage::render_target, api::resource_usage::present); |
| 642 | } |
| 643 | } |
no test coverage detected