| 255 | } |
| 256 | |
| 257 | bool reshade::runtime::on_init() |
| 258 | { |
| 259 | assert(!_is_initialized); |
| 260 | |
| 261 | const api::resource_desc back_buffer_desc = _device->get_resource_desc(_swapchain->get_back_buffer(0)); |
| 262 | |
| 263 | // Avoid initializing on very small swap chains (e.g. implicit swap chain in The Sims 4, which is not used to present in windowed mode) |
| 264 | if (back_buffer_desc.texture.width <= 16 && back_buffer_desc.texture.height <= 16) |
| 265 | return false; |
| 266 | |
| 267 | _width = back_buffer_desc.texture.width; |
| 268 | _height = back_buffer_desc.texture.height; |
| 269 | _back_buffer_format = api::format_to_default_typed(back_buffer_desc.texture.format); |
| 270 | _back_buffer_samples = back_buffer_desc.texture.samples; |
| 271 | _back_buffer_color_space = _swapchain->get_color_space(); |
| 272 | |
| 273 | // Create resolve texture and copy pipeline (do this before creating effect resources, to ensure correct back buffer format is set up) |
| 274 | if (back_buffer_desc.texture.samples > 1 || |
| 275 | // Always use resolve texture in OpenGL to flip vertically and support sRGB + binding effect stencil |
| 276 | (_device->get_api() == api::device_api::opengl && !_is_vr) || |
| 277 | // Some effects rely on there being an alpha channel available, so create resolve texture if that is not the case |
| 278 | (_back_buffer_format == api::format::r8g8b8x8_unorm || _back_buffer_format == api::format::b8g8r8x8_unorm)) |
| 279 | { |
| 280 | switch (_back_buffer_format) |
| 281 | { |
| 282 | case api::format::r8g8b8x8_unorm: |
| 283 | _back_buffer_format = api::format::r8g8b8a8_unorm; |
| 284 | break; |
| 285 | case api::format::b8g8r8x8_unorm: |
| 286 | _back_buffer_format = api::format::b8g8r8a8_unorm; |
| 287 | break; |
| 288 | } |
| 289 | |
| 290 | const bool need_copy_pipeline = |
| 291 | _device->get_api() == api::device_api::d3d10 || |
| 292 | _device->get_api() == api::device_api::d3d11 || |
| 293 | _device->get_api() == api::device_api::d3d12; |
| 294 | |
| 295 | api::resource_usage usage = api::resource_usage::render_target | api::resource_usage::copy_dest | api::resource_usage::resolve_dest; |
| 296 | if (need_copy_pipeline) |
| 297 | usage |= api::resource_usage::shader_resource; |
| 298 | else |
| 299 | usage |= api::resource_usage::copy_source; |
| 300 | |
| 301 | if (!_device->create_resource( |
| 302 | api::resource_desc(_width, _height, 1, 1, api::format_to_typeless(_back_buffer_format), 1, api::memory_heap::gpu_only, usage), |
| 303 | nullptr, back_buffer_desc.texture.samples == 1 ? api::resource_usage::copy_dest : api::resource_usage::resolve_dest, &_back_buffer_resolved) || |
| 304 | !_device->create_resource_view( |
| 305 | _back_buffer_resolved, |
| 306 | api::resource_usage::render_target, |
| 307 | api::resource_view_desc(api::format_to_default_typed(_back_buffer_format, 0)), |
| 308 | &_back_buffer_targets.emplace_back()) || |
| 309 | !_device->create_resource_view( |
| 310 | _back_buffer_resolved, |
| 311 | api::resource_usage::render_target, |
| 312 | api::resource_view_desc(api::format_to_default_typed(_back_buffer_format, 1)), |
| 313 | &_back_buffer_targets.emplace_back())) |
| 314 | { |
no test coverage detected