CINXE.COM
GitHub - RenderKit/oidn: Intel® Open Image Denoise library
<!DOCTYPE html> <html lang="en" data-color-mode="auto" data-light-theme="light" data-dark-theme="dark" data-a11y-animated-images="system" data-a11y-link-underlines="true" > <head> <meta charset="utf-8"> <link rel="dns-prefetch" href="https://github.githubassets.com"> <link rel="dns-prefetch" href="https://avatars.githubusercontent.com"> <link rel="dns-prefetch" href="https://github-cloud.s3.amazonaws.com"> <link rel="dns-prefetch" href="https://user-images.githubusercontent.com/"> <link rel="preconnect" href="https://github.githubassets.com" crossorigin> <link rel="preconnect" href="https://avatars.githubusercontent.com"> <link crossorigin="anonymous" media="all" rel="stylesheet" href="https://github.githubassets.com/assets/light-3e154969b9f9.css" /><link crossorigin="anonymous" media="all" rel="stylesheet" href="https://github.githubassets.com/assets/dark-9c5b7a476542.css" /><link data-color-theme="dark_dimmed" crossorigin="anonymous" media="all" rel="stylesheet" data-href="https://github.githubassets.com/assets/dark_dimmed-afda8eb0fb33.css" /><link data-color-theme="dark_high_contrast" crossorigin="anonymous" media="all" rel="stylesheet" data-href="https://github.githubassets.com/assets/dark_high_contrast-2494e44ccdc5.css" /><link data-color-theme="dark_colorblind" crossorigin="anonymous" media="all" rel="stylesheet" data-href="https://github.githubassets.com/assets/dark_colorblind-56fff47acadc.css" /><link data-color-theme="light_colorblind" crossorigin="anonymous" media="all" rel="stylesheet" data-href="https://github.githubassets.com/assets/light_colorblind-71cd4cc132ec.css" /><link data-color-theme="light_high_contrast" crossorigin="anonymous" media="all" rel="stylesheet" data-href="https://github.githubassets.com/assets/light_high_contrast-fd5499848985.css" /><link data-color-theme="light_tritanopia" crossorigin="anonymous" media="all" rel="stylesheet" data-href="https://github.githubassets.com/assets/light_tritanopia-31d17ba3e139.css" /><link data-color-theme="dark_tritanopia" crossorigin="anonymous" media="all" rel="stylesheet" data-href="https://github.githubassets.com/assets/dark_tritanopia-68d6b2c79663.css" /> <link crossorigin="anonymous" media="all" rel="stylesheet" href="https://github.githubassets.com/assets/primer-primitives-4cf0d59ab51a.css" /> <link crossorigin="anonymous" media="all" rel="stylesheet" href="https://github.githubassets.com/assets/primer-af846850481e.css" /> <link crossorigin="anonymous" media="all" rel="stylesheet" href="https://github.githubassets.com/assets/global-8b10f05a77e6.css" /> <link crossorigin="anonymous" media="all" rel="stylesheet" href="https://github.githubassets.com/assets/github-2f6e722088eb.css" /> <link crossorigin="anonymous" media="all" rel="stylesheet" href="https://github.githubassets.com/assets/repository-9c77ed90200e.css" /> <link crossorigin="anonymous" media="all" rel="stylesheet" href="https://github.githubassets.com/assets/code-a0610fd00b47.css" /> <script type="application/json" id="client-env">{"locale":"en","featureFlags":["copilot_new_references_ui","copilot_beta_features_opt_in","copilot_chat_static_thread_suggestions","copilot_conversational_ux_history_refs","copilot_implicit_context","copilot_smell_icebreaker_ux","experimentation_azure_variant_endpoint","failbot_handle_non_errors","geojson_azure_maps","ghost_pilot_confidence_truncation_25","ghost_pilot_confidence_truncation_40","hovercard_accessibility","issues_react_new_timeline","issues_react_avatar_refactor","issues_react_remove_placeholders","issues_react_blur_item_picker_on_close","marketing_pages_search_explore_provider","react_keyboard_shortcuts_dialog","remove_child_patch","sample_network_conn_type","site_metered_billing_update","issues_react_first_time_contribution_banner","lifecycle_label_name_updates"]}</script> <script crossorigin="anonymous" defer="defer" type="application/javascript" src="https://github.githubassets.com/assets/wp-runtime-6657579a8825.js"></script> <script crossorigin="anonymous" defer="defer" type="application/javascript" src="https://github.githubassets.com/assets/vendors-node_modules_dompurify_dist_purify_js-b73fdff77a4e.js"></script> <script crossorigin="anonymous" defer="defer" type="application/javascript" src="https://github.githubassets.com/assets/vendors-node_modules_oddbird_popover-polyfill_dist_popover_js-aff936e590ed.js"></script> <script crossorigin="anonymous" defer="defer" type="application/javascript" src="https://github.githubassets.com/assets/vendors-node_modules_github_arianotify-polyfill_ariaNotify-polyfill_js-node_modules_github_mi-247092-740e4ddd559d.js"></script> <script crossorigin="anonymous" defer="defer" type="application/javascript" src="https://github.githubassets.com/assets/ui_packages_failbot_failbot_ts-93b6a0551aa9.js"></script> <script crossorigin="anonymous" defer="defer" type="application/javascript" src="https://github.githubassets.com/assets/environment-cd35650c2e9c.js"></script> <script crossorigin="anonymous" defer="defer" type="application/javascript" src="https://github.githubassets.com/assets/vendors-node_modules_primer_behaviors_dist_esm_index_mjs-4aa4b0e95669.js"></script> <script crossorigin="anonymous" defer="defer" type="application/javascript" src="https://github.githubassets.com/assets/vendors-node_modules_github_selector-observer_dist_index_esm_js-f690fd9ae3d5.js"></script> <script crossorigin="anonymous" defer="defer" type="application/javascript" src="https://github.githubassets.com/assets/vendors-node_modules_github_relative-time-element_dist_index_js-6d3967acd51c.js"></script> <script crossorigin="anonymous" defer="defer" type="application/javascript" src="https://github.githubassets.com/assets/vendors-node_modules_github_combobox-nav_dist_index_js-node_modules_github_g-emoji-element_di-6ce195-53781cbc550f.js"></script> <script crossorigin="anonymous" defer="defer" type="application/javascript" src="https://github.githubassets.com/assets/vendors-node_modules_github_auto-complete-element_dist_index_js-node_modules_github_catalyst_-6afc16-3cdfa69a0406.js"></script> <script crossorigin="anonymous" defer="defer" type="application/javascript" src="https://github.githubassets.com/assets/vendors-node_modules_github_text-expander-element_dist_index_js-f5498b8d4e5d.js"></script> <script crossorigin="anonymous" defer="defer" type="application/javascript" src="https://github.githubassets.com/assets/vendors-node_modules_github_filter-input-element_dist_index_js-node_modules_github_remote-inp-b5f1d7-492b5042c841.js"></script> <script crossorigin="anonymous" defer="defer" type="application/javascript" src="https://github.githubassets.com/assets/vendors-node_modules_github_mini-throttle_dist_index_js-node_modules_stacktrace-parser_dist_s-1f651a-1e3d784c897c.js"></script> <script crossorigin="anonymous" defer="defer" type="application/javascript" src="https://github.githubassets.com/assets/vendors-node_modules_github_file-attachment-element_dist_index_js-node_modules_primer_view-co-7671f1-dc6cac136d88.js"></script> <script crossorigin="anonymous" defer="defer" type="application/javascript" src="https://github.githubassets.com/assets/github-elements-71486356f507.js"></script> <script crossorigin="anonymous" defer="defer" type="application/javascript" src="https://github.githubassets.com/assets/element-registry-e3ab8405ef80.js"></script> <script crossorigin="anonymous" defer="defer" type="application/javascript" src="https://github.githubassets.com/assets/vendors-node_modules_braintree_browser-detection_dist_browser-detection_js-node_modules_githu-bb80ec-634de60bacfa.js"></script> <script crossorigin="anonymous" defer="defer" type="application/javascript" src="https://github.githubassets.com/assets/vendors-node_modules_lit-html_lit-html_js-ce7225a304c5.js"></script> <script crossorigin="anonymous" defer="defer" type="application/javascript" src="https://github.githubassets.com/assets/vendors-node_modules_github_hydro-analytics-client_dist_analytics-client_js-node_modules_gith-f3aee1-e6893db9c19e.js"></script> <script crossorigin="anonymous" defer="defer" type="application/javascript" src="https://github.githubassets.com/assets/vendors-node_modules_github_mini-throttle_dist_index_js-node_modules_morphdom_dist_morphdom-e-7c534c-f8a5485c982a.js"></script> <script crossorigin="anonymous" defer="defer" type="application/javascript" src="https://github.githubassets.com/assets/vendors-node_modules_github_turbo_dist_turbo_es2017-esm_js-858e043fcf76.js"></script> <script crossorigin="anonymous" defer="defer" type="application/javascript" src="https://github.githubassets.com/assets/vendors-node_modules_github_remote-form_dist_index_js-node_modules_delegated-events_dist_inde-893f9f-6cf3320416b8.js"></script> <script crossorigin="anonymous" defer="defer" type="application/javascript" src="https://github.githubassets.com/assets/vendors-node_modules_scroll-anchoring_dist_scroll-anchoring_esm_js-node_modules_stacktrace-pa-a71630-6f3c4f0189d8.js"></script> <script crossorigin="anonymous" defer="defer" type="application/javascript" src="https://github.githubassets.com/assets/vendors-node_modules_color-convert_index_js-0e07cc183eed.js"></script> <script crossorigin="anonymous" defer="defer" type="application/javascript" src="https://github.githubassets.com/assets/vendors-node_modules_github_quote-selection_dist_index_js-node_modules_github_session-resume_-0b5e12-889cec8cf448.js"></script> <script crossorigin="anonymous" defer="defer" type="application/javascript" src="https://github.githubassets.com/assets/ui_packages_updatable-content_updatable-content_ts-eae9df0dd562.js"></script> <script crossorigin="anonymous" defer="defer" type="application/javascript" src="https://github.githubassets.com/assets/app_assets_modules_github_behaviors_task-list_ts-app_assets_modules_github_sso_ts-ui_packages-900dde-18d1c91a7872.js"></script> <script crossorigin="anonymous" defer="defer" type="application/javascript" src="https://github.githubassets.com/assets/app_assets_modules_github_sticky-scroll-into-view_ts-7cbef09a422c.js"></script> <script crossorigin="anonymous" defer="defer" type="application/javascript" src="https://github.githubassets.com/assets/app_assets_modules_github_behaviors_ajax-error_ts-app_assets_modules_github_behaviors_include-d0d0a6-0e9fa537dc4f.js"></script> <script crossorigin="anonymous" defer="defer" type="application/javascript" src="https://github.githubassets.com/assets/app_assets_modules_github_behaviors_commenting_edit_ts-app_assets_modules_github_behaviors_ht-83c235-c89801ebbe15.js"></script> <script crossorigin="anonymous" defer="defer" type="application/javascript" src="https://github.githubassets.com/assets/behaviors-a6e4c4c86bfa.js"></script> <script crossorigin="anonymous" defer="defer" type="application/javascript" src="https://github.githubassets.com/assets/vendors-node_modules_delegated-events_dist_index_js-node_modules_github_catalyst_lib_index_js-f6223d90c7ba.js"></script> <script crossorigin="anonymous" defer="defer" type="application/javascript" src="https://github.githubassets.com/assets/notifications-global-3366f6b6298e.js"></script> <script crossorigin="anonymous" defer="defer" type="application/javascript" src="https://github.githubassets.com/assets/vendors-node_modules_virtualized-list_es_index_js-node_modules_github_template-parts_lib_index_js-96453a51f920.js"></script> <script crossorigin="anonymous" defer="defer" type="application/javascript" src="https://github.githubassets.com/assets/vendors-node_modules_stacktrace-parser_dist_stack-trace-parser_esm_js-node_modules_github_bro-b0a862-4d8589138d1e.js"></script> <script crossorigin="anonymous" defer="defer" type="application/javascript" src="https://github.githubassets.com/assets/vendors-node_modules_github_remote-form_dist_index_js-node_modules_delegated-events_dist_inde-0e9dbe-d2bcedf65682.js"></script> <script crossorigin="anonymous" defer="defer" type="application/javascript" src="https://github.githubassets.com/assets/app_assets_modules_github_ref-selector_ts-043af64042a1.js"></script> <script crossorigin="anonymous" defer="defer" type="application/javascript" src="https://github.githubassets.com/assets/codespaces-4158520ad4d7.js"></script> <script crossorigin="anonymous" defer="defer" type="application/javascript" src="https://github.githubassets.com/assets/vendors-node_modules_github_mini-throttle_dist_decorators_js-node_modules_delegated-events_di-cc9bcb-ea42a360c5ae.js"></script> <script crossorigin="anonymous" defer="defer" type="application/javascript" src="https://github.githubassets.com/assets/vendors-node_modules_github_file-attachment-element_dist_index_js-node_modules_github_filter--35675b-aff280068839.js"></script> <script crossorigin="anonymous" defer="defer" type="application/javascript" src="https://github.githubassets.com/assets/repositories-ce9ff2a57e1f.js"></script> <script crossorigin="anonymous" defer="defer" type="application/javascript" src="https://github.githubassets.com/assets/vendors-node_modules_github_mini-throttle_dist_index_js-node_modules_github_catalyst_lib_inde-dbbea9-9b97703a4e6a.js"></script> <script crossorigin="anonymous" defer="defer" type="application/javascript" src="https://github.githubassets.com/assets/code-menu-13971a40799a.js"></script> <script crossorigin="anonymous" defer="defer" type="application/javascript" src="https://github.githubassets.com/assets/primer-react-765944243383.js"></script> <script crossorigin="anonymous" defer="defer" type="application/javascript" src="https://github.githubassets.com/assets/react-core-cd0a67881543.js"></script> <script crossorigin="anonymous" defer="defer" type="application/javascript" src="https://github.githubassets.com/assets/react-lib-7b7b5264f6c1.js"></script> <script crossorigin="anonymous" defer="defer" type="application/javascript" src="https://github.githubassets.com/assets/octicons-react-45c3a19dd792.js"></script> <script crossorigin="anonymous" defer="defer" type="application/javascript" src="https://github.githubassets.com/assets/vendors-node_modules_tanstack_query-core_build_modern_queryClient_js-e40bb86d3e93.js"></script> <script crossorigin="anonymous" defer="defer" type="application/javascript" src="https://github.githubassets.com/assets/vendors-node_modules_emotion_is-prop-valid_dist_emotion-is-prop-valid_esm_js-node_modules_emo-37e3d5-31653d7f2342.js"></script> <script crossorigin="anonymous" defer="defer" type="application/javascript" src="https://github.githubassets.com/assets/vendors-node_modules_github_mini-throttle_dist_index_js-node_modules_stacktrace-parser_dist_s-e7dcdd-285fc29e9fa5.js"></script> <script crossorigin="anonymous" defer="defer" type="application/javascript" src="https://github.githubassets.com/assets/vendors-node_modules_oddbird_popover-polyfill_dist_popover-fn_js-4896ddd4b7bb.js"></script> <script crossorigin="anonymous" defer="defer" type="application/javascript" src="https://github.githubassets.com/assets/notifications-subscriptions-menu-3eda30673b32.js"></script> <link crossorigin="anonymous" media="all" rel="stylesheet" href="https://github.githubassets.com/assets/primer-react.9fa170e9435ed4b922b9.module.css" /> <link crossorigin="anonymous" media="all" rel="stylesheet" href="https://github.githubassets.com/assets/notifications-subscriptions-menu.1bcff9205c241e99cff2.module.css" /> <script crossorigin="anonymous" defer="defer" type="application/javascript" src="https://github.githubassets.com/assets/primer-react-765944243383.js"></script> <script crossorigin="anonymous" defer="defer" type="application/javascript" src="https://github.githubassets.com/assets/react-core-cd0a67881543.js"></script> <script crossorigin="anonymous" defer="defer" type="application/javascript" src="https://github.githubassets.com/assets/react-lib-7b7b5264f6c1.js"></script> <script crossorigin="anonymous" defer="defer" type="application/javascript" src="https://github.githubassets.com/assets/octicons-react-45c3a19dd792.js"></script> <script crossorigin="anonymous" defer="defer" type="application/javascript" src="https://github.githubassets.com/assets/vendors-node_modules_tanstack_query-core_build_modern_queryClient_js-e40bb86d3e93.js"></script> <script crossorigin="anonymous" defer="defer" type="application/javascript" src="https://github.githubassets.com/assets/vendors-node_modules_emotion_is-prop-valid_dist_emotion-is-prop-valid_esm_js-node_modules_emo-37e3d5-31653d7f2342.js"></script> <script crossorigin="anonymous" defer="defer" type="application/javascript" src="https://github.githubassets.com/assets/vendors-node_modules_github_mini-throttle_dist_index_js-node_modules_stacktrace-parser_dist_s-e7dcdd-285fc29e9fa5.js"></script> <script crossorigin="anonymous" defer="defer" type="application/javascript" src="https://github.githubassets.com/assets/vendors-node_modules_oddbird_popover-polyfill_dist_popover-fn_js-4896ddd4b7bb.js"></script> <script crossorigin="anonymous" defer="defer" type="application/javascript" src="https://github.githubassets.com/assets/notifications-subscriptions-menu-3eda30673b32.js"></script> <link crossorigin="anonymous" media="all" rel="stylesheet" href="https://github.githubassets.com/assets/primer-react.9fa170e9435ed4b922b9.module.css" /> <link crossorigin="anonymous" media="all" rel="stylesheet" href="https://github.githubassets.com/assets/notifications-subscriptions-menu.1bcff9205c241e99cff2.module.css" /> <title>GitHub - RenderKit/oidn: Intel® Open Image Denoise library</title> <meta name="route-pattern" content="/:user_id/:repository" data-turbo-transient> <meta name="route-controller" content="files" data-turbo-transient> <meta name="route-action" content="disambiguate" data-turbo-transient> <meta name="current-catalog-service-hash" content="f3abb0cc802f3d7b95fc8762b94bdcb13bf39634c40c357301c4aa1d67a256fb"> <meta name="request-id" content="BC4A:36437A:1F609C:230071:67493894" data-pjax-transient="true"/><meta name="html-safe-nonce" content="9e93b8423127af2010f1b10d3c7c890595917609a6de5bf85303c3664725f337" data-pjax-transient="true"/><meta name="visitor-payload" content="eyJyZWZlcnJlciI6IiIsInJlcXVlc3RfaWQiOiJCQzRBOjM2NDM3QToxRjYwOUM6MjMwMDcxOjY3NDkzODk0IiwidmlzaXRvcl9pZCI6IjgwOTUzNDYxNDAxMTMzNTI4NTIiLCJyZWdpb25fZWRnZSI6InNvdXRoZWFzdGFzaWEiLCJyZWdpb25fcmVuZGVyIjoic291dGhlYXN0YXNpYSJ9" data-pjax-transient="true"/><meta name="visitor-hmac" content="07c8b4e9d670408f33d514ebfab926bad9f8a49bbe8329275c0f906eb5e190d2" data-pjax-transient="true"/> <meta name="hovercard-subject-tag" content="repository:168025831" data-turbo-transient> <meta name="github-keyboard-shortcuts" content="repository,copilot" data-turbo-transient="true" /> <meta name="selected-link" value="repo_source" data-turbo-transient> <link rel="assets" href="https://github.githubassets.com/"> <meta name="google-site-verification" content="Apib7-x98H0j5cPqHWwSMm6dNU4GmODRoqxLiDzdx9I"> <meta name="octolytics-url" content="https://collector.github.com/github/collect" /> <meta name="analytics-location" content="/<user-name>/<repo-name>" data-turbo-transient="true" /> <meta name="user-login" content=""> <meta name="viewport" content="width=device-width"> <meta name="description" content="Intel® Open Image Denoise library. Contribute to RenderKit/oidn development by creating an account on GitHub."> <link rel="search" type="application/opensearchdescription+xml" href="/opensearch.xml" title="GitHub"> <link rel="fluid-icon" href="https://github.com/fluidicon.png" title="GitHub"> <meta property="fb:app_id" content="1401488693436528"> <meta name="apple-itunes-app" content="app-id=1477376905, app-argument=https://github.com/RenderKit/oidn" /> <meta name="twitter:image" content="https://opengraph.githubassets.com/de5db2a6e8ea2bd4d72764b6bada38a6b199b64decb4a7a42c728a1cbac0b83a/RenderKit/oidn" /><meta name="twitter:site" content="@github" /><meta name="twitter:card" content="summary_large_image" /><meta name="twitter:title" content="GitHub - RenderKit/oidn: Intel® Open Image Denoise library" /><meta name="twitter:description" content="Intel® Open Image Denoise library. Contribute to RenderKit/oidn development by creating an account on GitHub." /> <meta property="og:image" content="https://opengraph.githubassets.com/de5db2a6e8ea2bd4d72764b6bada38a6b199b64decb4a7a42c728a1cbac0b83a/RenderKit/oidn" /><meta property="og:image:alt" content="Intel® Open Image Denoise library. Contribute to RenderKit/oidn development by creating an account on GitHub." /><meta property="og:image:width" content="1200" /><meta property="og:image:height" content="600" /><meta property="og:site_name" content="GitHub" /><meta property="og:type" content="object" /><meta property="og:title" content="GitHub - RenderKit/oidn: Intel® Open Image Denoise library" /><meta property="og:url" content="https://github.com/RenderKit/oidn" /><meta property="og:description" content="Intel® Open Image Denoise library. Contribute to RenderKit/oidn development by creating an account on GitHub." /> <meta name="hostname" content="github.com"> <meta name="expected-hostname" content="github.com"> <meta http-equiv="x-pjax-version" content="0361a11d6ba7285e98ad3340b1de5998c1adf9be672ff350e645684a12c5ff34" data-turbo-track="reload"> <meta http-equiv="x-pjax-csp-version" content="ace39c3b6632770952207593607e6e0be0db363435a8b877b1f96abe6430f345" data-turbo-track="reload"> <meta http-equiv="x-pjax-css-version" content="3adbaefc258174e49a9472f62ba4ed262e7c0112f9e7266a3e927bd7b898716f" data-turbo-track="reload"> <meta http-equiv="x-pjax-js-version" content="58069173ba3ee40a605f317588f70346d3cda2c3c32d767dd6d2909bbe343612" data-turbo-track="reload"> <meta name="turbo-cache-control" content="no-preview" data-turbo-transient=""> <meta data-hydrostats="publish"> <meta name="go-import" content="github.com/RenderKit/oidn git https://github.com/RenderKit/oidn.git"> <meta name="octolytics-dimension-user_id" content="61704897" /><meta name="octolytics-dimension-user_login" content="RenderKit" /><meta name="octolytics-dimension-repository_id" content="168025831" /><meta name="octolytics-dimension-repository_nwo" content="RenderKit/oidn" /><meta name="octolytics-dimension-repository_public" content="true" /><meta name="octolytics-dimension-repository_is_fork" content="false" /><meta name="octolytics-dimension-repository_network_root_id" content="168025831" /><meta name="octolytics-dimension-repository_network_root_nwo" content="RenderKit/oidn" /> <link rel="canonical" href="https://github.com/RenderKit/oidn" data-turbo-transient> <meta name="turbo-body-classes" content="logged-out env-production page-responsive"> <meta name="browser-stats-url" content="https://api.github.com/_private/browser/stats"> <meta name="browser-errors-url" content="https://api.github.com/_private/browser/errors"> <link rel="mask-icon" href="https://github.githubassets.com/assets/pinned-octocat-093da3e6fa40.svg" color="#000000"> <link rel="alternate icon" class="js-site-favicon" type="image/png" href="https://github.githubassets.com/favicons/favicon.png"> <link rel="icon" class="js-site-favicon" type="image/svg+xml" href="https://github.githubassets.com/favicons/favicon.svg" data-base-href="https://github.githubassets.com/favicons/favicon"> <meta name="theme-color" content="#1e2327"> <meta name="color-scheme" content="light dark" /> <link rel="manifest" href="/manifest.json" crossOrigin="use-credentials"> </head> <body class="logged-out env-production page-responsive" style="word-wrap: break-word;"> <div data-turbo-body class="logged-out env-production page-responsive" style="word-wrap: break-word;"> <div class="position-relative header-wrapper js-header-wrapper "> <a href="#start-of-content" data-skip-target-assigned="false" class="px-2 py-4 color-bg-accent-emphasis color-fg-on-emphasis show-on-focus js-skip-to-content">Skip to content</a> <span data-view-component="true" class="progress-pjax-loader Progress position-fixed width-full"> <span style="width: 0%;" data-view-component="true" class="Progress-item progress-pjax-loader-bar left-0 top-0 color-bg-accent-emphasis"></span> </span> <script crossorigin="anonymous" defer="defer" type="application/javascript" src="https://github.githubassets.com/assets/keyboard-shortcuts-dialog-f3cc184507a7.js"></script> <link crossorigin="anonymous" media="all" rel="stylesheet" href="https://github.githubassets.com/assets/primer-react.9fa170e9435ed4b922b9.module.css" /> <react-partial partial-name="keyboard-shortcuts-dialog" data-ssr="false" data-attempted-ssr="false" > <script type="application/json" data-target="react-partial.embeddedData">{"props":{"docsUrl":"https://docs.github.com/get-started/accessibility/keyboard-shortcuts"}}</script> <div data-target="react-partial.reactRoot"></div> </react-partial> <script crossorigin="anonymous" defer="defer" type="application/javascript" src="https://github.githubassets.com/assets/vendors-node_modules_github_remote-form_dist_index_js-node_modules_delegated-events_dist_inde-94fd67-cf3dd69d89eb.js"></script> <script crossorigin="anonymous" defer="defer" type="application/javascript" src="https://github.githubassets.com/assets/sessions-8fa3b694f335.js"></script> <header class="HeaderMktg header-logged-out js-details-container js-header Details f4 py-3" role="banner" data-is-top="true" data-color-mode=light data-light-theme=light data-dark-theme=dark> <h2 class="sr-only">Navigation Menu</h2> <button type="button" class="HeaderMktg-backdrop d-lg-none border-0 position-fixed top-0 left-0 width-full height-full js-details-target" aria-label="Toggle navigation"> <span class="d-none">Toggle navigation</span> </button> <div class="d-flex flex-column flex-lg-row flex-items-center px-3 px-md-4 px-lg-5 height-full position-relative z-1"> <div class="d-flex flex-justify-between flex-items-center width-full width-lg-auto"> <div class="flex-1"> <button aria-label="Toggle navigation" aria-expanded="false" type="button" data-view-component="true" class="js-details-target js-nav-padding-recalculate js-header-menu-toggle Button--link Button--medium Button d-lg-none color-fg-inherit p-1"> <span class="Button-content"> <span class="Button-label"><div class="HeaderMenu-toggle-bar rounded my-1"></div> <div class="HeaderMenu-toggle-bar rounded my-1"></div> <div class="HeaderMenu-toggle-bar rounded my-1"></div></span> </span> </button> </div> <a class="mr-lg-3 color-fg-inherit flex-order-2 js-prevent-focus-on-mobile-nav" href="/" aria-label="Homepage" data-analytics-event="{"category":"Marketing nav","action":"click to go to homepage","label":"ref_page:Marketing;ref_cta:Logomark;ref_loc:Header"}"> <svg height="32" aria-hidden="true" viewBox="0 0 24 24" version="1.1" width="32" data-view-component="true" class="octicon octicon-mark-github"> <path d="M12.5.75C6.146.75 1 5.896 1 12.25c0 5.089 3.292 9.387 7.863 10.91.575.101.79-.244.79-.546 0-.273-.014-1.178-.014-2.142-2.889.532-3.636-.704-3.866-1.35-.13-.331-.69-1.352-1.18-1.625-.402-.216-.977-.748-.014-.762.906-.014 1.553.834 1.769 1.179 1.035 1.74 2.688 1.25 3.349.948.1-.747.402-1.25.733-1.538-2.559-.287-5.232-1.279-5.232-5.678 0-1.25.445-2.285 1.178-3.09-.115-.288-.517-1.467.115-3.048 0 0 .963-.302 3.163 1.179.92-.259 1.897-.388 2.875-.388.977 0 1.955.13 2.875.388 2.2-1.495 3.162-1.179 3.162-1.179.633 1.581.23 2.76.115 3.048.733.805 1.179 1.825 1.179 3.09 0 4.413-2.688 5.39-5.247 5.678.417.36.776 1.05.776 2.128 0 1.538-.014 2.774-.014 3.162 0 .302.216.662.79.547C20.709 21.637 24 17.324 24 12.25 24 5.896 18.854.75 12.5.75Z"></path> </svg> </a> <div class="flex-1 flex-order-2 text-right"> <a href="/login?return_to=https%3A%2F%2Fgithub.com%2FRenderKit%2Foidn" class="HeaderMenu-link HeaderMenu-button d-inline-flex d-lg-none flex-order-1 f5 no-underline border color-border-default rounded-2 px-2 py-1 color-fg-inherit js-prevent-focus-on-mobile-nav" data-hydro-click="{"event_type":"authentication.click","payload":{"location_in_page":"site header menu","repository_id":null,"auth_type":"SIGN_UP","originating_url":"https://github.com/RenderKit/oidn","user_id":null}}" data-hydro-click-hmac="3271ebd20fd78fd14b488847e5f3499c73b3556a7f3c58024d191aea81cdd6e6" data-analytics-event="{"category":"Marketing nav","action":"click to Sign in","label":"ref_page:Marketing;ref_cta:Sign in;ref_loc:Header"}" > Sign in </a> </div> </div> <div class="HeaderMenu js-header-menu height-fit position-lg-relative d-lg-flex flex-column flex-auto top-0"> <div class="HeaderMenu-wrapper d-flex flex-column flex-self-start flex-lg-row flex-auto rounded rounded-lg-0"> <nav class="HeaderMenu-nav" aria-label="Global"> <ul class="d-lg-flex list-style-none"> <li class="HeaderMenu-item position-relative flex-wrap flex-justify-between flex-items-center d-block d-lg-flex flex-lg-nowrap flex-lg-items-center js-details-container js-header-menu-item"> <button type="button" class="HeaderMenu-link border-0 width-full width-lg-auto px-0 px-lg-2 py-lg-2 no-wrap d-flex flex-items-center flex-justify-between js-details-target" aria-expanded="false"> Product <svg opacity="0.5" aria-hidden="true" height="16" viewBox="0 0 16 16" version="1.1" width="16" data-view-component="true" class="octicon octicon-chevron-down HeaderMenu-icon ml-1"> <path d="M12.78 5.22a.749.749 0 0 1 0 1.06l-4.25 4.25a.749.749 0 0 1-1.06 0L3.22 6.28a.749.749 0 1 1 1.06-1.06L8 8.939l3.72-3.719a.749.749 0 0 1 1.06 0Z"></path> </svg> </button> <div class="HeaderMenu-dropdown dropdown-menu rounded m-0 p-0 pt-2 pt-lg-4 position-relative position-lg-absolute left-0 left-lg-n3 pb-2 pb-lg-4 d-lg-flex flex-wrap dropdown-menu-wide"> <div class="HeaderMenu-column px-lg-4 border-lg-right mb-4 mb-lg-0 pr-lg-7"> <div class="border-bottom pb-3 pb-lg-0 border-lg-bottom-0"> <ul class="list-style-none f5" > <li> <a class="HeaderMenu-dropdown-link d-block no-underline position-relative py-2 Link--secondary d-flex flex-items-center Link--has-description pb-lg-3" data-analytics-event="{"location":"navbar","action":"github_copilot","context":"product","tag":"link","label":"github_copilot_link_product_navbar"}" href="https://github.com/features/copilot"> <svg aria-hidden="true" height="24" viewBox="0 0 24 24" version="1.1" width="24" data-view-component="true" class="octicon octicon-copilot color-fg-subtle mr-3"> <path d="M23.922 16.992c-.861 1.495-5.859 5.023-11.922 5.023-6.063 0-11.061-3.528-11.922-5.023A.641.641 0 0 1 0 16.736v-2.869a.841.841 0 0 1 .053-.22c.372-.935 1.347-2.292 2.605-2.656.167-.429.414-1.055.644-1.517a10.195 10.195 0 0 1-.052-1.086c0-1.331.282-2.499 1.132-3.368.397-.406.89-.717 1.474-.952 1.399-1.136 3.392-2.093 6.122-2.093 2.731 0 4.767.957 6.166 2.093.584.235 1.077.546 1.474.952.85.869 1.132 2.037 1.132 3.368 0 .368-.014.733-.052 1.086.23.462.477 1.088.644 1.517 1.258.364 2.233 1.721 2.605 2.656a.832.832 0 0 1 .053.22v2.869a.641.641 0 0 1-.078.256ZM12.172 11h-.344a4.323 4.323 0 0 1-.355.508C10.703 12.455 9.555 13 7.965 13c-1.725 0-2.989-.359-3.782-1.259a2.005 2.005 0 0 1-.085-.104L4 11.741v6.585c1.435.779 4.514 2.179 8 2.179 3.486 0 6.565-1.4 8-2.179v-6.585l-.098-.104s-.033.045-.085.104c-.793.9-2.057 1.259-3.782 1.259-1.59 0-2.738-.545-3.508-1.492a4.323 4.323 0 0 1-.355-.508h-.016.016Zm.641-2.935c.136 1.057.403 1.913.878 2.497.442.544 1.134.938 2.344.938 1.573 0 2.292-.337 2.657-.751.384-.435.558-1.15.558-2.361 0-1.14-.243-1.847-.705-2.319-.477-.488-1.319-.862-2.824-1.025-1.487-.161-2.192.138-2.533.529-.269.307-.437.808-.438 1.578v.021c0 .265.021.562.063.893Zm-1.626 0c.042-.331.063-.628.063-.894v-.02c-.001-.77-.169-1.271-.438-1.578-.341-.391-1.046-.69-2.533-.529-1.505.163-2.347.537-2.824 1.025-.462.472-.705 1.179-.705 2.319 0 1.211.175 1.926.558 2.361.365.414 1.084.751 2.657.751 1.21 0 1.902-.394 2.344-.938.475-.584.742-1.44.878-2.497Z"></path><path d="M14.5 14.25a1 1 0 0 1 1 1v2a1 1 0 0 1-2 0v-2a1 1 0 0 1 1-1Zm-5 0a1 1 0 0 1 1 1v2a1 1 0 0 1-2 0v-2a1 1 0 0 1 1-1Z"></path> </svg> <div> <div class="color-fg-default h4">GitHub Copilot</div> Write better code with AI </div> </a></li> <li> <a class="HeaderMenu-dropdown-link d-block no-underline position-relative py-2 Link--secondary d-flex flex-items-center Link--has-description pb-lg-3" data-analytics-event="{"location":"navbar","action":"security","context":"product","tag":"link","label":"security_link_product_navbar"}" href="https://github.com/features/security"> <svg aria-hidden="true" height="24" viewBox="0 0 24 24" version="1.1" width="24" data-view-component="true" class="octicon octicon-shield-check color-fg-subtle mr-3"> <path d="M16.53 9.78a.75.75 0 0 0-1.06-1.06L11 13.19l-1.97-1.97a.75.75 0 0 0-1.06 1.06l2.5 2.5a.75.75 0 0 0 1.06 0l5-5Z"></path><path d="m12.54.637 8.25 2.675A1.75 1.75 0 0 1 22 4.976V10c0 6.19-3.771 10.704-9.401 12.83a1.704 1.704 0 0 1-1.198 0C5.77 20.705 2 16.19 2 10V4.976c0-.758.489-1.43 1.21-1.664L11.46.637a1.748 1.748 0 0 1 1.08 0Zm-.617 1.426-8.25 2.676a.249.249 0 0 0-.173.237V10c0 5.46 3.28 9.483 8.43 11.426a.199.199 0 0 0 .14 0C17.22 19.483 20.5 15.461 20.5 10V4.976a.25.25 0 0 0-.173-.237l-8.25-2.676a.253.253 0 0 0-.154 0Z"></path> </svg> <div> <div class="color-fg-default h4">Security</div> Find and fix vulnerabilities </div> </a></li> <li> <a class="HeaderMenu-dropdown-link d-block no-underline position-relative py-2 Link--secondary d-flex flex-items-center Link--has-description pb-lg-3" data-analytics-event="{"location":"navbar","action":"actions","context":"product","tag":"link","label":"actions_link_product_navbar"}" href="https://github.com/features/actions"> <svg aria-hidden="true" height="24" viewBox="0 0 24 24" version="1.1" width="24" data-view-component="true" class="octicon octicon-workflow color-fg-subtle mr-3"> <path d="M1 3a2 2 0 0 1 2-2h6.5a2 2 0 0 1 2 2v6.5a2 2 0 0 1-2 2H7v4.063C7 16.355 7.644 17 8.438 17H12.5v-2.5a2 2 0 0 1 2-2H21a2 2 0 0 1 2 2V21a2 2 0 0 1-2 2h-6.5a2 2 0 0 1-2-2v-2.5H8.437A2.939 2.939 0 0 1 5.5 15.562V11.5H3a2 2 0 0 1-2-2Zm2-.5a.5.5 0 0 0-.5.5v6.5a.5.5 0 0 0 .5.5h6.5a.5.5 0 0 0 .5-.5V3a.5.5 0 0 0-.5-.5ZM14.5 14a.5.5 0 0 0-.5.5V21a.5.5 0 0 0 .5.5H21a.5.5 0 0 0 .5-.5v-6.5a.5.5 0 0 0-.5-.5Z"></path> </svg> <div> <div class="color-fg-default h4">Actions</div> Automate any workflow </div> </a></li> <li> <a class="HeaderMenu-dropdown-link d-block no-underline position-relative py-2 Link--secondary d-flex flex-items-center Link--has-description pb-lg-3" data-analytics-event="{"location":"navbar","action":"codespaces","context":"product","tag":"link","label":"codespaces_link_product_navbar"}" href="https://github.com/features/codespaces"> <svg aria-hidden="true" height="24" viewBox="0 0 24 24" version="1.1" width="24" data-view-component="true" class="octicon octicon-codespaces color-fg-subtle mr-3"> <path d="M3.5 3.75C3.5 2.784 4.284 2 5.25 2h13.5c.966 0 1.75.784 1.75 1.75v7.5A1.75 1.75 0 0 1 18.75 13H5.25a1.75 1.75 0 0 1-1.75-1.75Zm-2 12c0-.966.784-1.75 1.75-1.75h17.5c.966 0 1.75.784 1.75 1.75v4a1.75 1.75 0 0 1-1.75 1.75H3.25a1.75 1.75 0 0 1-1.75-1.75ZM5.25 3.5a.25.25 0 0 0-.25.25v7.5c0 .138.112.25.25.25h13.5a.25.25 0 0 0 .25-.25v-7.5a.25.25 0 0 0-.25-.25Zm-2 12a.25.25 0 0 0-.25.25v4c0 .138.112.25.25.25h17.5a.25.25 0 0 0 .25-.25v-4a.25.25 0 0 0-.25-.25Z"></path><path d="M10 17.75a.75.75 0 0 1 .75-.75h6.5a.75.75 0 0 1 0 1.5h-6.5a.75.75 0 0 1-.75-.75Zm-4 0a.75.75 0 0 1 .75-.75h.5a.75.75 0 0 1 0 1.5h-.5a.75.75 0 0 1-.75-.75Z"></path> </svg> <div> <div class="color-fg-default h4">Codespaces</div> Instant dev environments </div> </a></li> <li> <a class="HeaderMenu-dropdown-link d-block no-underline position-relative py-2 Link--secondary d-flex flex-items-center Link--has-description pb-lg-3" data-analytics-event="{"location":"navbar","action":"issues","context":"product","tag":"link","label":"issues_link_product_navbar"}" href="https://github.com/features/issues"> <svg aria-hidden="true" height="24" viewBox="0 0 24 24" version="1.1" width="24" data-view-component="true" class="octicon octicon-issue-opened color-fg-subtle mr-3"> <path d="M12 1c6.075 0 11 4.925 11 11s-4.925 11-11 11S1 18.075 1 12 5.925 1 12 1ZM2.5 12a9.5 9.5 0 0 0 9.5 9.5 9.5 9.5 0 0 0 9.5-9.5A9.5 9.5 0 0 0 12 2.5 9.5 9.5 0 0 0 2.5 12Zm9.5 2a2 2 0 1 1-.001-3.999A2 2 0 0 1 12 14Z"></path> </svg> <div> <div class="color-fg-default h4">Issues</div> Plan and track work </div> </a></li> <li> <a class="HeaderMenu-dropdown-link d-block no-underline position-relative py-2 Link--secondary d-flex flex-items-center Link--has-description pb-lg-3" data-analytics-event="{"location":"navbar","action":"code_review","context":"product","tag":"link","label":"code_review_link_product_navbar"}" href="https://github.com/features/code-review"> <svg aria-hidden="true" height="24" viewBox="0 0 24 24" version="1.1" width="24" data-view-component="true" class="octicon octicon-code-review color-fg-subtle mr-3"> <path d="M10.3 6.74a.75.75 0 0 1-.04 1.06l-2.908 2.7 2.908 2.7a.75.75 0 1 1-1.02 1.1l-3.5-3.25a.75.75 0 0 1 0-1.1l3.5-3.25a.75.75 0 0 1 1.06.04Zm3.44 1.06a.75.75 0 1 1 1.02-1.1l3.5 3.25a.75.75 0 0 1 0 1.1l-3.5 3.25a.75.75 0 1 1-1.02-1.1l2.908-2.7-2.908-2.7Z"></path><path d="M1.5 4.25c0-.966.784-1.75 1.75-1.75h17.5c.966 0 1.75.784 1.75 1.75v12.5a1.75 1.75 0 0 1-1.75 1.75h-9.69l-3.573 3.573A1.458 1.458 0 0 1 5 21.043V18.5H3.25a1.75 1.75 0 0 1-1.75-1.75ZM3.25 4a.25.25 0 0 0-.25.25v12.5c0 .138.112.25.25.25h2.5a.75.75 0 0 1 .75.75v3.19l3.72-3.72a.749.749 0 0 1 .53-.22h10a.25.25 0 0 0 .25-.25V4.25a.25.25 0 0 0-.25-.25Z"></path> </svg> <div> <div class="color-fg-default h4">Code Review</div> Manage code changes </div> </a></li> <li> <a class="HeaderMenu-dropdown-link d-block no-underline position-relative py-2 Link--secondary d-flex flex-items-center Link--has-description pb-lg-3" data-analytics-event="{"location":"navbar","action":"discussions","context":"product","tag":"link","label":"discussions_link_product_navbar"}" href="https://github.com/features/discussions"> <svg aria-hidden="true" height="24" viewBox="0 0 24 24" version="1.1" width="24" data-view-component="true" class="octicon octicon-comment-discussion color-fg-subtle mr-3"> <path d="M1.75 1h12.5c.966 0 1.75.784 1.75 1.75v9.5A1.75 1.75 0 0 1 14.25 14H8.061l-2.574 2.573A1.458 1.458 0 0 1 3 15.543V14H1.75A1.75 1.75 0 0 1 0 12.25v-9.5C0 1.784.784 1 1.75 1ZM1.5 2.75v9.5c0 .138.112.25.25.25h2a.75.75 0 0 1 .75.75v2.19l2.72-2.72a.749.749 0 0 1 .53-.22h6.5a.25.25 0 0 0 .25-.25v-9.5a.25.25 0 0 0-.25-.25H1.75a.25.25 0 0 0-.25.25Z"></path><path d="M22.5 8.75a.25.25 0 0 0-.25-.25h-3.5a.75.75 0 0 1 0-1.5h3.5c.966 0 1.75.784 1.75 1.75v9.5A1.75 1.75 0 0 1 22.25 20H21v1.543a1.457 1.457 0 0 1-2.487 1.03L15.939 20H10.75A1.75 1.75 0 0 1 9 18.25v-1.465a.75.75 0 0 1 1.5 0v1.465c0 .138.112.25.25.25h5.5a.75.75 0 0 1 .53.22l2.72 2.72v-2.19a.75.75 0 0 1 .75-.75h2a.25.25 0 0 0 .25-.25v-9.5Z"></path> </svg> <div> <div class="color-fg-default h4">Discussions</div> Collaborate outside of code </div> </a></li> <li> <a class="HeaderMenu-dropdown-link d-block no-underline position-relative py-2 Link--secondary d-flex flex-items-center Link--has-description" data-analytics-event="{"location":"navbar","action":"code_search","context":"product","tag":"link","label":"code_search_link_product_navbar"}" href="https://github.com/features/code-search"> <svg aria-hidden="true" height="24" viewBox="0 0 24 24" version="1.1" width="24" data-view-component="true" class="octicon octicon-code-square color-fg-subtle mr-3"> <path d="M10.3 8.24a.75.75 0 0 1-.04 1.06L7.352 12l2.908 2.7a.75.75 0 1 1-1.02 1.1l-3.5-3.25a.75.75 0 0 1 0-1.1l3.5-3.25a.75.75 0 0 1 1.06.04Zm3.44 1.06a.75.75 0 1 1 1.02-1.1l3.5 3.25a.75.75 0 0 1 0 1.1l-3.5 3.25a.75.75 0 1 1-1.02-1.1l2.908-2.7-2.908-2.7Z"></path><path d="M2 3.75C2 2.784 2.784 2 3.75 2h16.5c.966 0 1.75.784 1.75 1.75v16.5A1.75 1.75 0 0 1 20.25 22H3.75A1.75 1.75 0 0 1 2 20.25Zm1.75-.25a.25.25 0 0 0-.25.25v16.5c0 .138.112.25.25.25h16.5a.25.25 0 0 0 .25-.25V3.75a.25.25 0 0 0-.25-.25Z"></path> </svg> <div> <div class="color-fg-default h4">Code Search</div> Find more, search less </div> </a></li> </ul> </div> </div> <div class="HeaderMenu-column px-lg-4"> <div class="border-bottom pb-3 pb-lg-0 border-lg-bottom-0 border-bottom-0"> <span class="d-block h4 color-fg-default my-1" id="product-explore-heading">Explore</span> <ul class="list-style-none f5" aria-labelledby="product-explore-heading"> <li> <a class="HeaderMenu-dropdown-link d-block no-underline position-relative py-2 Link--secondary" data-analytics-event="{"location":"navbar","action":"all_features","context":"product","tag":"link","label":"all_features_link_product_navbar"}" href="https://github.com/features"> All features </a></li> <li> <a class="HeaderMenu-dropdown-link d-block no-underline position-relative py-2 Link--secondary Link--external" target="_blank" data-analytics-event="{"location":"navbar","action":"documentation","context":"product","tag":"link","label":"documentation_link_product_navbar"}" href="https://docs.github.com"> Documentation <svg aria-hidden="true" height="16" viewBox="0 0 16 16" version="1.1" width="16" data-view-component="true" class="octicon octicon-link-external HeaderMenu-external-icon color-fg-subtle"> <path d="M3.75 2h3.5a.75.75 0 0 1 0 1.5h-3.5a.25.25 0 0 0-.25.25v8.5c0 .138.112.25.25.25h8.5a.25.25 0 0 0 .25-.25v-3.5a.75.75 0 0 1 1.5 0v3.5A1.75 1.75 0 0 1 12.25 14h-8.5A1.75 1.75 0 0 1 2 12.25v-8.5C2 2.784 2.784 2 3.75 2Zm6.854-1h4.146a.25.25 0 0 1 .25.25v4.146a.25.25 0 0 1-.427.177L13.03 4.03 9.28 7.78a.751.751 0 0 1-1.042-.018.751.751 0 0 1-.018-1.042l3.75-3.75-1.543-1.543A.25.25 0 0 1 10.604 1Z"></path> </svg> </a></li> <li> <a class="HeaderMenu-dropdown-link d-block no-underline position-relative py-2 Link--secondary Link--external" target="_blank" data-analytics-event="{"location":"navbar","action":"github_skills","context":"product","tag":"link","label":"github_skills_link_product_navbar"}" href="https://skills.github.com"> GitHub Skills <svg aria-hidden="true" height="16" viewBox="0 0 16 16" version="1.1" width="16" data-view-component="true" class="octicon octicon-link-external HeaderMenu-external-icon color-fg-subtle"> <path d="M3.75 2h3.5a.75.75 0 0 1 0 1.5h-3.5a.25.25 0 0 0-.25.25v8.5c0 .138.112.25.25.25h8.5a.25.25 0 0 0 .25-.25v-3.5a.75.75 0 0 1 1.5 0v3.5A1.75 1.75 0 0 1 12.25 14h-8.5A1.75 1.75 0 0 1 2 12.25v-8.5C2 2.784 2.784 2 3.75 2Zm6.854-1h4.146a.25.25 0 0 1 .25.25v4.146a.25.25 0 0 1-.427.177L13.03 4.03 9.28 7.78a.751.751 0 0 1-1.042-.018.751.751 0 0 1-.018-1.042l3.75-3.75-1.543-1.543A.25.25 0 0 1 10.604 1Z"></path> </svg> </a></li> <li> <a class="HeaderMenu-dropdown-link d-block no-underline position-relative py-2 Link--secondary Link--external" target="_blank" data-analytics-event="{"location":"navbar","action":"blog","context":"product","tag":"link","label":"blog_link_product_navbar"}" href="https://github.blog"> Blog <svg aria-hidden="true" height="16" viewBox="0 0 16 16" version="1.1" width="16" data-view-component="true" class="octicon octicon-link-external HeaderMenu-external-icon color-fg-subtle"> <path d="M3.75 2h3.5a.75.75 0 0 1 0 1.5h-3.5a.25.25 0 0 0-.25.25v8.5c0 .138.112.25.25.25h8.5a.25.25 0 0 0 .25-.25v-3.5a.75.75 0 0 1 1.5 0v3.5A1.75 1.75 0 0 1 12.25 14h-8.5A1.75 1.75 0 0 1 2 12.25v-8.5C2 2.784 2.784 2 3.75 2Zm6.854-1h4.146a.25.25 0 0 1 .25.25v4.146a.25.25 0 0 1-.427.177L13.03 4.03 9.28 7.78a.751.751 0 0 1-1.042-.018.751.751 0 0 1-.018-1.042l3.75-3.75-1.543-1.543A.25.25 0 0 1 10.604 1Z"></path> </svg> </a></li> </ul> </div> </div> </div> </li> <li class="HeaderMenu-item position-relative flex-wrap flex-justify-between flex-items-center d-block d-lg-flex flex-lg-nowrap flex-lg-items-center js-details-container js-header-menu-item"> <button type="button" class="HeaderMenu-link border-0 width-full width-lg-auto px-0 px-lg-2 py-lg-2 no-wrap d-flex flex-items-center flex-justify-between js-details-target" aria-expanded="false"> Solutions <svg opacity="0.5" aria-hidden="true" height="16" viewBox="0 0 16 16" version="1.1" width="16" data-view-component="true" class="octicon octicon-chevron-down HeaderMenu-icon ml-1"> <path d="M12.78 5.22a.749.749 0 0 1 0 1.06l-4.25 4.25a.749.749 0 0 1-1.06 0L3.22 6.28a.749.749 0 1 1 1.06-1.06L8 8.939l3.72-3.719a.749.749 0 0 1 1.06 0Z"></path> </svg> </button> <div class="HeaderMenu-dropdown dropdown-menu rounded m-0 p-0 pt-2 pt-lg-4 position-relative position-lg-absolute left-0 left-lg-n3 d-lg-flex flex-wrap dropdown-menu-wide"> <div class="HeaderMenu-column px-lg-4 border-lg-right mb-4 mb-lg-0 pr-lg-7"> <div class="border-bottom pb-3 pb-lg-0 border-lg-bottom-0 pb-lg-3 mb-3 mb-lg-0"> <span class="d-block h4 color-fg-default my-1" id="solutions-by-company-size-heading">By company size</span> <ul class="list-style-none f5" aria-labelledby="solutions-by-company-size-heading"> <li> <a class="HeaderMenu-dropdown-link d-block no-underline position-relative py-2 Link--secondary" data-analytics-event="{"location":"navbar","action":"enterprises","context":"solutions","tag":"link","label":"enterprises_link_solutions_navbar"}" href="https://github.com/enterprise"> Enterprises </a></li> <li> <a class="HeaderMenu-dropdown-link d-block no-underline position-relative py-2 Link--secondary" data-analytics-event="{"location":"navbar","action":"small_and_medium_teams","context":"solutions","tag":"link","label":"small_and_medium_teams_link_solutions_navbar"}" href="https://github.com/team"> Small and medium teams </a></li> <li> <a class="HeaderMenu-dropdown-link d-block no-underline position-relative py-2 Link--secondary" data-analytics-event="{"location":"navbar","action":"startups","context":"solutions","tag":"link","label":"startups_link_solutions_navbar"}" href="https://github.com/enterprise/startups"> Startups </a></li> </ul> </div> <div class="border-bottom pb-3 pb-lg-0 border-lg-bottom-0"> <span class="d-block h4 color-fg-default my-1" id="solutions-by-use-case-heading">By use case</span> <ul class="list-style-none f5" aria-labelledby="solutions-by-use-case-heading"> <li> <a class="HeaderMenu-dropdown-link d-block no-underline position-relative py-2 Link--secondary" data-analytics-event="{"location":"navbar","action":"devsecops","context":"solutions","tag":"link","label":"devsecops_link_solutions_navbar"}" href="/solutions/use-case/devsecops"> DevSecOps </a></li> <li> <a class="HeaderMenu-dropdown-link d-block no-underline position-relative py-2 Link--secondary" data-analytics-event="{"location":"navbar","action":"devops","context":"solutions","tag":"link","label":"devops_link_solutions_navbar"}" href="/solutions/use-case/devops"> DevOps </a></li> <li> <a class="HeaderMenu-dropdown-link d-block no-underline position-relative py-2 Link--secondary" data-analytics-event="{"location":"navbar","action":"ci_cd","context":"solutions","tag":"link","label":"ci_cd_link_solutions_navbar"}" href="/solutions/use-case/ci-cd"> CI/CD </a></li> <li> <a class="HeaderMenu-dropdown-link d-block no-underline position-relative py-2 Link--secondary" data-analytics-event="{"location":"navbar","action":"view_all_use_cases","context":"solutions","tag":"link","label":"view_all_use_cases_link_solutions_navbar"}" href="/solutions/use-case"> View all use cases </a></li> </ul> </div> </div> <div class="HeaderMenu-column px-lg-4"> <div class="border-bottom pb-3 pb-lg-0 border-lg-bottom-0"> <span class="d-block h4 color-fg-default my-1" id="solutions-by-industry-heading">By industry</span> <ul class="list-style-none f5" aria-labelledby="solutions-by-industry-heading"> <li> <a class="HeaderMenu-dropdown-link d-block no-underline position-relative py-2 Link--secondary" data-analytics-event="{"location":"navbar","action":"healthcare","context":"solutions","tag":"link","label":"healthcare_link_solutions_navbar"}" href="/solutions/industry/healthcare"> Healthcare </a></li> <li> <a class="HeaderMenu-dropdown-link d-block no-underline position-relative py-2 Link--secondary" data-analytics-event="{"location":"navbar","action":"financial_services","context":"solutions","tag":"link","label":"financial_services_link_solutions_navbar"}" href="/solutions/industry/financial-services"> Financial services </a></li> <li> <a class="HeaderMenu-dropdown-link d-block no-underline position-relative py-2 Link--secondary" data-analytics-event="{"location":"navbar","action":"manufacturing","context":"solutions","tag":"link","label":"manufacturing_link_solutions_navbar"}" href="/solutions/industry/manufacturing"> Manufacturing </a></li> <li> <a class="HeaderMenu-dropdown-link d-block no-underline position-relative py-2 Link--secondary" data-analytics-event="{"location":"navbar","action":"government","context":"solutions","tag":"link","label":"government_link_solutions_navbar"}" href="/solutions/industry/government"> Government </a></li> <li> <a class="HeaderMenu-dropdown-link d-block no-underline position-relative py-2 Link--secondary" data-analytics-event="{"location":"navbar","action":"view_all_industries","context":"solutions","tag":"link","label":"view_all_industries_link_solutions_navbar"}" href="/solutions/industry"> View all industries </a></li> </ul> </div> </div> <div class="HeaderMenu-trailing-link rounded-bottom-2 flex-shrink-0 mt-lg-4 px-lg-4 py-4 py-lg-3 f5 text-semibold"> <a href="/solutions"> View all solutions <svg aria-hidden="true" height="16" viewBox="0 0 16 16" version="1.1" width="16" data-view-component="true" class="octicon octicon-chevron-right HeaderMenu-trailing-link-icon"> <path d="M6.22 3.22a.75.75 0 0 1 1.06 0l4.25 4.25a.75.75 0 0 1 0 1.06l-4.25 4.25a.751.751 0 0 1-1.042-.018.751.751 0 0 1-.018-1.042L9.94 8 6.22 4.28a.75.75 0 0 1 0-1.06Z"></path> </svg> </a> </div> </div> </li> <li class="HeaderMenu-item position-relative flex-wrap flex-justify-between flex-items-center d-block d-lg-flex flex-lg-nowrap flex-lg-items-center js-details-container js-header-menu-item"> <button type="button" class="HeaderMenu-link border-0 width-full width-lg-auto px-0 px-lg-2 py-lg-2 no-wrap d-flex flex-items-center flex-justify-between js-details-target" aria-expanded="false"> Resources <svg opacity="0.5" aria-hidden="true" height="16" viewBox="0 0 16 16" version="1.1" width="16" data-view-component="true" class="octicon octicon-chevron-down HeaderMenu-icon ml-1"> <path d="M12.78 5.22a.749.749 0 0 1 0 1.06l-4.25 4.25a.749.749 0 0 1-1.06 0L3.22 6.28a.749.749 0 1 1 1.06-1.06L8 8.939l3.72-3.719a.749.749 0 0 1 1.06 0Z"></path> </svg> </button> <div class="HeaderMenu-dropdown dropdown-menu rounded m-0 p-0 pt-2 pt-lg-4 position-relative position-lg-absolute left-0 left-lg-n3 pb-2 pb-lg-4 d-lg-flex flex-wrap dropdown-menu-wide"> <div class="HeaderMenu-column px-lg-4 border-lg-right mb-4 mb-lg-0 pr-lg-7"> <div class="border-bottom pb-3 pb-lg-0 border-lg-bottom-0"> <span class="d-block h4 color-fg-default my-1" id="resources-topics-heading">Topics</span> <ul class="list-style-none f5" aria-labelledby="resources-topics-heading"> <li> <a class="HeaderMenu-dropdown-link d-block no-underline position-relative py-2 Link--secondary" data-analytics-event="{"location":"navbar","action":"ai","context":"resources","tag":"link","label":"ai_link_resources_navbar"}" href="/resources/articles/ai"> AI </a></li> <li> <a class="HeaderMenu-dropdown-link d-block no-underline position-relative py-2 Link--secondary" data-analytics-event="{"location":"navbar","action":"devops","context":"resources","tag":"link","label":"devops_link_resources_navbar"}" href="/resources/articles/devops"> DevOps </a></li> <li> <a class="HeaderMenu-dropdown-link d-block no-underline position-relative py-2 Link--secondary" data-analytics-event="{"location":"navbar","action":"security","context":"resources","tag":"link","label":"security_link_resources_navbar"}" href="/resources/articles/security"> Security </a></li> <li> <a class="HeaderMenu-dropdown-link d-block no-underline position-relative py-2 Link--secondary" data-analytics-event="{"location":"navbar","action":"software_development","context":"resources","tag":"link","label":"software_development_link_resources_navbar"}" href="/resources/articles/software-development"> Software Development </a></li> <li> <a class="HeaderMenu-dropdown-link d-block no-underline position-relative py-2 Link--secondary" data-analytics-event="{"location":"navbar","action":"view_all","context":"resources","tag":"link","label":"view_all_link_resources_navbar"}" href="/resources/articles"> View all </a></li> </ul> </div> </div> <div class="HeaderMenu-column px-lg-4"> <div class="border-bottom pb-3 pb-lg-0 border-lg-bottom-0 border-bottom-0"> <span class="d-block h4 color-fg-default my-1" id="resources-explore-heading">Explore</span> <ul class="list-style-none f5" aria-labelledby="resources-explore-heading"> <li> <a class="HeaderMenu-dropdown-link d-block no-underline position-relative py-2 Link--secondary Link--external" target="_blank" data-analytics-event="{"location":"navbar","action":"learning_pathways","context":"resources","tag":"link","label":"learning_pathways_link_resources_navbar"}" href="https://resources.github.com/learn/pathways"> Learning Pathways <svg aria-hidden="true" height="16" viewBox="0 0 16 16" version="1.1" width="16" data-view-component="true" class="octicon octicon-link-external HeaderMenu-external-icon color-fg-subtle"> <path d="M3.75 2h3.5a.75.75 0 0 1 0 1.5h-3.5a.25.25 0 0 0-.25.25v8.5c0 .138.112.25.25.25h8.5a.25.25 0 0 0 .25-.25v-3.5a.75.75 0 0 1 1.5 0v3.5A1.75 1.75 0 0 1 12.25 14h-8.5A1.75 1.75 0 0 1 2 12.25v-8.5C2 2.784 2.784 2 3.75 2Zm6.854-1h4.146a.25.25 0 0 1 .25.25v4.146a.25.25 0 0 1-.427.177L13.03 4.03 9.28 7.78a.751.751 0 0 1-1.042-.018.751.751 0 0 1-.018-1.042l3.75-3.75-1.543-1.543A.25.25 0 0 1 10.604 1Z"></path> </svg> </a></li> <li> <a class="HeaderMenu-dropdown-link d-block no-underline position-relative py-2 Link--secondary Link--external" target="_blank" data-analytics-event="{"location":"navbar","action":"white_papers_ebooks_webinars","context":"resources","tag":"link","label":"white_papers_ebooks_webinars_link_resources_navbar"}" href="https://resources.github.com"> White papers, Ebooks, Webinars <svg aria-hidden="true" height="16" viewBox="0 0 16 16" version="1.1" width="16" data-view-component="true" class="octicon octicon-link-external HeaderMenu-external-icon color-fg-subtle"> <path d="M3.75 2h3.5a.75.75 0 0 1 0 1.5h-3.5a.25.25 0 0 0-.25.25v8.5c0 .138.112.25.25.25h8.5a.25.25 0 0 0 .25-.25v-3.5a.75.75 0 0 1 1.5 0v3.5A1.75 1.75 0 0 1 12.25 14h-8.5A1.75 1.75 0 0 1 2 12.25v-8.5C2 2.784 2.784 2 3.75 2Zm6.854-1h4.146a.25.25 0 0 1 .25.25v4.146a.25.25 0 0 1-.427.177L13.03 4.03 9.28 7.78a.751.751 0 0 1-1.042-.018.751.751 0 0 1-.018-1.042l3.75-3.75-1.543-1.543A.25.25 0 0 1 10.604 1Z"></path> </svg> </a></li> <li> <a class="HeaderMenu-dropdown-link d-block no-underline position-relative py-2 Link--secondary" data-analytics-event="{"location":"navbar","action":"customer_stories","context":"resources","tag":"link","label":"customer_stories_link_resources_navbar"}" href="https://github.com/customer-stories"> Customer Stories </a></li> <li> <a class="HeaderMenu-dropdown-link d-block no-underline position-relative py-2 Link--secondary Link--external" target="_blank" data-analytics-event="{"location":"navbar","action":"partners","context":"resources","tag":"link","label":"partners_link_resources_navbar"}" href="https://partner.github.com"> Partners <svg aria-hidden="true" height="16" viewBox="0 0 16 16" version="1.1" width="16" data-view-component="true" class="octicon octicon-link-external HeaderMenu-external-icon color-fg-subtle"> <path d="M3.75 2h3.5a.75.75 0 0 1 0 1.5h-3.5a.25.25 0 0 0-.25.25v8.5c0 .138.112.25.25.25h8.5a.25.25 0 0 0 .25-.25v-3.5a.75.75 0 0 1 1.5 0v3.5A1.75 1.75 0 0 1 12.25 14h-8.5A1.75 1.75 0 0 1 2 12.25v-8.5C2 2.784 2.784 2 3.75 2Zm6.854-1h4.146a.25.25 0 0 1 .25.25v4.146a.25.25 0 0 1-.427.177L13.03 4.03 9.28 7.78a.751.751 0 0 1-1.042-.018.751.751 0 0 1-.018-1.042l3.75-3.75-1.543-1.543A.25.25 0 0 1 10.604 1Z"></path> </svg> </a></li> </ul> </div> </div> </div> </li> <li class="HeaderMenu-item position-relative flex-wrap flex-justify-between flex-items-center d-block d-lg-flex flex-lg-nowrap flex-lg-items-center js-details-container js-header-menu-item"> <button type="button" class="HeaderMenu-link border-0 width-full width-lg-auto px-0 px-lg-2 py-lg-2 no-wrap d-flex flex-items-center flex-justify-between js-details-target" aria-expanded="false"> Open Source <svg opacity="0.5" aria-hidden="true" height="16" viewBox="0 0 16 16" version="1.1" width="16" data-view-component="true" class="octicon octicon-chevron-down HeaderMenu-icon ml-1"> <path d="M12.78 5.22a.749.749 0 0 1 0 1.06l-4.25 4.25a.749.749 0 0 1-1.06 0L3.22 6.28a.749.749 0 1 1 1.06-1.06L8 8.939l3.72-3.719a.749.749 0 0 1 1.06 0Z"></path> </svg> </button> <div class="HeaderMenu-dropdown dropdown-menu rounded m-0 p-0 pt-2 pt-lg-4 position-relative position-lg-absolute left-0 left-lg-n3 pb-2 pb-lg-4 px-lg-4"> <div class="HeaderMenu-column"> <div class="border-bottom pb-3 pb-lg-0 pb-lg-3 mb-3 mb-lg-0 mb-lg-3"> <ul class="list-style-none f5" > <li> <a class="HeaderMenu-dropdown-link d-block no-underline position-relative py-2 Link--secondary d-flex flex-items-center Link--has-description" data-analytics-event="{"location":"navbar","action":"github_sponsors","context":"open_source","tag":"link","label":"github_sponsors_link_open_source_navbar"}" href="/sponsors"> <div> <div class="color-fg-default h4">GitHub Sponsors</div> Fund open source developers </div> </a></li> </ul> </div> <div class="border-bottom pb-3 pb-lg-0 pb-lg-3 mb-3 mb-lg-0 mb-lg-3"> <ul class="list-style-none f5" > <li> <a class="HeaderMenu-dropdown-link d-block no-underline position-relative py-2 Link--secondary d-flex flex-items-center Link--has-description" data-analytics-event="{"location":"navbar","action":"the_readme_project","context":"open_source","tag":"link","label":"the_readme_project_link_open_source_navbar"}" href="https://github.com/readme"> <div> <div class="color-fg-default h4">The ReadME Project</div> GitHub community articles </div> </a></li> </ul> </div> <div class="border-bottom pb-3 pb-lg-0 border-bottom-0"> <span class="d-block h4 color-fg-default my-1" id="open-source-repositories-heading">Repositories</span> <ul class="list-style-none f5" aria-labelledby="open-source-repositories-heading"> <li> <a class="HeaderMenu-dropdown-link d-block no-underline position-relative py-2 Link--secondary" data-analytics-event="{"location":"navbar","action":"topics","context":"open_source","tag":"link","label":"topics_link_open_source_navbar"}" href="https://github.com/topics"> Topics </a></li> <li> <a class="HeaderMenu-dropdown-link d-block no-underline position-relative py-2 Link--secondary" data-analytics-event="{"location":"navbar","action":"trending","context":"open_source","tag":"link","label":"trending_link_open_source_navbar"}" href="https://github.com/trending"> Trending </a></li> <li> <a class="HeaderMenu-dropdown-link d-block no-underline position-relative py-2 Link--secondary" data-analytics-event="{"location":"navbar","action":"collections","context":"open_source","tag":"link","label":"collections_link_open_source_navbar"}" href="https://github.com/collections"> Collections </a></li> </ul> </div> </div> </div> </li> <li class="HeaderMenu-item position-relative flex-wrap flex-justify-between flex-items-center d-block d-lg-flex flex-lg-nowrap flex-lg-items-center js-details-container js-header-menu-item"> <button type="button" class="HeaderMenu-link border-0 width-full width-lg-auto px-0 px-lg-2 py-lg-2 no-wrap d-flex flex-items-center flex-justify-between js-details-target" aria-expanded="false"> Enterprise <svg opacity="0.5" aria-hidden="true" height="16" viewBox="0 0 16 16" version="1.1" width="16" data-view-component="true" class="octicon octicon-chevron-down HeaderMenu-icon ml-1"> <path d="M12.78 5.22a.749.749 0 0 1 0 1.06l-4.25 4.25a.749.749 0 0 1-1.06 0L3.22 6.28a.749.749 0 1 1 1.06-1.06L8 8.939l3.72-3.719a.749.749 0 0 1 1.06 0Z"></path> </svg> </button> <div class="HeaderMenu-dropdown dropdown-menu rounded m-0 p-0 pt-2 pt-lg-4 position-relative position-lg-absolute left-0 left-lg-n3 pb-2 pb-lg-4 px-lg-4"> <div class="HeaderMenu-column"> <div class="border-bottom pb-3 pb-lg-0 pb-lg-3 mb-3 mb-lg-0 mb-lg-3"> <ul class="list-style-none f5" > <li> <a class="HeaderMenu-dropdown-link d-block no-underline position-relative py-2 Link--secondary d-flex flex-items-center Link--has-description" data-analytics-event="{"location":"navbar","action":"enterprise_platform","context":"enterprise","tag":"link","label":"enterprise_platform_link_enterprise_navbar"}" href="/enterprise"> <svg aria-hidden="true" height="24" viewBox="0 0 24 24" version="1.1" width="24" data-view-component="true" class="octicon octicon-stack color-fg-subtle mr-3"> <path d="M11.063 1.456a1.749 1.749 0 0 1 1.874 0l8.383 5.316a1.751 1.751 0 0 1 0 2.956l-8.383 5.316a1.749 1.749 0 0 1-1.874 0L2.68 9.728a1.751 1.751 0 0 1 0-2.956Zm1.071 1.267a.25.25 0 0 0-.268 0L3.483 8.039a.25.25 0 0 0 0 .422l8.383 5.316a.25.25 0 0 0 .268 0l8.383-5.316a.25.25 0 0 0 0-.422Z"></path><path d="M1.867 12.324a.75.75 0 0 1 1.035-.232l8.964 5.685a.25.25 0 0 0 .268 0l8.964-5.685a.75.75 0 0 1 .804 1.267l-8.965 5.685a1.749 1.749 0 0 1-1.874 0l-8.965-5.685a.75.75 0 0 1-.231-1.035Z"></path><path d="M1.867 16.324a.75.75 0 0 1 1.035-.232l8.964 5.685a.25.25 0 0 0 .268 0l8.964-5.685a.75.75 0 0 1 .804 1.267l-8.965 5.685a1.749 1.749 0 0 1-1.874 0l-8.965-5.685a.75.75 0 0 1-.231-1.035Z"></path> </svg> <div> <div class="color-fg-default h4">Enterprise platform</div> AI-powered developer platform </div> </a></li> </ul> </div> <div class="border-bottom pb-3 pb-lg-0 border-bottom-0"> <span class="d-block h4 color-fg-default my-1" id="enterprise-available-add-ons-heading">Available add-ons</span> <ul class="list-style-none f5" aria-labelledby="enterprise-available-add-ons-heading"> <li> <a class="HeaderMenu-dropdown-link d-block no-underline position-relative py-2 Link--secondary d-flex flex-items-center Link--has-description pb-lg-3" data-analytics-event="{"location":"navbar","action":"advanced_security","context":"enterprise","tag":"link","label":"advanced_security_link_enterprise_navbar"}" href="https://github.com/enterprise/advanced-security"> <svg aria-hidden="true" height="24" viewBox="0 0 24 24" version="1.1" width="24" data-view-component="true" class="octicon octicon-shield-check color-fg-subtle mr-3"> <path d="M16.53 9.78a.75.75 0 0 0-1.06-1.06L11 13.19l-1.97-1.97a.75.75 0 0 0-1.06 1.06l2.5 2.5a.75.75 0 0 0 1.06 0l5-5Z"></path><path d="m12.54.637 8.25 2.675A1.75 1.75 0 0 1 22 4.976V10c0 6.19-3.771 10.704-9.401 12.83a1.704 1.704 0 0 1-1.198 0C5.77 20.705 2 16.19 2 10V4.976c0-.758.489-1.43 1.21-1.664L11.46.637a1.748 1.748 0 0 1 1.08 0Zm-.617 1.426-8.25 2.676a.249.249 0 0 0-.173.237V10c0 5.46 3.28 9.483 8.43 11.426a.199.199 0 0 0 .14 0C17.22 19.483 20.5 15.461 20.5 10V4.976a.25.25 0 0 0-.173-.237l-8.25-2.676a.253.253 0 0 0-.154 0Z"></path> </svg> <div> <div class="color-fg-default h4">Advanced Security</div> Enterprise-grade security features </div> </a></li> <li> <a class="HeaderMenu-dropdown-link d-block no-underline position-relative py-2 Link--secondary d-flex flex-items-center Link--has-description pb-lg-3" data-analytics-event="{"location":"navbar","action":"github_copilot","context":"enterprise","tag":"link","label":"github_copilot_link_enterprise_navbar"}" href="/features/copilot#enterprise"> <svg aria-hidden="true" height="24" viewBox="0 0 24 24" version="1.1" width="24" data-view-component="true" class="octicon octicon-copilot color-fg-subtle mr-3"> <path d="M23.922 16.992c-.861 1.495-5.859 5.023-11.922 5.023-6.063 0-11.061-3.528-11.922-5.023A.641.641 0 0 1 0 16.736v-2.869a.841.841 0 0 1 .053-.22c.372-.935 1.347-2.292 2.605-2.656.167-.429.414-1.055.644-1.517a10.195 10.195 0 0 1-.052-1.086c0-1.331.282-2.499 1.132-3.368.397-.406.89-.717 1.474-.952 1.399-1.136 3.392-2.093 6.122-2.093 2.731 0 4.767.957 6.166 2.093.584.235 1.077.546 1.474.952.85.869 1.132 2.037 1.132 3.368 0 .368-.014.733-.052 1.086.23.462.477 1.088.644 1.517 1.258.364 2.233 1.721 2.605 2.656a.832.832 0 0 1 .053.22v2.869a.641.641 0 0 1-.078.256ZM12.172 11h-.344a4.323 4.323 0 0 1-.355.508C10.703 12.455 9.555 13 7.965 13c-1.725 0-2.989-.359-3.782-1.259a2.005 2.005 0 0 1-.085-.104L4 11.741v6.585c1.435.779 4.514 2.179 8 2.179 3.486 0 6.565-1.4 8-2.179v-6.585l-.098-.104s-.033.045-.085.104c-.793.9-2.057 1.259-3.782 1.259-1.59 0-2.738-.545-3.508-1.492a4.323 4.323 0 0 1-.355-.508h-.016.016Zm.641-2.935c.136 1.057.403 1.913.878 2.497.442.544 1.134.938 2.344.938 1.573 0 2.292-.337 2.657-.751.384-.435.558-1.15.558-2.361 0-1.14-.243-1.847-.705-2.319-.477-.488-1.319-.862-2.824-1.025-1.487-.161-2.192.138-2.533.529-.269.307-.437.808-.438 1.578v.021c0 .265.021.562.063.893Zm-1.626 0c.042-.331.063-.628.063-.894v-.02c-.001-.77-.169-1.271-.438-1.578-.341-.391-1.046-.69-2.533-.529-1.505.163-2.347.537-2.824 1.025-.462.472-.705 1.179-.705 2.319 0 1.211.175 1.926.558 2.361.365.414 1.084.751 2.657.751 1.21 0 1.902-.394 2.344-.938.475-.584.742-1.44.878-2.497Z"></path><path d="M14.5 14.25a1 1 0 0 1 1 1v2a1 1 0 0 1-2 0v-2a1 1 0 0 1 1-1Zm-5 0a1 1 0 0 1 1 1v2a1 1 0 0 1-2 0v-2a1 1 0 0 1 1-1Z"></path> </svg> <div> <div class="color-fg-default h4">GitHub Copilot</div> Enterprise-grade AI features </div> </a></li> <li> <a class="HeaderMenu-dropdown-link d-block no-underline position-relative py-2 Link--secondary d-flex flex-items-center Link--has-description" data-analytics-event="{"location":"navbar","action":"premium_support","context":"enterprise","tag":"link","label":"premium_support_link_enterprise_navbar"}" href="/premium-support"> <svg aria-hidden="true" height="24" viewBox="0 0 24 24" version="1.1" width="24" data-view-component="true" class="octicon octicon-comment-discussion color-fg-subtle mr-3"> <path d="M1.75 1h12.5c.966 0 1.75.784 1.75 1.75v9.5A1.75 1.75 0 0 1 14.25 14H8.061l-2.574 2.573A1.458 1.458 0 0 1 3 15.543V14H1.75A1.75 1.75 0 0 1 0 12.25v-9.5C0 1.784.784 1 1.75 1ZM1.5 2.75v9.5c0 .138.112.25.25.25h2a.75.75 0 0 1 .75.75v2.19l2.72-2.72a.749.749 0 0 1 .53-.22h6.5a.25.25 0 0 0 .25-.25v-9.5a.25.25 0 0 0-.25-.25H1.75a.25.25 0 0 0-.25.25Z"></path><path d="M22.5 8.75a.25.25 0 0 0-.25-.25h-3.5a.75.75 0 0 1 0-1.5h3.5c.966 0 1.75.784 1.75 1.75v9.5A1.75 1.75 0 0 1 22.25 20H21v1.543a1.457 1.457 0 0 1-2.487 1.03L15.939 20H10.75A1.75 1.75 0 0 1 9 18.25v-1.465a.75.75 0 0 1 1.5 0v1.465c0 .138.112.25.25.25h5.5a.75.75 0 0 1 .53.22l2.72 2.72v-2.19a.75.75 0 0 1 .75-.75h2a.25.25 0 0 0 .25-.25v-9.5Z"></path> </svg> <div> <div class="color-fg-default h4">Premium Support</div> Enterprise-grade 24/7 support </div> </a></li> </ul> </div> </div> </div> </li> <li class="HeaderMenu-item position-relative flex-wrap flex-justify-between flex-items-center d-block d-lg-flex flex-lg-nowrap flex-lg-items-center js-details-container js-header-menu-item"> <a class="HeaderMenu-link no-underline px-0 px-lg-2 py-3 py-lg-2 d-block d-lg-inline-block" data-analytics-event="{"location":"navbar","action":"pricing","context":"global","tag":"link","label":"pricing_link_global_navbar"}" href="https://github.com/pricing">Pricing</a> </li> </ul> </nav> <div class="d-flex flex-column flex-lg-row width-full flex-justify-end flex-lg-items-center text-center mt-3 mt-lg-0 text-lg-left ml-lg-3"> <qbsearch-input class="search-input" data-scope="repo:RenderKit/oidn" data-custom-scopes-path="/search/custom_scopes" data-delete-custom-scopes-csrf="dDjY-dqcZSPqmi7JKIN8V_UFSux5_50_01sKQNXf4MmtryzBhSu8X9h0RYMUD0sazxTc0IPhok4rc6vLS1iXFw" data-max-custom-scopes="10" data-header-redesign-enabled="false" data-initial-value="" data-blackbird-suggestions-path="/search/suggestions" data-jump-to-suggestions-path="/_graphql/GetSuggestedNavigationDestinations" data-current-repository="RenderKit/oidn" data-current-org="RenderKit" data-current-owner="" data-logged-in="false" data-copilot-chat-enabled="false" data-nl-search-enabled="false" data-retain-scroll-position="true"> <div class="search-input-container search-with-dialog position-relative d-flex flex-row flex-items-center mr-4 rounded" data-action="click:qbsearch-input#searchInputContainerClicked" > <button type="button" class="header-search-button placeholder input-button form-control d-flex flex-1 flex-self-stretch flex-items-center no-wrap width-full py-0 pl-2 pr-0 text-left border-0 box-shadow-none" data-target="qbsearch-input.inputButton" aria-label="Search or jump to…" aria-haspopup="dialog" placeholder="Search or jump to..." data-hotkey=s,/ autocapitalize="off" data-analytics-event="{"location":"navbar","action":"searchbar","context":"global","tag":"input","label":"searchbar_input_global_navbar"}" data-action="click:qbsearch-input#handleExpand" > <div class="mr-2 color-fg-muted"> <svg aria-hidden="true" height="16" viewBox="0 0 16 16" version="1.1" width="16" data-view-component="true" class="octicon octicon-search"> <path d="M10.68 11.74a6 6 0 0 1-7.922-8.982 6 6 0 0 1 8.982 7.922l3.04 3.04a.749.749 0 0 1-.326 1.275.749.749 0 0 1-.734-.215ZM11.5 7a4.499 4.499 0 1 0-8.997 0A4.499 4.499 0 0 0 11.5 7Z"></path> </svg> </div> <span class="flex-1" data-target="qbsearch-input.inputButtonText">Search or jump to...</span> <div class="d-flex" data-target="qbsearch-input.hotkeyIndicator"> <svg xmlns="http://www.w3.org/2000/svg" width="22" height="20" aria-hidden="true" class="mr-1"><path fill="none" stroke="#979A9C" opacity=".4" d="M3.5.5h12c1.7 0 3 1.3 3 3v13c0 1.7-1.3 3-3 3h-12c-1.7 0-3-1.3-3-3v-13c0-1.7 1.3-3 3-3z"></path><path fill="#979A9C" d="M11.8 6L8 15.1h-.9L10.8 6h1z"></path></svg> </div> </button> <input type="hidden" name="type" class="js-site-search-type-field"> <div class="Overlay--hidden " data-modal-dialog-overlay> <modal-dialog data-action="close:qbsearch-input#handleClose cancel:qbsearch-input#handleClose" data-target="qbsearch-input.searchSuggestionsDialog" role="dialog" id="search-suggestions-dialog" aria-modal="true" aria-labelledby="search-suggestions-dialog-header" data-view-component="true" class="Overlay Overlay--width-large Overlay--height-auto"> <h1 id="search-suggestions-dialog-header" class="sr-only">Search code, repositories, users, issues, pull requests...</h1> <div class="Overlay-body Overlay-body--paddingNone"> <div data-view-component="true"> <div class="search-suggestions position-fixed width-full color-shadow-large border color-fg-default color-bg-default overflow-hidden d-flex flex-column query-builder-container" style="border-radius: 12px;" data-target="qbsearch-input.queryBuilderContainer" hidden > <!-- '"` --><!-- </textarea></xmp> --></option></form><form id="query-builder-test-form" action="" accept-charset="UTF-8" method="get"> <query-builder data-target="qbsearch-input.queryBuilder" id="query-builder-query-builder-test" data-filter-key=":" data-view-component="true" class="QueryBuilder search-query-builder"> <div class="FormControl FormControl--fullWidth"> <label id="query-builder-test-label" for="query-builder-test" class="FormControl-label sr-only"> Search </label> <div class="QueryBuilder-StyledInput width-fit " data-target="query-builder.styledInput" > <span id="query-builder-test-leadingvisual-wrap" class="FormControl-input-leadingVisualWrap QueryBuilder-leadingVisualWrap"> <svg aria-hidden="true" height="16" viewBox="0 0 16 16" version="1.1" width="16" data-view-component="true" class="octicon octicon-search FormControl-input-leadingVisual"> <path d="M10.68 11.74a6 6 0 0 1-7.922-8.982 6 6 0 0 1 8.982 7.922l3.04 3.04a.749.749 0 0 1-.326 1.275.749.749 0 0 1-.734-.215ZM11.5 7a4.499 4.499 0 1 0-8.997 0A4.499 4.499 0 0 0 11.5 7Z"></path> </svg> </span> <div data-target="query-builder.styledInputContainer" class="QueryBuilder-StyledInputContainer"> <div aria-hidden="true" class="QueryBuilder-StyledInputContent" data-target="query-builder.styledInputContent" ></div> <div class="QueryBuilder-InputWrapper"> <div aria-hidden="true" class="QueryBuilder-Sizer" data-target="query-builder.sizer"></div> <input id="query-builder-test" name="query-builder-test" value="" autocomplete="off" type="text" role="combobox" spellcheck="false" aria-expanded="false" aria-describedby="validation-2ff81339-d687-48fa-aee0-659128893954" data-target="query-builder.input" data-action=" input:query-builder#inputChange blur:query-builder#inputBlur keydown:query-builder#inputKeydown focus:query-builder#inputFocus " data-view-component="true" class="FormControl-input QueryBuilder-Input FormControl-medium" /> </div> </div> <span class="sr-only" id="query-builder-test-clear">Clear</span> <button role="button" id="query-builder-test-clear-button" aria-labelledby="query-builder-test-clear query-builder-test-label" data-target="query-builder.clearButton" data-action=" click:query-builder#clear focus:query-builder#clearButtonFocus blur:query-builder#clearButtonBlur " variant="small" hidden="hidden" type="button" data-view-component="true" class="Button Button--iconOnly Button--invisible Button--medium mr-1 px-2 py-0 d-flex flex-items-center rounded-1 color-fg-muted"> <svg aria-hidden="true" height="16" viewBox="0 0 16 16" version="1.1" width="16" data-view-component="true" class="octicon octicon-x-circle-fill Button-visual"> <path d="M2.343 13.657A8 8 0 1 1 13.658 2.343 8 8 0 0 1 2.343 13.657ZM6.03 4.97a.751.751 0 0 0-1.042.018.751.751 0 0 0-.018 1.042L6.94 8 4.97 9.97a.749.749 0 0 0 .326 1.275.749.749 0 0 0 .734-.215L8 9.06l1.97 1.97a.749.749 0 0 0 1.275-.326.749.749 0 0 0-.215-.734L9.06 8l1.97-1.97a.749.749 0 0 0-.326-1.275.749.749 0 0 0-.734.215L8 6.94Z"></path> </svg> </button> </div> <template id="search-icon"> <svg aria-hidden="true" height="16" viewBox="0 0 16 16" version="1.1" width="16" data-view-component="true" class="octicon octicon-search"> <path d="M10.68 11.74a6 6 0 0 1-7.922-8.982 6 6 0 0 1 8.982 7.922l3.04 3.04a.749.749 0 0 1-.326 1.275.749.749 0 0 1-.734-.215ZM11.5 7a4.499 4.499 0 1 0-8.997 0A4.499 4.499 0 0 0 11.5 7Z"></path> </svg> </template> <template id="code-icon"> <svg aria-hidden="true" height="16" viewBox="0 0 16 16" version="1.1" width="16" data-view-component="true" class="octicon octicon-code"> <path d="m11.28 3.22 4.25 4.25a.75.75 0 0 1 0 1.06l-4.25 4.25a.749.749 0 0 1-1.275-.326.749.749 0 0 1 .215-.734L13.94 8l-3.72-3.72a.749.749 0 0 1 .326-1.275.749.749 0 0 1 .734.215Zm-6.56 0a.751.751 0 0 1 1.042.018.751.751 0 0 1 .018 1.042L2.06 8l3.72 3.72a.749.749 0 0 1-.326 1.275.749.749 0 0 1-.734-.215L.47 8.53a.75.75 0 0 1 0-1.06Z"></path> </svg> </template> <template id="file-code-icon"> <svg aria-hidden="true" height="16" viewBox="0 0 16 16" version="1.1" width="16" data-view-component="true" class="octicon octicon-file-code"> <path d="M4 1.75C4 .784 4.784 0 5.75 0h5.586c.464 0 .909.184 1.237.513l2.914 2.914c.329.328.513.773.513 1.237v8.586A1.75 1.75 0 0 1 14.25 15h-9a.75.75 0 0 1 0-1.5h9a.25.25 0 0 0 .25-.25V6h-2.75A1.75 1.75 0 0 1 10 4.25V1.5H5.75a.25.25 0 0 0-.25.25v2.5a.75.75 0 0 1-1.5 0Zm1.72 4.97a.75.75 0 0 1 1.06 0l2 2a.75.75 0 0 1 0 1.06l-2 2a.749.749 0 0 1-1.275-.326.749.749 0 0 1 .215-.734l1.47-1.47-1.47-1.47a.75.75 0 0 1 0-1.06ZM3.28 7.78 1.81 9.25l1.47 1.47a.751.751 0 0 1-.018 1.042.751.751 0 0 1-1.042.018l-2-2a.75.75 0 0 1 0-1.06l2-2a.751.751 0 0 1 1.042.018.751.751 0 0 1 .018 1.042Zm8.22-6.218V4.25c0 .138.112.25.25.25h2.688l-.011-.013-2.914-2.914-.013-.011Z"></path> </svg> </template> <template id="history-icon"> <svg aria-hidden="true" height="16" viewBox="0 0 16 16" version="1.1" width="16" data-view-component="true" class="octicon octicon-history"> <path d="m.427 1.927 1.215 1.215a8.002 8.002 0 1 1-1.6 5.685.75.75 0 1 1 1.493-.154 6.5 6.5 0 1 0 1.18-4.458l1.358 1.358A.25.25 0 0 1 3.896 6H.25A.25.25 0 0 1 0 5.75V2.104a.25.25 0 0 1 .427-.177ZM7.75 4a.75.75 0 0 1 .75.75v2.992l2.028.812a.75.75 0 0 1-.557 1.392l-2.5-1A.751.751 0 0 1 7 8.25v-3.5A.75.75 0 0 1 7.75 4Z"></path> </svg> </template> <template id="repo-icon"> <svg aria-hidden="true" height="16" viewBox="0 0 16 16" version="1.1" width="16" data-view-component="true" class="octicon octicon-repo"> <path d="M2 2.5A2.5 2.5 0 0 1 4.5 0h8.75a.75.75 0 0 1 .75.75v12.5a.75.75 0 0 1-.75.75h-2.5a.75.75 0 0 1 0-1.5h1.75v-2h-8a1 1 0 0 0-.714 1.7.75.75 0 1 1-1.072 1.05A2.495 2.495 0 0 1 2 11.5Zm10.5-1h-8a1 1 0 0 0-1 1v6.708A2.486 2.486 0 0 1 4.5 9h8ZM5 12.25a.25.25 0 0 1 .25-.25h3.5a.25.25 0 0 1 .25.25v3.25a.25.25 0 0 1-.4.2l-1.45-1.087a.249.249 0 0 0-.3 0L5.4 15.7a.25.25 0 0 1-.4-.2Z"></path> </svg> </template> <template id="bookmark-icon"> <svg aria-hidden="true" height="16" viewBox="0 0 16 16" version="1.1" width="16" data-view-component="true" class="octicon octicon-bookmark"> <path d="M3 2.75C3 1.784 3.784 1 4.75 1h6.5c.966 0 1.75.784 1.75 1.75v11.5a.75.75 0 0 1-1.227.579L8 11.722l-3.773 3.107A.751.751 0 0 1 3 14.25Zm1.75-.25a.25.25 0 0 0-.25.25v9.91l3.023-2.489a.75.75 0 0 1 .954 0l3.023 2.49V2.75a.25.25 0 0 0-.25-.25Z"></path> </svg> </template> <template id="plus-circle-icon"> <svg aria-hidden="true" height="16" viewBox="0 0 16 16" version="1.1" width="16" data-view-component="true" class="octicon octicon-plus-circle"> <path d="M8 0a8 8 0 1 1 0 16A8 8 0 0 1 8 0ZM1.5 8a6.5 6.5 0 1 0 13 0 6.5 6.5 0 0 0-13 0Zm7.25-3.25v2.5h2.5a.75.75 0 0 1 0 1.5h-2.5v2.5a.75.75 0 0 1-1.5 0v-2.5h-2.5a.75.75 0 0 1 0-1.5h2.5v-2.5a.75.75 0 0 1 1.5 0Z"></path> </svg> </template> <template id="circle-icon"> <svg aria-hidden="true" height="16" viewBox="0 0 16 16" version="1.1" width="16" data-view-component="true" class="octicon octicon-dot-fill"> <path d="M8 4a4 4 0 1 1 0 8 4 4 0 0 1 0-8Z"></path> </svg> </template> <template id="trash-icon"> <svg aria-hidden="true" height="16" viewBox="0 0 16 16" version="1.1" width="16" data-view-component="true" class="octicon octicon-trash"> <path d="M11 1.75V3h2.25a.75.75 0 0 1 0 1.5H2.75a.75.75 0 0 1 0-1.5H5V1.75C5 .784 5.784 0 6.75 0h2.5C10.216 0 11 .784 11 1.75ZM4.496 6.675l.66 6.6a.25.25 0 0 0 .249.225h5.19a.25.25 0 0 0 .249-.225l.66-6.6a.75.75 0 0 1 1.492.149l-.66 6.6A1.748 1.748 0 0 1 10.595 15h-5.19a1.75 1.75 0 0 1-1.741-1.575l-.66-6.6a.75.75 0 1 1 1.492-.15ZM6.5 1.75V3h3V1.75a.25.25 0 0 0-.25-.25h-2.5a.25.25 0 0 0-.25.25Z"></path> </svg> </template> <template id="team-icon"> <svg aria-hidden="true" height="16" viewBox="0 0 16 16" version="1.1" width="16" data-view-component="true" class="octicon octicon-people"> <path d="M2 5.5a3.5 3.5 0 1 1 5.898 2.549 5.508 5.508 0 0 1 3.034 4.084.75.75 0 1 1-1.482.235 4 4 0 0 0-7.9 0 .75.75 0 0 1-1.482-.236A5.507 5.507 0 0 1 3.102 8.05 3.493 3.493 0 0 1 2 5.5ZM11 4a3.001 3.001 0 0 1 2.22 5.018 5.01 5.01 0 0 1 2.56 3.012.749.749 0 0 1-.885.954.752.752 0 0 1-.549-.514 3.507 3.507 0 0 0-2.522-2.372.75.75 0 0 1-.574-.73v-.352a.75.75 0 0 1 .416-.672A1.5 1.5 0 0 0 11 5.5.75.75 0 0 1 11 4Zm-5.5-.5a2 2 0 1 0-.001 3.999A2 2 0 0 0 5.5 3.5Z"></path> </svg> </template> <template id="project-icon"> <svg aria-hidden="true" height="16" viewBox="0 0 16 16" version="1.1" width="16" data-view-component="true" class="octicon octicon-project"> <path d="M1.75 0h12.5C15.216 0 16 .784 16 1.75v12.5A1.75 1.75 0 0 1 14.25 16H1.75A1.75 1.75 0 0 1 0 14.25V1.75C0 .784.784 0 1.75 0ZM1.5 1.75v12.5c0 .138.112.25.25.25h12.5a.25.25 0 0 0 .25-.25V1.75a.25.25 0 0 0-.25-.25H1.75a.25.25 0 0 0-.25.25ZM11.75 3a.75.75 0 0 1 .75.75v7.5a.75.75 0 0 1-1.5 0v-7.5a.75.75 0 0 1 .75-.75Zm-8.25.75a.75.75 0 0 1 1.5 0v5.5a.75.75 0 0 1-1.5 0ZM8 3a.75.75 0 0 1 .75.75v3.5a.75.75 0 0 1-1.5 0v-3.5A.75.75 0 0 1 8 3Z"></path> </svg> </template> <template id="pencil-icon"> <svg aria-hidden="true" height="16" viewBox="0 0 16 16" version="1.1" width="16" data-view-component="true" class="octicon octicon-pencil"> <path d="M11.013 1.427a1.75 1.75 0 0 1 2.474 0l1.086 1.086a1.75 1.75 0 0 1 0 2.474l-8.61 8.61c-.21.21-.47.364-.756.445l-3.251.93a.75.75 0 0 1-.927-.928l.929-3.25c.081-.286.235-.547.445-.758l8.61-8.61Zm.176 4.823L9.75 4.81l-6.286 6.287a.253.253 0 0 0-.064.108l-.558 1.953 1.953-.558a.253.253 0 0 0 .108-.064Zm1.238-3.763a.25.25 0 0 0-.354 0L10.811 3.75l1.439 1.44 1.263-1.263a.25.25 0 0 0 0-.354Z"></path> </svg> </template> <template id="copilot-icon"> <svg aria-hidden="true" height="16" viewBox="0 0 16 16" version="1.1" width="16" data-view-component="true" class="octicon octicon-copilot"> <path d="M7.998 15.035c-4.562 0-7.873-2.914-7.998-3.749V9.338c.085-.628.677-1.686 1.588-2.065.013-.07.024-.143.036-.218.029-.183.06-.384.126-.612-.201-.508-.254-1.084-.254-1.656 0-.87.128-1.769.693-2.484.579-.733 1.494-1.124 2.724-1.261 1.206-.134 2.262.034 2.944.765.05.053.096.108.139.165.044-.057.094-.112.143-.165.682-.731 1.738-.899 2.944-.765 1.23.137 2.145.528 2.724 1.261.566.715.693 1.614.693 2.484 0 .572-.053 1.148-.254 1.656.066.228.098.429.126.612.012.076.024.148.037.218.924.385 1.522 1.471 1.591 2.095v1.872c0 .766-3.351 3.795-8.002 3.795Zm0-1.485c2.28 0 4.584-1.11 5.002-1.433V7.862l-.023-.116c-.49.21-1.075.291-1.727.291-1.146 0-2.059-.327-2.71-.991A3.222 3.222 0 0 1 8 6.303a3.24 3.24 0 0 1-.544.743c-.65.664-1.563.991-2.71.991-.652 0-1.236-.081-1.727-.291l-.023.116v4.255c.419.323 2.722 1.433 5.002 1.433ZM6.762 2.83c-.193-.206-.637-.413-1.682-.297-1.019.113-1.479.404-1.713.7-.247.312-.369.789-.369 1.554 0 .793.129 1.171.308 1.371.162.181.519.379 1.442.379.853 0 1.339-.235 1.638-.54.315-.322.527-.827.617-1.553.117-.935-.037-1.395-.241-1.614Zm4.155-.297c-1.044-.116-1.488.091-1.681.297-.204.219-.359.679-.242 1.614.091.726.303 1.231.618 1.553.299.305.784.54 1.638.54.922 0 1.28-.198 1.442-.379.179-.2.308-.578.308-1.371 0-.765-.123-1.242-.37-1.554-.233-.296-.693-.587-1.713-.7Z"></path><path d="M6.25 9.037a.75.75 0 0 1 .75.75v1.501a.75.75 0 0 1-1.5 0V9.787a.75.75 0 0 1 .75-.75Zm4.25.75v1.501a.75.75 0 0 1-1.5 0V9.787a.75.75 0 0 1 1.5 0Z"></path> </svg> </template> <template id="copilot-error-icon"> <svg aria-hidden="true" height="16" viewBox="0 0 16 16" version="1.1" width="16" data-view-component="true" class="octicon octicon-copilot-error"> <path d="M16 11.24c0 .112-.072.274-.21.467L13 9.688V7.862l-.023-.116c-.49.21-1.075.291-1.727.291-.198 0-.388-.009-.571-.029L6.833 5.226a4.01 4.01 0 0 0 .17-.782c.117-.935-.037-1.395-.241-1.614-.193-.206-.637-.413-1.682-.297-.683.076-1.115.231-1.395.415l-1.257-.91c.579-.564 1.413-.877 2.485-.996 1.206-.134 2.262.034 2.944.765.05.053.096.108.139.165.044-.057.094-.112.143-.165.682-.731 1.738-.899 2.944-.765 1.23.137 2.145.528 2.724 1.261.566.715.693 1.614.693 2.484 0 .572-.053 1.148-.254 1.656.066.228.098.429.126.612.012.076.024.148.037.218.924.385 1.522 1.471 1.591 2.095Zm-5.083-8.707c-1.044-.116-1.488.091-1.681.297-.204.219-.359.679-.242 1.614.091.726.303 1.231.618 1.553.299.305.784.54 1.638.54.922 0 1.28-.198 1.442-.379.179-.2.308-.578.308-1.371 0-.765-.123-1.242-.37-1.554-.233-.296-.693-.587-1.713-.7Zm2.511 11.074c-1.393.776-3.272 1.428-5.43 1.428-4.562 0-7.873-2.914-7.998-3.749V9.338c.085-.628.677-1.686 1.588-2.065.013-.07.024-.143.036-.218.029-.183.06-.384.126-.612-.18-.455-.241-.963-.252-1.475L.31 4.107A.747.747 0 0 1 0 3.509V3.49a.748.748 0 0 1 .625-.73c.156-.026.306.047.435.139l14.667 10.578a.592.592 0 0 1 .227.264.752.752 0 0 1 .046.249v.022a.75.75 0 0 1-1.19.596Zm-1.367-.991L5.635 7.964a5.128 5.128 0 0 1-.889.073c-.652 0-1.236-.081-1.727-.291l-.023.116v4.255c.419.323 2.722 1.433 5.002 1.433 1.539 0 3.089-.505 4.063-.934Z"></path> </svg> </template> <template id="workflow-icon"> <svg aria-hidden="true" height="16" viewBox="0 0 16 16" version="1.1" width="16" data-view-component="true" class="octicon octicon-workflow"> <path d="M0 1.75C0 .784.784 0 1.75 0h3.5C6.216 0 7 .784 7 1.75v3.5A1.75 1.75 0 0 1 5.25 7H4v4a1 1 0 0 0 1 1h4v-1.25C9 9.784 9.784 9 10.75 9h3.5c.966 0 1.75.784 1.75 1.75v3.5A1.75 1.75 0 0 1 14.25 16h-3.5A1.75 1.75 0 0 1 9 14.25v-.75H5A2.5 2.5 0 0 1 2.5 11V7h-.75A1.75 1.75 0 0 1 0 5.25Zm1.75-.25a.25.25 0 0 0-.25.25v3.5c0 .138.112.25.25.25h3.5a.25.25 0 0 0 .25-.25v-3.5a.25.25 0 0 0-.25-.25Zm9 9a.25.25 0 0 0-.25.25v3.5c0 .138.112.25.25.25h3.5a.25.25 0 0 0 .25-.25v-3.5a.25.25 0 0 0-.25-.25Z"></path> </svg> </template> <template id="book-icon"> <svg aria-hidden="true" height="16" viewBox="0 0 16 16" version="1.1" width="16" data-view-component="true" class="octicon octicon-book"> <path d="M0 1.75A.75.75 0 0 1 .75 1h4.253c1.227 0 2.317.59 3 1.501A3.743 3.743 0 0 1 11.006 1h4.245a.75.75 0 0 1 .75.75v10.5a.75.75 0 0 1-.75.75h-4.507a2.25 2.25 0 0 0-1.591.659l-.622.621a.75.75 0 0 1-1.06 0l-.622-.621A2.25 2.25 0 0 0 5.258 13H.75a.75.75 0 0 1-.75-.75Zm7.251 10.324.004-5.073-.002-2.253A2.25 2.25 0 0 0 5.003 2.5H1.5v9h3.757a3.75 3.75 0 0 1 1.994.574ZM8.755 4.75l-.004 7.322a3.752 3.752 0 0 1 1.992-.572H14.5v-9h-3.495a2.25 2.25 0 0 0-2.25 2.25Z"></path> </svg> </template> <template id="code-review-icon"> <svg aria-hidden="true" height="16" viewBox="0 0 16 16" version="1.1" width="16" data-view-component="true" class="octicon octicon-code-review"> <path d="M1.75 1h12.5c.966 0 1.75.784 1.75 1.75v8.5A1.75 1.75 0 0 1 14.25 13H8.061l-2.574 2.573A1.458 1.458 0 0 1 3 14.543V13H1.75A1.75 1.75 0 0 1 0 11.25v-8.5C0 1.784.784 1 1.75 1ZM1.5 2.75v8.5c0 .138.112.25.25.25h2a.75.75 0 0 1 .75.75v2.19l2.72-2.72a.749.749 0 0 1 .53-.22h6.5a.25.25 0 0 0 .25-.25v-8.5a.25.25 0 0 0-.25-.25H1.75a.25.25 0 0 0-.25.25Zm5.28 1.72a.75.75 0 0 1 0 1.06L5.31 7l1.47 1.47a.751.751 0 0 1-.018 1.042.751.751 0 0 1-1.042.018l-2-2a.75.75 0 0 1 0-1.06l2-2a.75.75 0 0 1 1.06 0Zm2.44 0a.75.75 0 0 1 1.06 0l2 2a.75.75 0 0 1 0 1.06l-2 2a.751.751 0 0 1-1.042-.018.751.751 0 0 1-.018-1.042L10.69 7 9.22 5.53a.75.75 0 0 1 0-1.06Z"></path> </svg> </template> <template id="codespaces-icon"> <svg aria-hidden="true" height="16" viewBox="0 0 16 16" version="1.1" width="16" data-view-component="true" class="octicon octicon-codespaces"> <path d="M0 11.25c0-.966.784-1.75 1.75-1.75h12.5c.966 0 1.75.784 1.75 1.75v3A1.75 1.75 0 0 1 14.25 16H1.75A1.75 1.75 0 0 1 0 14.25Zm2-9.5C2 .784 2.784 0 3.75 0h8.5C13.216 0 14 .784 14 1.75v5a1.75 1.75 0 0 1-1.75 1.75h-8.5A1.75 1.75 0 0 1 2 6.75Zm1.75-.25a.25.25 0 0 0-.25.25v5c0 .138.112.25.25.25h8.5a.25.25 0 0 0 .25-.25v-5a.25.25 0 0 0-.25-.25Zm-2 9.5a.25.25 0 0 0-.25.25v3c0 .138.112.25.25.25h12.5a.25.25 0 0 0 .25-.25v-3a.25.25 0 0 0-.25-.25Z"></path><path d="M7 12.75a.75.75 0 0 1 .75-.75h4.5a.75.75 0 0 1 0 1.5h-4.5a.75.75 0 0 1-.75-.75Zm-4 0a.75.75 0 0 1 .75-.75h.5a.75.75 0 0 1 0 1.5h-.5a.75.75 0 0 1-.75-.75Z"></path> </svg> </template> <template id="comment-icon"> <svg aria-hidden="true" height="16" viewBox="0 0 16 16" version="1.1" width="16" data-view-component="true" class="octicon octicon-comment"> <path d="M1 2.75C1 1.784 1.784 1 2.75 1h10.5c.966 0 1.75.784 1.75 1.75v7.5A1.75 1.75 0 0 1 13.25 12H9.06l-2.573 2.573A1.458 1.458 0 0 1 4 13.543V12H2.75A1.75 1.75 0 0 1 1 10.25Zm1.75-.25a.25.25 0 0 0-.25.25v7.5c0 .138.112.25.25.25h2a.75.75 0 0 1 .75.75v2.19l2.72-2.72a.749.749 0 0 1 .53-.22h4.5a.25.25 0 0 0 .25-.25v-7.5a.25.25 0 0 0-.25-.25Z"></path> </svg> </template> <template id="comment-discussion-icon"> <svg aria-hidden="true" height="16" viewBox="0 0 16 16" version="1.1" width="16" data-view-component="true" class="octicon octicon-comment-discussion"> <path d="M1.75 1h8.5c.966 0 1.75.784 1.75 1.75v5.5A1.75 1.75 0 0 1 10.25 10H7.061l-2.574 2.573A1.458 1.458 0 0 1 2 11.543V10h-.25A1.75 1.75 0 0 1 0 8.25v-5.5C0 1.784.784 1 1.75 1ZM1.5 2.75v5.5c0 .138.112.25.25.25h1a.75.75 0 0 1 .75.75v2.19l2.72-2.72a.749.749 0 0 1 .53-.22h3.5a.25.25 0 0 0 .25-.25v-5.5a.25.25 0 0 0-.25-.25h-8.5a.25.25 0 0 0-.25.25Zm13 2a.25.25 0 0 0-.25-.25h-.5a.75.75 0 0 1 0-1.5h.5c.966 0 1.75.784 1.75 1.75v5.5A1.75 1.75 0 0 1 14.25 12H14v1.543a1.458 1.458 0 0 1-2.487 1.03L9.22 12.28a.749.749 0 0 1 .326-1.275.749.749 0 0 1 .734.215l2.22 2.22v-2.19a.75.75 0 0 1 .75-.75h1a.25.25 0 0 0 .25-.25Z"></path> </svg> </template> <template id="organization-icon"> <svg aria-hidden="true" height="16" viewBox="0 0 16 16" version="1.1" width="16" data-view-component="true" class="octicon octicon-organization"> <path d="M1.75 16A1.75 1.75 0 0 1 0 14.25V1.75C0 .784.784 0 1.75 0h8.5C11.216 0 12 .784 12 1.75v12.5c0 .085-.006.168-.018.25h2.268a.25.25 0 0 0 .25-.25V8.285a.25.25 0 0 0-.111-.208l-1.055-.703a.749.749 0 1 1 .832-1.248l1.055.703c.487.325.779.871.779 1.456v5.965A1.75 1.75 0 0 1 14.25 16h-3.5a.766.766 0 0 1-.197-.026c-.099.017-.2.026-.303.026h-3a.75.75 0 0 1-.75-.75V14h-1v1.25a.75.75 0 0 1-.75.75Zm-.25-1.75c0 .138.112.25.25.25H4v-1.25a.75.75 0 0 1 .75-.75h2.5a.75.75 0 0 1 .75.75v1.25h2.25a.25.25 0 0 0 .25-.25V1.75a.25.25 0 0 0-.25-.25h-8.5a.25.25 0 0 0-.25.25ZM3.75 6h.5a.75.75 0 0 1 0 1.5h-.5a.75.75 0 0 1 0-1.5ZM3 3.75A.75.75 0 0 1 3.75 3h.5a.75.75 0 0 1 0 1.5h-.5A.75.75 0 0 1 3 3.75Zm4 3A.75.75 0 0 1 7.75 6h.5a.75.75 0 0 1 0 1.5h-.5A.75.75 0 0 1 7 6.75ZM7.75 3h.5a.75.75 0 0 1 0 1.5h-.5a.75.75 0 0 1 0-1.5ZM3 9.75A.75.75 0 0 1 3.75 9h.5a.75.75 0 0 1 0 1.5h-.5A.75.75 0 0 1 3 9.75ZM7.75 9h.5a.75.75 0 0 1 0 1.5h-.5a.75.75 0 0 1 0-1.5Z"></path> </svg> </template> <template id="rocket-icon"> <svg aria-hidden="true" height="16" viewBox="0 0 16 16" version="1.1" width="16" data-view-component="true" class="octicon octicon-rocket"> <path d="M14.064 0h.186C15.216 0 16 .784 16 1.75v.186a8.752 8.752 0 0 1-2.564 6.186l-.458.459c-.314.314-.641.616-.979.904v3.207c0 .608-.315 1.172-.833 1.49l-2.774 1.707a.749.749 0 0 1-1.11-.418l-.954-3.102a1.214 1.214 0 0 1-.145-.125L3.754 9.816a1.218 1.218 0 0 1-.124-.145L.528 8.717a.749.749 0 0 1-.418-1.11l1.71-2.774A1.748 1.748 0 0 1 3.31 4h3.204c.288-.338.59-.665.904-.979l.459-.458A8.749 8.749 0 0 1 14.064 0ZM8.938 3.623h-.002l-.458.458c-.76.76-1.437 1.598-2.02 2.5l-1.5 2.317 2.143 2.143 2.317-1.5c.902-.583 1.74-1.26 2.499-2.02l.459-.458a7.25 7.25 0 0 0 2.123-5.127V1.75a.25.25 0 0 0-.25-.25h-.186a7.249 7.249 0 0 0-5.125 2.123ZM3.56 14.56c-.732.732-2.334 1.045-3.005 1.148a.234.234 0 0 1-.201-.064.234.234 0 0 1-.064-.201c.103-.671.416-2.273 1.15-3.003a1.502 1.502 0 1 1 2.12 2.12Zm6.94-3.935c-.088.06-.177.118-.266.175l-2.35 1.521.548 1.783 1.949-1.2a.25.25 0 0 0 .119-.213ZM3.678 8.116 5.2 5.766c.058-.09.117-.178.176-.266H3.309a.25.25 0 0 0-.213.119l-1.2 1.95ZM12 5a1 1 0 1 1-2 0 1 1 0 0 1 2 0Z"></path> </svg> </template> <template id="shield-check-icon"> <svg aria-hidden="true" height="16" viewBox="0 0 16 16" version="1.1" width="16" data-view-component="true" class="octicon octicon-shield-check"> <path d="m8.533.133 5.25 1.68A1.75 1.75 0 0 1 15 3.48V7c0 1.566-.32 3.182-1.303 4.682-.983 1.498-2.585 2.813-5.032 3.855a1.697 1.697 0 0 1-1.33 0c-2.447-1.042-4.049-2.357-5.032-3.855C1.32 10.182 1 8.566 1 7V3.48a1.75 1.75 0 0 1 1.217-1.667l5.25-1.68a1.748 1.748 0 0 1 1.066 0Zm-.61 1.429.001.001-5.25 1.68a.251.251 0 0 0-.174.237V7c0 1.36.275 2.666 1.057 3.859.784 1.194 2.121 2.342 4.366 3.298a.196.196 0 0 0 .154 0c2.245-.957 3.582-2.103 4.366-3.297C13.225 9.666 13.5 8.358 13.5 7V3.48a.25.25 0 0 0-.174-.238l-5.25-1.68a.25.25 0 0 0-.153 0ZM11.28 6.28l-3.5 3.5a.75.75 0 0 1-1.06 0l-1.5-1.5a.749.749 0 0 1 .326-1.275.749.749 0 0 1 .734.215l.97.97 2.97-2.97a.751.751 0 0 1 1.042.018.751.751 0 0 1 .018 1.042Z"></path> </svg> </template> <template id="heart-icon"> <svg aria-hidden="true" height="16" viewBox="0 0 16 16" version="1.1" width="16" data-view-component="true" class="octicon octicon-heart"> <path d="m8 14.25.345.666a.75.75 0 0 1-.69 0l-.008-.004-.018-.01a7.152 7.152 0 0 1-.31-.17 22.055 22.055 0 0 1-3.434-2.414C2.045 10.731 0 8.35 0 5.5 0 2.836 2.086 1 4.25 1 5.797 1 7.153 1.802 8 3.02 8.847 1.802 10.203 1 11.75 1 13.914 1 16 2.836 16 5.5c0 2.85-2.045 5.231-3.885 6.818a22.066 22.066 0 0 1-3.744 2.584l-.018.01-.006.003h-.002ZM4.25 2.5c-1.336 0-2.75 1.164-2.75 3 0 2.15 1.58 4.144 3.365 5.682A20.58 20.58 0 0 0 8 13.393a20.58 20.58 0 0 0 3.135-2.211C12.92 9.644 14.5 7.65 14.5 5.5c0-1.836-1.414-3-2.75-3-1.373 0-2.609.986-3.029 2.456a.749.749 0 0 1-1.442 0C6.859 3.486 5.623 2.5 4.25 2.5Z"></path> </svg> </template> <template id="server-icon"> <svg aria-hidden="true" height="16" viewBox="0 0 16 16" version="1.1" width="16" data-view-component="true" class="octicon octicon-server"> <path d="M1.75 1h12.5c.966 0 1.75.784 1.75 1.75v4c0 .372-.116.717-.314 1 .198.283.314.628.314 1v4a1.75 1.75 0 0 1-1.75 1.75H1.75A1.75 1.75 0 0 1 0 12.75v-4c0-.358.109-.707.314-1a1.739 1.739 0 0 1-.314-1v-4C0 1.784.784 1 1.75 1ZM1.5 2.75v4c0 .138.112.25.25.25h12.5a.25.25 0 0 0 .25-.25v-4a.25.25 0 0 0-.25-.25H1.75a.25.25 0 0 0-.25.25Zm.25 5.75a.25.25 0 0 0-.25.25v4c0 .138.112.25.25.25h12.5a.25.25 0 0 0 .25-.25v-4a.25.25 0 0 0-.25-.25ZM7 4.75A.75.75 0 0 1 7.75 4h4.5a.75.75 0 0 1 0 1.5h-4.5A.75.75 0 0 1 7 4.75ZM7.75 10h4.5a.75.75 0 0 1 0 1.5h-4.5a.75.75 0 0 1 0-1.5ZM3 4.75A.75.75 0 0 1 3.75 4h.5a.75.75 0 0 1 0 1.5h-.5A.75.75 0 0 1 3 4.75ZM3.75 10h.5a.75.75 0 0 1 0 1.5h-.5a.75.75 0 0 1 0-1.5Z"></path> </svg> </template> <template id="globe-icon"> <svg aria-hidden="true" height="16" viewBox="0 0 16 16" version="1.1" width="16" data-view-component="true" class="octicon octicon-globe"> <path d="M8 0a8 8 0 1 1 0 16A8 8 0 0 1 8 0ZM5.78 8.75a9.64 9.64 0 0 0 1.363 4.177c.255.426.542.832.857 1.215.245-.296.551-.705.857-1.215A9.64 9.64 0 0 0 10.22 8.75Zm4.44-1.5a9.64 9.64 0 0 0-1.363-4.177c-.307-.51-.612-.919-.857-1.215a9.927 9.927 0 0 0-.857 1.215A9.64 9.64 0 0 0 5.78 7.25Zm-5.944 1.5H1.543a6.507 6.507 0 0 0 4.666 5.5c-.123-.181-.24-.365-.352-.552-.715-1.192-1.437-2.874-1.581-4.948Zm-2.733-1.5h2.733c.144-2.074.866-3.756 1.58-4.948.12-.197.237-.381.353-.552a6.507 6.507 0 0 0-4.666 5.5Zm10.181 1.5c-.144 2.074-.866 3.756-1.58 4.948-.12.197-.237.381-.353.552a6.507 6.507 0 0 0 4.666-5.5Zm2.733-1.5a6.507 6.507 0 0 0-4.666-5.5c.123.181.24.365.353.552.714 1.192 1.436 2.874 1.58 4.948Z"></path> </svg> </template> <template id="issue-opened-icon"> <svg aria-hidden="true" height="16" viewBox="0 0 16 16" version="1.1" width="16" data-view-component="true" class="octicon octicon-issue-opened"> <path d="M8 9.5a1.5 1.5 0 1 0 0-3 1.5 1.5 0 0 0 0 3Z"></path><path d="M8 0a8 8 0 1 1 0 16A8 8 0 0 1 8 0ZM1.5 8a6.5 6.5 0 1 0 13 0 6.5 6.5 0 0 0-13 0Z"></path> </svg> </template> <template id="device-mobile-icon"> <svg aria-hidden="true" height="16" viewBox="0 0 16 16" version="1.1" width="16" data-view-component="true" class="octicon octicon-device-mobile"> <path d="M3.75 0h8.5C13.216 0 14 .784 14 1.75v12.5A1.75 1.75 0 0 1 12.25 16h-8.5A1.75 1.75 0 0 1 2 14.25V1.75C2 .784 2.784 0 3.75 0ZM3.5 1.75v12.5c0 .138.112.25.25.25h8.5a.25.25 0 0 0 .25-.25V1.75a.25.25 0 0 0-.25-.25h-8.5a.25.25 0 0 0-.25.25ZM8 13a1 1 0 1 1 0-2 1 1 0 0 1 0 2Z"></path> </svg> </template> <template id="package-icon"> <svg aria-hidden="true" height="16" viewBox="0 0 16 16" version="1.1" width="16" data-view-component="true" class="octicon octicon-package"> <path d="m8.878.392 5.25 3.045c.54.314.872.89.872 1.514v6.098a1.75 1.75 0 0 1-.872 1.514l-5.25 3.045a1.75 1.75 0 0 1-1.756 0l-5.25-3.045A1.75 1.75 0 0 1 1 11.049V4.951c0-.624.332-1.201.872-1.514L7.122.392a1.75 1.75 0 0 1 1.756 0ZM7.875 1.69l-4.63 2.685L8 7.133l4.755-2.758-4.63-2.685a.248.248 0 0 0-.25 0ZM2.5 5.677v5.372c0 .09.047.171.125.216l4.625 2.683V8.432Zm6.25 8.271 4.625-2.683a.25.25 0 0 0 .125-.216V5.677L8.75 8.432Z"></path> </svg> </template> <template id="credit-card-icon"> <svg aria-hidden="true" height="16" viewBox="0 0 16 16" version="1.1" width="16" data-view-component="true" class="octicon octicon-credit-card"> <path d="M10.75 9a.75.75 0 0 0 0 1.5h1.5a.75.75 0 0 0 0-1.5h-1.5Z"></path><path d="M0 3.75C0 2.784.784 2 1.75 2h12.5c.966 0 1.75.784 1.75 1.75v8.5A1.75 1.75 0 0 1 14.25 14H1.75A1.75 1.75 0 0 1 0 12.25ZM14.5 6.5h-13v5.75c0 .138.112.25.25.25h12.5a.25.25 0 0 0 .25-.25Zm0-2.75a.25.25 0 0 0-.25-.25H1.75a.25.25 0 0 0-.25.25V5h13Z"></path> </svg> </template> <template id="play-icon"> <svg aria-hidden="true" height="16" viewBox="0 0 16 16" version="1.1" width="16" data-view-component="true" class="octicon octicon-play"> <path d="M8 0a8 8 0 1 1 0 16A8 8 0 0 1 8 0ZM1.5 8a6.5 6.5 0 1 0 13 0 6.5 6.5 0 0 0-13 0Zm4.879-2.773 4.264 2.559a.25.25 0 0 1 0 .428l-4.264 2.559A.25.25 0 0 1 6 10.559V5.442a.25.25 0 0 1 .379-.215Z"></path> </svg> </template> <template id="gift-icon"> <svg aria-hidden="true" height="16" viewBox="0 0 16 16" version="1.1" width="16" data-view-component="true" class="octicon octicon-gift"> <path d="M2 2.75A2.75 2.75 0 0 1 4.75 0c.983 0 1.873.42 2.57 1.232.268.318.497.668.68 1.042.183-.375.411-.725.68-1.044C9.376.42 10.266 0 11.25 0a2.75 2.75 0 0 1 2.45 4h.55c.966 0 1.75.784 1.75 1.75v2c0 .698-.409 1.301-1 1.582v4.918A1.75 1.75 0 0 1 13.25 16H2.75A1.75 1.75 0 0 1 1 14.25V9.332C.409 9.05 0 8.448 0 7.75v-2C0 4.784.784 4 1.75 4h.55c-.192-.375-.3-.8-.3-1.25ZM7.25 9.5H2.5v4.75c0 .138.112.25.25.25h4.5Zm1.5 0v5h4.5a.25.25 0 0 0 .25-.25V9.5Zm0-4V8h5.5a.25.25 0 0 0 .25-.25v-2a.25.25 0 0 0-.25-.25Zm-7 0a.25.25 0 0 0-.25.25v2c0 .138.112.25.25.25h5.5V5.5h-5.5Zm3-4a1.25 1.25 0 0 0 0 2.5h2.309c-.233-.818-.542-1.401-.878-1.793-.43-.502-.915-.707-1.431-.707ZM8.941 4h2.309a1.25 1.25 0 0 0 0-2.5c-.516 0-1 .205-1.43.707-.337.392-.646.975-.879 1.793Z"></path> </svg> </template> <template id="code-square-icon"> <svg aria-hidden="true" height="16" viewBox="0 0 16 16" version="1.1" width="16" data-view-component="true" class="octicon octicon-code-square"> <path d="M0 1.75C0 .784.784 0 1.75 0h12.5C15.216 0 16 .784 16 1.75v12.5A1.75 1.75 0 0 1 14.25 16H1.75A1.75 1.75 0 0 1 0 14.25Zm1.75-.25a.25.25 0 0 0-.25.25v12.5c0 .138.112.25.25.25h12.5a.25.25 0 0 0 .25-.25V1.75a.25.25 0 0 0-.25-.25Zm7.47 3.97a.75.75 0 0 1 1.06 0l2 2a.75.75 0 0 1 0 1.06l-2 2a.749.749 0 0 1-1.275-.326.749.749 0 0 1 .215-.734L10.69 8 9.22 6.53a.75.75 0 0 1 0-1.06ZM6.78 6.53 5.31 8l1.47 1.47a.749.749 0 0 1-.326 1.275.749.749 0 0 1-.734-.215l-2-2a.75.75 0 0 1 0-1.06l2-2a.751.751 0 0 1 1.042.018.751.751 0 0 1 .018 1.042Z"></path> </svg> </template> <template id="device-desktop-icon"> <svg aria-hidden="true" height="16" viewBox="0 0 16 16" version="1.1" width="16" data-view-component="true" class="octicon octicon-device-desktop"> <path d="M14.25 1c.966 0 1.75.784 1.75 1.75v7.5A1.75 1.75 0 0 1 14.25 12h-3.727c.099 1.041.52 1.872 1.292 2.757A.752.752 0 0 1 11.25 16h-6.5a.75.75 0 0 1-.565-1.243c.772-.885 1.192-1.716 1.292-2.757H1.75A1.75 1.75 0 0 1 0 10.25v-7.5C0 1.784.784 1 1.75 1ZM1.75 2.5a.25.25 0 0 0-.25.25v7.5c0 .138.112.25.25.25h12.5a.25.25 0 0 0 .25-.25v-7.5a.25.25 0 0 0-.25-.25ZM9.018 12H6.982a5.72 5.72 0 0 1-.765 2.5h3.566a5.72 5.72 0 0 1-.765-2.5Z"></path> </svg> </template> <div class="position-relative"> <ul role="listbox" class="ActionListWrap QueryBuilder-ListWrap" aria-label="Suggestions" data-action=" combobox-commit:query-builder#comboboxCommit mousedown:query-builder#resultsMousedown " data-target="query-builder.resultsList" data-persist-list=false id="query-builder-test-results" ></ul> </div> <div class="FormControl-inlineValidation" id="validation-2ff81339-d687-48fa-aee0-659128893954" hidden="hidden"> <span class="FormControl-inlineValidation--visual"> <svg aria-hidden="true" height="12" viewBox="0 0 12 12" version="1.1" width="12" data-view-component="true" class="octicon octicon-alert-fill"> <path d="M4.855.708c.5-.896 1.79-.896 2.29 0l4.675 8.351a1.312 1.312 0 0 1-1.146 1.954H1.33A1.313 1.313 0 0 1 .183 9.058ZM7 7V3H5v4Zm-1 3a1 1 0 1 0 0-2 1 1 0 0 0 0 2Z"></path> </svg> </span> <span></span> </div> </div> <div data-target="query-builder.screenReaderFeedback" aria-live="polite" aria-atomic="true" class="sr-only"></div> </query-builder></form> <div class="d-flex flex-row color-fg-muted px-3 text-small color-bg-default search-feedback-prompt"> <a target="_blank" href="https://docs.github.com/search-github/github-code-search/understanding-github-code-search-syntax" data-view-component="true" class="Link color-fg-accent text-normal ml-2"> Search syntax tips </a> <div class="d-flex flex-1"></div> </div> </div> </div> </div> </modal-dialog></div> </div> <div data-action="click:qbsearch-input#retract" class="dark-backdrop position-fixed" hidden data-target="qbsearch-input.darkBackdrop"></div> <div class="color-fg-default"> <dialog-helper> <dialog data-target="qbsearch-input.feedbackDialog" data-action="close:qbsearch-input#handleDialogClose cancel:qbsearch-input#handleDialogClose" id="feedback-dialog" aria-modal="true" aria-labelledby="feedback-dialog-title" aria-describedby="feedback-dialog-description" data-view-component="true" class="Overlay Overlay-whenNarrow Overlay--size-medium Overlay--motion-scaleFade Overlay--disableScroll"> <div data-view-component="true" class="Overlay-header"> <div class="Overlay-headerContentWrap"> <div class="Overlay-titleWrap"> <h1 class="Overlay-title " id="feedback-dialog-title"> Provide feedback </h1> </div> <div class="Overlay-actionWrap"> <button data-close-dialog-id="feedback-dialog" aria-label="Close" type="button" data-view-component="true" class="close-button Overlay-closeButton"><svg aria-hidden="true" height="16" viewBox="0 0 16 16" version="1.1" width="16" data-view-component="true" class="octicon octicon-x"> <path d="M3.72 3.72a.75.75 0 0 1 1.06 0L8 6.94l3.22-3.22a.749.749 0 0 1 1.275.326.749.749 0 0 1-.215.734L9.06 8l3.22 3.22a.749.749 0 0 1-.326 1.275.749.749 0 0 1-.734-.215L8 9.06l-3.22 3.22a.751.751 0 0 1-1.042-.018.751.751 0 0 1-.018-1.042L6.94 8 3.72 4.78a.75.75 0 0 1 0-1.06Z"></path> </svg></button> </div> </div> </div> <scrollable-region data-labelled-by="feedback-dialog-title"> <div data-view-component="true" class="Overlay-body"> <!-- '"` --><!-- </textarea></xmp> --></option></form><form id="code-search-feedback-form" data-turbo="false" action="/search/feedback" accept-charset="UTF-8" method="post"><input type="hidden" data-csrf="true" name="authenticity_token" value="tFumAscu35GbXuJXEq70MdbyF8yXDMIP6kuHiV1G1pYuWxyICAhOrfbnSGKcvr6BDUSIxJMhMv0c4X6jlvTm5A==" /> <p>We read every piece of feedback, and take your input very seriously.</p> <textarea name="feedback" class="form-control width-full mb-2" style="height: 120px" id="feedback"></textarea> <input name="include_email" id="include_email" aria-label="Include my email address so I can be contacted" class="form-control mr-2" type="checkbox"> <label for="include_email" style="font-weight: normal">Include my email address so I can be contacted</label> </form></div> </scrollable-region> <div data-view-component="true" class="Overlay-footer Overlay-footer--alignEnd"> <button data-close-dialog-id="feedback-dialog" type="button" data-view-component="true" class="btn"> Cancel </button> <button form="code-search-feedback-form" data-action="click:qbsearch-input#submitFeedback" type="submit" data-view-component="true" class="btn-primary btn"> Submit feedback </button> </div> </dialog></dialog-helper> <custom-scopes data-target="qbsearch-input.customScopesManager"> <dialog-helper> <dialog data-target="custom-scopes.customScopesModalDialog" data-action="close:qbsearch-input#handleDialogClose cancel:qbsearch-input#handleDialogClose" id="custom-scopes-dialog" aria-modal="true" aria-labelledby="custom-scopes-dialog-title" aria-describedby="custom-scopes-dialog-description" data-view-component="true" class="Overlay Overlay-whenNarrow Overlay--size-medium Overlay--motion-scaleFade Overlay--disableScroll"> <div data-view-component="true" class="Overlay-header Overlay-header--divided"> <div class="Overlay-headerContentWrap"> <div class="Overlay-titleWrap"> <h1 class="Overlay-title " id="custom-scopes-dialog-title"> Saved searches </h1> <h2 id="custom-scopes-dialog-description" class="Overlay-description">Use saved searches to filter your results more quickly</h2> </div> <div class="Overlay-actionWrap"> <button data-close-dialog-id="custom-scopes-dialog" aria-label="Close" type="button" data-view-component="true" class="close-button Overlay-closeButton"><svg aria-hidden="true" height="16" viewBox="0 0 16 16" version="1.1" width="16" data-view-component="true" class="octicon octicon-x"> <path d="M3.72 3.72a.75.75 0 0 1 1.06 0L8 6.94l3.22-3.22a.749.749 0 0 1 1.275.326.749.749 0 0 1-.215.734L9.06 8l3.22 3.22a.749.749 0 0 1-.326 1.275.749.749 0 0 1-.734-.215L8 9.06l-3.22 3.22a.751.751 0 0 1-1.042-.018.751.751 0 0 1-.018-1.042L6.94 8 3.72 4.78a.75.75 0 0 1 0-1.06Z"></path> </svg></button> </div> </div> </div> <scrollable-region data-labelled-by="custom-scopes-dialog-title"> <div data-view-component="true" class="Overlay-body"> <div data-target="custom-scopes.customScopesModalDialogFlash"></div> <div hidden class="create-custom-scope-form" data-target="custom-scopes.createCustomScopeForm"> <!-- '"` --><!-- </textarea></xmp> --></option></form><form id="custom-scopes-dialog-form" data-turbo="false" action="/search/custom_scopes" accept-charset="UTF-8" method="post"><input type="hidden" data-csrf="true" name="authenticity_token" value="ACOHRQasSQenwyOJqBus9QZ8cvvckE7tN9kp0fs1Vo4US32ozXgZyOS3+MbsBNrS+MGewR7JV2SEZhUt1qPxcA==" /> <div data-target="custom-scopes.customScopesModalDialogFlash"></div> <input type="hidden" id="custom_scope_id" name="custom_scope_id" data-target="custom-scopes.customScopesIdField"> <div class="form-group"> <label for="custom_scope_name">Name</label> <auto-check src="/search/custom_scopes/check_name" required> <input type="text" name="custom_scope_name" id="custom_scope_name" data-target="custom-scopes.customScopesNameField" class="form-control" autocomplete="off" placeholder="github-ruby" required maxlength="50"> <input type="hidden" data-csrf="true" value="i8cwpP+YNbXC05UW7dd5pNA9lCCaeZIdT48yxmIA5xyrclaYnToiUnXxqD6HmE4geW2+34oN0UtdnK8wNeLqLQ==" /> </auto-check> </div> <div class="form-group"> <label for="custom_scope_query">Query</label> <input type="text" name="custom_scope_query" id="custom_scope_query" data-target="custom-scopes.customScopesQueryField" class="form-control" autocomplete="off" placeholder="(repo:mona/a OR repo:mona/b) AND lang:python" required maxlength="500"> </div> <p class="text-small color-fg-muted"> To see all available qualifiers, see our <a class="Link--inTextBlock" href="https://docs.github.com/search-github/github-code-search/understanding-github-code-search-syntax">documentation</a>. </p> </form> </div> <div data-target="custom-scopes.manageCustomScopesForm"> <div data-target="custom-scopes.list"></div> </div> </div> </scrollable-region> <div data-view-component="true" class="Overlay-footer Overlay-footer--alignEnd Overlay-footer--divided"> <button data-action="click:custom-scopes#customScopesCancel" type="button" data-view-component="true" class="btn"> Cancel </button> <button form="custom-scopes-dialog-form" data-action="click:custom-scopes#customScopesSubmit" data-target="custom-scopes.customScopesSubmitButton" type="submit" data-view-component="true" class="btn-primary btn"> Create saved search </button> </div> </dialog></dialog-helper> </custom-scopes> </div> </qbsearch-input> <div class="position-relative HeaderMenu-link-wrap d-lg-inline-block"> <a href="/login?return_to=https%3A%2F%2Fgithub.com%2FRenderKit%2Foidn" class="HeaderMenu-link HeaderMenu-link--sign-in HeaderMenu-button flex-shrink-0 no-underline d-none d-lg-inline-flex border border-lg-0 rounded rounded-lg-0 px-2 py-1" style="margin-left: 12px;" data-hydro-click="{"event_type":"authentication.click","payload":{"location_in_page":"site header menu","repository_id":null,"auth_type":"SIGN_UP","originating_url":"https://github.com/RenderKit/oidn","user_id":null}}" data-hydro-click-hmac="3271ebd20fd78fd14b488847e5f3499c73b3556a7f3c58024d191aea81cdd6e6" data-analytics-event="{"category":"Marketing nav","action":"click to go to homepage","label":"ref_page:Marketing;ref_cta:Sign in;ref_loc:Header"}" > Sign in </a> </div> <a href="/signup?ref_cta=Sign+up&ref_loc=header+logged+out&ref_page=%2F%3Cuser-name%3E%2F%3Crepo-name%3E&source=header-repo&source_repo=RenderKit%2Foidn" class="HeaderMenu-link HeaderMenu-link--sign-up HeaderMenu-button flex-shrink-0 d-flex d-lg-inline-flex no-underline border color-border-default rounded px-2 py-1" data-hydro-click="{"event_type":"authentication.click","payload":{"location_in_page":"site header menu","repository_id":null,"auth_type":"SIGN_UP","originating_url":"https://github.com/RenderKit/oidn","user_id":null}}" data-hydro-click-hmac="3271ebd20fd78fd14b488847e5f3499c73b3556a7f3c58024d191aea81cdd6e6" data-analytics-event="{"category":"Sign up","action":"click to sign up for account","label":"ref_page:/<user-name>/<repo-name>;ref_cta:Sign up;ref_loc:header logged out"}" > Sign up </a> <button type="button" class="sr-only js-header-menu-focus-trap d-block d-lg-none">Reseting focus</button> </div> </div> </div> </div> </header> <div hidden="hidden" data-view-component="true" class="js-stale-session-flash stale-session-flash flash flash-warn flash-full"> <svg aria-hidden="true" height="16" viewBox="0 0 16 16" version="1.1" width="16" data-view-component="true" class="octicon octicon-alert"> <path d="M6.457 1.047c.659-1.234 2.427-1.234 3.086 0l6.082 11.378A1.75 1.75 0 0 1 14.082 15H1.918a1.75 1.75 0 0 1-1.543-2.575Zm1.763.707a.25.25 0 0 0-.44 0L1.698 13.132a.25.25 0 0 0 .22.368h12.164a.25.25 0 0 0 .22-.368Zm.53 3.996v2.5a.75.75 0 0 1-1.5 0v-2.5a.75.75 0 0 1 1.5 0ZM9 11a1 1 0 1 1-2 0 1 1 0 0 1 2 0Z"></path> </svg> <span class="js-stale-session-flash-signed-in" hidden>You signed in with another tab or window. <a class="Link--inTextBlock" href="">Reload</a> to refresh your session.</span> <span class="js-stale-session-flash-signed-out" hidden>You signed out in another tab or window. <a class="Link--inTextBlock" href="">Reload</a> to refresh your session.</span> <span class="js-stale-session-flash-switched" hidden>You switched accounts on another tab or window. <a class="Link--inTextBlock" href="">Reload</a> to refresh your session.</span> <button id="icon-button-7d34224e-c5e6-4045-abce-b29fdb4ebe9a" aria-labelledby="tooltip-46bdb2d0-1a42-4b84-9d89-9a412555d443" type="button" data-view-component="true" class="Button Button--iconOnly Button--invisible Button--medium flash-close js-flash-close"> <svg aria-hidden="true" height="16" viewBox="0 0 16 16" version="1.1" width="16" data-view-component="true" class="octicon octicon-x Button-visual"> <path d="M3.72 3.72a.75.75 0 0 1 1.06 0L8 6.94l3.22-3.22a.749.749 0 0 1 1.275.326.749.749 0 0 1-.215.734L9.06 8l3.22 3.22a.749.749 0 0 1-.326 1.275.749.749 0 0 1-.734-.215L8 9.06l-3.22 3.22a.751.751 0 0 1-1.042-.018.751.751 0 0 1-.018-1.042L6.94 8 3.72 4.78a.75.75 0 0 1 0-1.06Z"></path> </svg> </button><tool-tip id="tooltip-46bdb2d0-1a42-4b84-9d89-9a412555d443" for="icon-button-7d34224e-c5e6-4045-abce-b29fdb4ebe9a" popover="manual" data-direction="s" data-type="label" data-view-component="true" class="sr-only position-absolute">Dismiss alert</tool-tip> </div> </div> <div id="start-of-content" class="show-on-focus"></div> <div id="js-flash-container" class="flash-container" data-turbo-replace> <template class="js-flash-template"> <div class="flash flash-full {{ className }}"> <div > <button autofocus class="flash-close js-flash-close" type="button" aria-label="Dismiss this message"> <svg aria-hidden="true" height="16" viewBox="0 0 16 16" version="1.1" width="16" data-view-component="true" class="octicon octicon-x"> <path d="M3.72 3.72a.75.75 0 0 1 1.06 0L8 6.94l3.22-3.22a.749.749 0 0 1 1.275.326.749.749 0 0 1-.215.734L9.06 8l3.22 3.22a.749.749 0 0 1-.326 1.275.749.749 0 0 1-.734-.215L8 9.06l-3.22 3.22a.751.751 0 0 1-1.042-.018.751.751 0 0 1-.018-1.042L6.94 8 3.72 4.78a.75.75 0 0 1 0-1.06Z"></path> </svg> </button> <div aria-atomic="true" role="alert" class="js-flash-alert"> <div>{{ message }}</div> </div> </div> </div> </template> </div> <div class="application-main " data-commit-hovercards-enabled data-discussion-hovercards-enabled data-issue-and-pr-hovercards-enabled > <div itemscope itemtype="http://schema.org/SoftwareSourceCode" class=""> <main id="js-repo-pjax-container" > <div id="repository-container-header" class="pt-3 hide-full-screen" style="background-color: var(--page-header-bgColor, var(--color-page-header-bg));" data-turbo-replace> <div class="d-flex flex-nowrap flex-justify-end mb-3 px-3 px-lg-5" style="gap: 1rem;"> <div class="flex-auto min-width-0 width-fit"> <div class=" d-flex flex-wrap flex-items-center wb-break-word f3 text-normal"> <svg aria-hidden="true" height="16" viewBox="0 0 16 16" version="1.1" width="16" data-view-component="true" class="octicon octicon-repo color-fg-muted mr-2"> <path d="M2 2.5A2.5 2.5 0 0 1 4.5 0h8.75a.75.75 0 0 1 .75.75v12.5a.75.75 0 0 1-.75.75h-2.5a.75.75 0 0 1 0-1.5h1.75v-2h-8a1 1 0 0 0-.714 1.7.75.75 0 1 1-1.072 1.05A2.495 2.495 0 0 1 2 11.5Zm10.5-1h-8a1 1 0 0 0-1 1v6.708A2.486 2.486 0 0 1 4.5 9h8ZM5 12.25a.25.25 0 0 1 .25-.25h3.5a.25.25 0 0 1 .25.25v3.25a.25.25 0 0 1-.4.2l-1.45-1.087a.249.249 0 0 0-.3 0L5.4 15.7a.25.25 0 0 1-.4-.2Z"></path> </svg> <span class="author flex-self-stretch" itemprop="author"> <a class="url fn" rel="author" data-hovercard-type="organization" data-hovercard-url="/orgs/RenderKit/hovercard" data-octo-click="hovercard-link-click" data-octo-dimensions="link_type:self" href="/RenderKit"> RenderKit </a> </span> <span class="mx-1 flex-self-stretch color-fg-muted">/</span> <strong itemprop="name" class="mr-2 flex-self-stretch"> <a data-pjax="#repo-content-pjax-container" data-turbo-frame="repo-content-turbo-frame" href="/RenderKit/oidn">oidn</a> </strong> <span></span><span class="Label Label--secondary v-align-middle mr-1">Public</span> </div> </div> <div id="repository-details-container" class="flex-shrink-0" data-turbo-replace style="max-width: 70%;"> <ul class="pagehead-actions flex-shrink-0 d-none d-md-inline" style="padding: 2px 0;"> <li> <a href="/login?return_to=%2FRenderKit%2Foidn" rel="nofollow" id="repository-details-watch-button" data-hydro-click="{"event_type":"authentication.click","payload":{"location_in_page":"notification subscription menu watch","repository_id":null,"auth_type":"LOG_IN","originating_url":"https://github.com/RenderKit/oidn","user_id":null}}" data-hydro-click-hmac="b2c0dd2de0af5d6bc8b49671ec1fe28441d3b2687c4f892bfc30b4c0910d04b9" aria-label="You must be signed in to change notification settings" data-view-component="true" class="btn-sm btn"> <svg aria-hidden="true" height="16" viewBox="0 0 16 16" version="1.1" width="16" data-view-component="true" class="octicon octicon-bell mr-2"> <path d="M8 16a2 2 0 0 0 1.985-1.75c.017-.137-.097-.25-.235-.25h-3.5c-.138 0-.252.113-.235.25A2 2 0 0 0 8 16ZM3 5a5 5 0 0 1 10 0v2.947c0 .05.015.098.042.139l1.703 2.555A1.519 1.519 0 0 1 13.482 13H2.518a1.516 1.516 0 0 1-1.263-2.36l1.703-2.554A.255.255 0 0 0 3 7.947Zm5-3.5A3.5 3.5 0 0 0 4.5 5v2.947c0 .346-.102.683-.294.97l-1.703 2.556a.017.017 0 0 0-.003.01l.001.006c0 .002.002.004.004.006l.006.004.007.001h10.964l.007-.001.006-.004.004-.006.001-.007a.017.017 0 0 0-.003-.01l-1.703-2.554a1.745 1.745 0 0 1-.294-.97V5A3.5 3.5 0 0 0 8 1.5Z"></path> </svg>Notifications </a> <tool-tip id="tooltip-69c80dc9-42fe-4af6-93bb-4cc50bfa20c7" for="repository-details-watch-button" popover="manual" data-direction="s" data-type="description" data-view-component="true" class="sr-only position-absolute">You must be signed in to change notification settings</tool-tip> </li> <li> <a icon="repo-forked" id="fork-button" href="/login?return_to=%2FRenderKit%2Foidn" rel="nofollow" data-hydro-click="{"event_type":"authentication.click","payload":{"location_in_page":"repo details fork button","repository_id":168025831,"auth_type":"LOG_IN","originating_url":"https://github.com/RenderKit/oidn","user_id":null}}" data-hydro-click-hmac="3e407a243a7ad721286f25544737fd588ed7d0dd48fc274fb32626a1cd3dfb4c" data-view-component="true" class="btn-sm btn"> <svg aria-hidden="true" height="16" viewBox="0 0 16 16" version="1.1" width="16" data-view-component="true" class="octicon octicon-repo-forked mr-2"> <path d="M5 5.372v.878c0 .414.336.75.75.75h4.5a.75.75 0 0 0 .75-.75v-.878a2.25 2.25 0 1 1 1.5 0v.878a2.25 2.25 0 0 1-2.25 2.25h-1.5v2.128a2.251 2.251 0 1 1-1.5 0V8.5h-1.5A2.25 2.25 0 0 1 3.5 6.25v-.878a2.25 2.25 0 1 1 1.5 0ZM5 3.25a.75.75 0 1 0-1.5 0 .75.75 0 0 0 1.5 0Zm6.75.75a.75.75 0 1 0 0-1.5.75.75 0 0 0 0 1.5Zm-3 8.75a.75.75 0 1 0-1.5 0 .75.75 0 0 0 1.5 0Z"></path> </svg>Fork <span id="repo-network-counter" data-pjax-replace="true" data-turbo-replace="true" title="164" data-view-component="true" class="Counter">164</span> </a> </li> <li> <div data-view-component="true" class="BtnGroup d-flex"> <a href="/login?return_to=%2FRenderKit%2Foidn" rel="nofollow" data-hydro-click="{"event_type":"authentication.click","payload":{"location_in_page":"star button","repository_id":168025831,"auth_type":"LOG_IN","originating_url":"https://github.com/RenderKit/oidn","user_id":null}}" data-hydro-click-hmac="1a688b485287a78dc1b3d26aa2a41c13864cb3458b2f229819fa06fd14750e28" aria-label="You must be signed in to star a repository" data-view-component="true" class="tooltipped tooltipped-sw btn-sm btn"> <svg aria-hidden="true" height="16" viewBox="0 0 16 16" version="1.1" width="16" data-view-component="true" class="octicon octicon-star v-align-text-bottom d-inline-block mr-2"> <path d="M8 .25a.75.75 0 0 1 .673.418l1.882 3.815 4.21.612a.75.75 0 0 1 .416 1.279l-3.046 2.97.719 4.192a.751.751 0 0 1-1.088.791L8 12.347l-3.766 1.98a.75.75 0 0 1-1.088-.79l.72-4.194L.818 6.374a.75.75 0 0 1 .416-1.28l4.21-.611L7.327.668A.75.75 0 0 1 8 .25Zm0 2.445L6.615 5.5a.75.75 0 0 1-.564.41l-3.097.45 2.24 2.184a.75.75 0 0 1 .216.664l-.528 3.084 2.769-1.456a.75.75 0 0 1 .698 0l2.77 1.456-.53-3.084a.75.75 0 0 1 .216-.664l2.24-2.183-3.096-.45a.75.75 0 0 1-.564-.41L8 2.694Z"></path> </svg><span data-view-component="true" class="d-inline"> Star </span> <span id="repo-stars-counter-star" aria-label="1811 users starred this repository" data-singular-suffix="user starred this repository" data-plural-suffix="users starred this repository" data-turbo-replace="true" title="1,811" data-view-component="true" class="Counter js-social-count">1.8k</span> </a></div> </li> </ul> </div> </div> <div id="responsive-meta-container" data-turbo-replace> <div class="d-block d-md-none mb-2 px-3 px-md-4 px-lg-5"> <p class="f4 mb-3 "> Intel® Open Image Denoise library </p> <div class="mb-2 d-flex flex-items-center Link--secondary"> <svg aria-hidden="true" height="16" viewBox="0 0 16 16" version="1.1" width="16" data-view-component="true" class="octicon octicon-link flex-shrink-0 mr-2"> <path d="m7.775 3.275 1.25-1.25a3.5 3.5 0 1 1 4.95 4.95l-2.5 2.5a3.5 3.5 0 0 1-4.95 0 .751.751 0 0 1 .018-1.042.751.751 0 0 1 1.042-.018 1.998 1.998 0 0 0 2.83 0l2.5-2.5a2.002 2.002 0 0 0-2.83-2.83l-1.25 1.25a.751.751 0 0 1-1.042-.018.751.751 0 0 1-.018-1.042Zm-4.69 9.64a1.998 1.998 0 0 0 2.83 0l1.25-1.25a.751.751 0 0 1 1.042.018.751.751 0 0 1 .018 1.042l-1.25 1.25a3.5 3.5 0 1 1-4.95-4.95l2.5-2.5a3.5 3.5 0 0 1 4.95 0 .751.751 0 0 1-.018 1.042.751.751 0 0 1-1.042.018 1.998 1.998 0 0 0-2.83 0l-2.5 2.5a1.998 1.998 0 0 0 0 2.83Z"></path> </svg> <span class="flex-auto min-width-0 css-truncate css-truncate-target width-fit"> <a title="https://www.openimagedenoise.org/" role="link" target="_blank" class="text-bold" rel="noopener noreferrer" href="https://www.openimagedenoise.org/">www.openimagedenoise.org/</a> </span> </div> <h3 class="sr-only">License</h3> <div class="mb-2"> <a href="/RenderKit/oidn/blob/master/LICENSE.txt" class="Link--muted" data-analytics-event="{"category":"Repository Overview","action":"click","label":"location:sidebar;file:license"}" > <svg aria-hidden="true" height="16" viewBox="0 0 16 16" version="1.1" width="16" data-view-component="true" class="octicon octicon-law mr-2"> <path d="M8.75.75V2h.985c.304 0 .603.08.867.231l1.29.736c.038.022.08.033.124.033h2.234a.75.75 0 0 1 0 1.5h-.427l2.111 4.692a.75.75 0 0 1-.154.838l-.53-.53.529.531-.001.002-.002.002-.006.006-.006.005-.01.01-.045.04c-.21.176-.441.327-.686.45C14.556 10.78 13.88 11 13 11a4.498 4.498 0 0 1-2.023-.454 3.544 3.544 0 0 1-.686-.45l-.045-.04-.016-.015-.006-.006-.004-.004v-.001a.75.75 0 0 1-.154-.838L12.178 4.5h-.162c-.305 0-.604-.079-.868-.231l-1.29-.736a.245.245 0 0 0-.124-.033H8.75V13h2.5a.75.75 0 0 1 0 1.5h-6.5a.75.75 0 0 1 0-1.5h2.5V3.5h-.984a.245.245 0 0 0-.124.033l-1.289.737c-.265.15-.564.23-.869.23h-.162l2.112 4.692a.75.75 0 0 1-.154.838l-.53-.53.529.531-.001.002-.002.002-.006.006-.016.015-.045.04c-.21.176-.441.327-.686.45C4.556 10.78 3.88 11 3 11a4.498 4.498 0 0 1-2.023-.454 3.544 3.544 0 0 1-.686-.45l-.045-.04-.016-.015-.006-.006-.004-.004v-.001a.75.75 0 0 1-.154-.838L2.178 4.5H1.75a.75.75 0 0 1 0-1.5h2.234a.249.249 0 0 0 .125-.033l1.288-.737c.265-.15.564-.23.869-.23h.984V.75a.75.75 0 0 1 1.5 0Zm2.945 8.477c.285.135.718.273 1.305.273s1.02-.138 1.305-.273L13 6.327Zm-10 0c.285.135.718.273 1.305.273s1.02-.138 1.305-.273L3 6.327Z"></path> </svg> Apache-2.0 license </a> </div> <div class="mb-3"> <a class="Link--secondary no-underline mr-3" href="/RenderKit/oidn/stargazers"> <svg aria-hidden="true" height="16" viewBox="0 0 16 16" version="1.1" width="16" data-view-component="true" class="octicon octicon-star mr-1"> <path d="M8 .25a.75.75 0 0 1 .673.418l1.882 3.815 4.21.612a.75.75 0 0 1 .416 1.279l-3.046 2.97.719 4.192a.751.751 0 0 1-1.088.791L8 12.347l-3.766 1.98a.75.75 0 0 1-1.088-.79l.72-4.194L.818 6.374a.75.75 0 0 1 .416-1.28l4.21-.611L7.327.668A.75.75 0 0 1 8 .25Zm0 2.445L6.615 5.5a.75.75 0 0 1-.564.41l-3.097.45 2.24 2.184a.75.75 0 0 1 .216.664l-.528 3.084 2.769-1.456a.75.75 0 0 1 .698 0l2.77 1.456-.53-3.084a.75.75 0 0 1 .216-.664l2.24-2.183-3.096-.45a.75.75 0 0 1-.564-.41L8 2.694Z"></path> </svg> <span class="text-bold">1.8k</span> stars </a> <a class="Link--secondary no-underline mr-3" href="/RenderKit/oidn/forks"> <svg aria-hidden="true" height="16" viewBox="0 0 16 16" version="1.1" width="16" data-view-component="true" class="octicon octicon-repo-forked mr-1"> <path d="M5 5.372v.878c0 .414.336.75.75.75h4.5a.75.75 0 0 0 .75-.75v-.878a2.25 2.25 0 1 1 1.5 0v.878a2.25 2.25 0 0 1-2.25 2.25h-1.5v2.128a2.251 2.251 0 1 1-1.5 0V8.5h-1.5A2.25 2.25 0 0 1 3.5 6.25v-.878a2.25 2.25 0 1 1 1.5 0ZM5 3.25a.75.75 0 1 0-1.5 0 .75.75 0 0 0 1.5 0Zm6.75.75a.75.75 0 1 0 0-1.5.75.75 0 0 0 0 1.5Zm-3 8.75a.75.75 0 1 0-1.5 0 .75.75 0 0 0 1.5 0Z"></path> </svg> <span class="text-bold">164</span> forks </a> <a class="Link--secondary no-underline mr-3 d-inline-block" href="/RenderKit/oidn/branches"> <svg aria-hidden="true" height="16" viewBox="0 0 16 16" version="1.1" width="16" data-view-component="true" class="octicon octicon-git-branch mr-1"> <path d="M9.5 3.25a2.25 2.25 0 1 1 3 2.122V6A2.5 2.5 0 0 1 10 8.5H6a1 1 0 0 0-1 1v1.128a2.251 2.251 0 1 1-1.5 0V5.372a2.25 2.25 0 1 1 1.5 0v1.836A2.493 2.493 0 0 1 6 7h4a1 1 0 0 0 1-1v-.628A2.25 2.25 0 0 1 9.5 3.25Zm-6 0a.75.75 0 1 0 1.5 0 .75.75 0 0 0-1.5 0Zm8.25-.75a.75.75 0 1 0 0 1.5.75.75 0 0 0 0-1.5ZM4.25 12a.75.75 0 1 0 0 1.5.75.75 0 0 0 0-1.5Z"></path> </svg> <span>Branches</span> </a> <a class="Link--secondary no-underline d-inline-block" href="/RenderKit/oidn/tags"> <svg aria-hidden="true" height="16" viewBox="0 0 16 16" version="1.1" width="16" data-view-component="true" class="octicon octicon-tag mr-1"> <path d="M1 7.775V2.75C1 1.784 1.784 1 2.75 1h5.025c.464 0 .91.184 1.238.513l6.25 6.25a1.75 1.75 0 0 1 0 2.474l-5.026 5.026a1.75 1.75 0 0 1-2.474 0l-6.25-6.25A1.752 1.752 0 0 1 1 7.775Zm1.5 0c0 .066.026.13.073.177l6.25 6.25a.25.25 0 0 0 .354 0l5.025-5.025a.25.25 0 0 0 0-.354l-6.25-6.25a.25.25 0 0 0-.177-.073H2.75a.25.25 0 0 0-.25.25ZM6 5a1 1 0 1 1 0 2 1 1 0 0 1 0-2Z"></path> </svg> <span>Tags</span> </a> <a class="Link--secondary no-underline d-inline-block" href="/RenderKit/oidn/activity"> <svg aria-hidden="true" height="16" viewBox="0 0 16 16" version="1.1" width="16" data-view-component="true" class="octicon octicon-pulse mr-1"> <path d="M6 2c.306 0 .582.187.696.471L10 10.731l1.304-3.26A.751.751 0 0 1 12 7h3.25a.75.75 0 0 1 0 1.5h-2.742l-1.812 4.528a.751.751 0 0 1-1.392 0L6 4.77 4.696 8.03A.75.75 0 0 1 4 8.5H.75a.75.75 0 0 1 0-1.5h2.742l1.812-4.529A.751.751 0 0 1 6 2Z"></path> </svg> <span>Activity</span> </a> </div> <div class="d-flex flex-wrap gap-2"> <div class="flex-1"> <div data-view-component="true" class="BtnGroup d-flex"> <a href="/login?return_to=%2FRenderKit%2Foidn" rel="nofollow" data-hydro-click="{"event_type":"authentication.click","payload":{"location_in_page":"star button","repository_id":168025831,"auth_type":"LOG_IN","originating_url":"https://github.com/RenderKit/oidn","user_id":null}}" data-hydro-click-hmac="1a688b485287a78dc1b3d26aa2a41c13864cb3458b2f229819fa06fd14750e28" aria-label="You must be signed in to star a repository" data-view-component="true" class="tooltipped tooltipped-sw btn-sm btn btn-block"> <svg aria-hidden="true" height="16" viewBox="0 0 16 16" version="1.1" width="16" data-view-component="true" class="octicon octicon-star v-align-text-bottom d-inline-block mr-2"> <path d="M8 .25a.75.75 0 0 1 .673.418l1.882 3.815 4.21.612a.75.75 0 0 1 .416 1.279l-3.046 2.97.719 4.192a.751.751 0 0 1-1.088.791L8 12.347l-3.766 1.98a.75.75 0 0 1-1.088-.79l.72-4.194L.818 6.374a.75.75 0 0 1 .416-1.28l4.21-.611L7.327.668A.75.75 0 0 1 8 .25Zm0 2.445L6.615 5.5a.75.75 0 0 1-.564.41l-3.097.45 2.24 2.184a.75.75 0 0 1 .216.664l-.528 3.084 2.769-1.456a.75.75 0 0 1 .698 0l2.77 1.456-.53-3.084a.75.75 0 0 1 .216-.664l2.24-2.183-3.096-.45a.75.75 0 0 1-.564-.41L8 2.694Z"></path> </svg><span data-view-component="true" class="d-inline"> Star </span> </a></div> </div> <div class="flex-1"> <a href="/login?return_to=%2FRenderKit%2Foidn" rel="nofollow" id="files-overview-watch-button" data-hydro-click="{"event_type":"authentication.click","payload":{"location_in_page":"notification subscription menu watch","repository_id":null,"auth_type":"LOG_IN","originating_url":"https://github.com/RenderKit/oidn","user_id":null}}" data-hydro-click-hmac="b2c0dd2de0af5d6bc8b49671ec1fe28441d3b2687c4f892bfc30b4c0910d04b9" aria-label="You must be signed in to change notification settings" data-view-component="true" class="btn-sm btn btn-block"> <svg aria-hidden="true" height="16" viewBox="0 0 16 16" version="1.1" width="16" data-view-component="true" class="octicon octicon-bell mr-2"> <path d="M8 16a2 2 0 0 0 1.985-1.75c.017-.137-.097-.25-.235-.25h-3.5c-.138 0-.252.113-.235.25A2 2 0 0 0 8 16ZM3 5a5 5 0 0 1 10 0v2.947c0 .05.015.098.042.139l1.703 2.555A1.519 1.519 0 0 1 13.482 13H2.518a1.516 1.516 0 0 1-1.263-2.36l1.703-2.554A.255.255 0 0 0 3 7.947Zm5-3.5A3.5 3.5 0 0 0 4.5 5v2.947c0 .346-.102.683-.294.97l-1.703 2.556a.017.017 0 0 0-.003.01l.001.006c0 .002.002.004.004.006l.006.004.007.001h10.964l.007-.001.006-.004.004-.006.001-.007a.017.017 0 0 0-.003-.01l-1.703-2.554a1.745 1.745 0 0 1-.294-.97V5A3.5 3.5 0 0 0 8 1.5Z"></path> </svg>Notifications </a> <tool-tip id="tooltip-1b97d368-972e-438e-af19-e03c95ba3f1a" for="files-overview-watch-button" popover="manual" data-direction="s" data-type="description" data-view-component="true" class="sr-only position-absolute">You must be signed in to change notification settings</tool-tip> </div> <span> </span> </div> </div> </div> <nav data-pjax="#js-repo-pjax-container" aria-label="Repository" data-view-component="true" class="js-repo-nav js-sidenav-container-pjax js-responsive-underlinenav overflow-hidden UnderlineNav px-3 px-md-4 px-lg-5"> <ul data-view-component="true" class="UnderlineNav-body list-style-none"> <li data-view-component="true" class="d-inline-flex"> <a id="code-tab" href="/RenderKit/oidn" data-tab-item="i0code-tab" data-selected-links="repo_source repo_downloads repo_commits repo_releases repo_tags repo_branches repo_packages repo_deployments repo_attestations /RenderKit/oidn" data-pjax="#repo-content-pjax-container" data-turbo-frame="repo-content-turbo-frame" data-hotkey="g c" data-analytics-event="{"category":"Underline navbar","action":"Click tab","label":"Code","target":"UNDERLINE_NAV.TAB"}" aria-current="page" data-view-component="true" class="UnderlineNav-item no-wrap js-responsive-underlinenav-item js-selected-navigation-item selected"> <svg aria-hidden="true" height="16" viewBox="0 0 16 16" version="1.1" width="16" data-view-component="true" class="octicon octicon-code UnderlineNav-octicon d-none d-sm-inline"> <path d="m11.28 3.22 4.25 4.25a.75.75 0 0 1 0 1.06l-4.25 4.25a.749.749 0 0 1-1.275-.326.749.749 0 0 1 .215-.734L13.94 8l-3.72-3.72a.749.749 0 0 1 .326-1.275.749.749 0 0 1 .734.215Zm-6.56 0a.751.751 0 0 1 1.042.018.751.751 0 0 1 .018 1.042L2.06 8l3.72 3.72a.749.749 0 0 1-.326 1.275.749.749 0 0 1-.734-.215L.47 8.53a.75.75 0 0 1 0-1.06Z"></path> </svg> <span data-content="Code">Code</span> <span id="code-repo-tab-count" data-pjax-replace="" data-turbo-replace="" title="Not available" data-view-component="true" class="Counter"></span> </a></li> <li data-view-component="true" class="d-inline-flex"> <a id="issues-tab" href="/RenderKit/oidn/issues" data-tab-item="i1issues-tab" data-selected-links="repo_issues repo_labels repo_milestones /RenderKit/oidn/issues" data-pjax="#repo-content-pjax-container" data-turbo-frame="repo-content-turbo-frame" data-hotkey="g i" data-analytics-event="{"category":"Underline navbar","action":"Click tab","label":"Issues","target":"UNDERLINE_NAV.TAB"}" data-view-component="true" class="UnderlineNav-item no-wrap js-responsive-underlinenav-item js-selected-navigation-item"> <svg aria-hidden="true" height="16" viewBox="0 0 16 16" version="1.1" width="16" data-view-component="true" class="octicon octicon-issue-opened UnderlineNav-octicon d-none d-sm-inline"> <path d="M8 9.5a1.5 1.5 0 1 0 0-3 1.5 1.5 0 0 0 0 3Z"></path><path d="M8 0a8 8 0 1 1 0 16A8 8 0 0 1 8 0ZM1.5 8a6.5 6.5 0 1 0 13 0 6.5 6.5 0 0 0-13 0Z"></path> </svg> <span data-content="Issues">Issues</span> <span id="issues-repo-tab-count" data-pjax-replace="" data-turbo-replace="" title="29" data-view-component="true" class="Counter">29</span> </a></li> <li data-view-component="true" class="d-inline-flex"> <a id="pull-requests-tab" href="/RenderKit/oidn/pulls" data-tab-item="i2pull-requests-tab" data-selected-links="repo_pulls checks /RenderKit/oidn/pulls" data-pjax="#repo-content-pjax-container" data-turbo-frame="repo-content-turbo-frame" data-hotkey="g p" data-analytics-event="{"category":"Underline navbar","action":"Click tab","label":"Pull requests","target":"UNDERLINE_NAV.TAB"}" data-view-component="true" class="UnderlineNav-item no-wrap js-responsive-underlinenav-item js-selected-navigation-item"> <svg aria-hidden="true" height="16" viewBox="0 0 16 16" version="1.1" width="16" data-view-component="true" class="octicon octicon-git-pull-request UnderlineNav-octicon d-none d-sm-inline"> <path d="M1.5 3.25a2.25 2.25 0 1 1 3 2.122v5.256a2.251 2.251 0 1 1-1.5 0V5.372A2.25 2.25 0 0 1 1.5 3.25Zm5.677-.177L9.573.677A.25.25 0 0 1 10 .854V2.5h1A2.5 2.5 0 0 1 13.5 5v5.628a2.251 2.251 0 1 1-1.5 0V5a1 1 0 0 0-1-1h-1v1.646a.25.25 0 0 1-.427.177L7.177 3.427a.25.25 0 0 1 0-.354ZM3.75 2.5a.75.75 0 1 0 0 1.5.75.75 0 0 0 0-1.5Zm0 9.5a.75.75 0 1 0 0 1.5.75.75 0 0 0 0-1.5Zm8.25.75a.75.75 0 1 0 1.5 0 .75.75 0 0 0-1.5 0Z"></path> </svg> <span data-content="Pull requests">Pull requests</span> <span id="pull-requests-repo-tab-count" data-pjax-replace="" data-turbo-replace="" title="6" data-view-component="true" class="Counter">6</span> </a></li> <li data-view-component="true" class="d-inline-flex"> <a id="actions-tab" href="/RenderKit/oidn/actions" data-tab-item="i3actions-tab" data-selected-links="repo_actions /RenderKit/oidn/actions" data-pjax="#repo-content-pjax-container" data-turbo-frame="repo-content-turbo-frame" data-hotkey="g a" data-analytics-event="{"category":"Underline navbar","action":"Click tab","label":"Actions","target":"UNDERLINE_NAV.TAB"}" data-view-component="true" class="UnderlineNav-item no-wrap js-responsive-underlinenav-item js-selected-navigation-item"> <svg aria-hidden="true" height="16" viewBox="0 0 16 16" version="1.1" width="16" data-view-component="true" class="octicon octicon-play UnderlineNav-octicon d-none d-sm-inline"> <path d="M8 0a8 8 0 1 1 0 16A8 8 0 0 1 8 0ZM1.5 8a6.5 6.5 0 1 0 13 0 6.5 6.5 0 0 0-13 0Zm4.879-2.773 4.264 2.559a.25.25 0 0 1 0 .428l-4.264 2.559A.25.25 0 0 1 6 10.559V5.442a.25.25 0 0 1 .379-.215Z"></path> </svg> <span data-content="Actions">Actions</span> <span id="actions-repo-tab-count" data-pjax-replace="" data-turbo-replace="" title="Not available" data-view-component="true" class="Counter"></span> </a></li> <li data-view-component="true" class="d-inline-flex"> <a id="projects-tab" href="/RenderKit/oidn/projects" data-tab-item="i4projects-tab" data-selected-links="repo_projects new_repo_project repo_project /RenderKit/oidn/projects" data-pjax="#repo-content-pjax-container" data-turbo-frame="repo-content-turbo-frame" data-hotkey="g b" data-analytics-event="{"category":"Underline navbar","action":"Click tab","label":"Projects","target":"UNDERLINE_NAV.TAB"}" data-view-component="true" class="UnderlineNav-item no-wrap js-responsive-underlinenav-item js-selected-navigation-item"> <svg aria-hidden="true" height="16" viewBox="0 0 16 16" version="1.1" width="16" data-view-component="true" class="octicon octicon-table UnderlineNav-octicon d-none d-sm-inline"> <path d="M0 1.75C0 .784.784 0 1.75 0h12.5C15.216 0 16 .784 16 1.75v12.5A1.75 1.75 0 0 1 14.25 16H1.75A1.75 1.75 0 0 1 0 14.25ZM6.5 6.5v8h7.75a.25.25 0 0 0 .25-.25V6.5Zm8-1.5V1.75a.25.25 0 0 0-.25-.25H6.5V5Zm-13 1.5v7.75c0 .138.112.25.25.25H5v-8ZM5 5V1.5H1.75a.25.25 0 0 0-.25.25V5Z"></path> </svg> <span data-content="Projects">Projects</span> <span id="projects-repo-tab-count" data-pjax-replace="" data-turbo-replace="" title="0" hidden="hidden" data-view-component="true" class="Counter">0</span> </a></li> <li data-view-component="true" class="d-inline-flex"> <a id="security-tab" href="/RenderKit/oidn/security" data-tab-item="i5security-tab" data-selected-links="security overview alerts policy token_scanning code_scanning /RenderKit/oidn/security" data-pjax="#repo-content-pjax-container" data-turbo-frame="repo-content-turbo-frame" data-hotkey="g s" data-analytics-event="{"category":"Underline navbar","action":"Click tab","label":"Security","target":"UNDERLINE_NAV.TAB"}" data-view-component="true" class="UnderlineNav-item no-wrap js-responsive-underlinenav-item js-selected-navigation-item"> <svg aria-hidden="true" height="16" viewBox="0 0 16 16" version="1.1" width="16" data-view-component="true" class="octicon octicon-shield UnderlineNav-octicon d-none d-sm-inline"> <path d="M7.467.133a1.748 1.748 0 0 1 1.066 0l5.25 1.68A1.75 1.75 0 0 1 15 3.48V7c0 1.566-.32 3.182-1.303 4.682-.983 1.498-2.585 2.813-5.032 3.855a1.697 1.697 0 0 1-1.33 0c-2.447-1.042-4.049-2.357-5.032-3.855C1.32 10.182 1 8.566 1 7V3.48a1.75 1.75 0 0 1 1.217-1.667Zm.61 1.429a.25.25 0 0 0-.153 0l-5.25 1.68a.25.25 0 0 0-.174.238V7c0 1.358.275 2.666 1.057 3.86.784 1.194 2.121 2.34 4.366 3.297a.196.196 0 0 0 .154 0c2.245-.956 3.582-2.104 4.366-3.298C13.225 9.666 13.5 8.36 13.5 7V3.48a.251.251 0 0 0-.174-.237l-5.25-1.68ZM8.75 4.75v3a.75.75 0 0 1-1.5 0v-3a.75.75 0 0 1 1.5 0ZM9 10.5a1 1 0 1 1-2 0 1 1 0 0 1 2 0Z"></path> </svg> <span data-content="Security">Security</span> <include-fragment src="/RenderKit/oidn/security/overall-count" accept="text/fragment+html"></include-fragment> </a></li> <li data-view-component="true" class="d-inline-flex"> <a id="insights-tab" href="/RenderKit/oidn/pulse" data-tab-item="i6insights-tab" data-selected-links="repo_graphs repo_contributors dependency_graph dependabot_updates pulse people community /RenderKit/oidn/pulse" data-pjax="#repo-content-pjax-container" data-turbo-frame="repo-content-turbo-frame" data-analytics-event="{"category":"Underline navbar","action":"Click tab","label":"Insights","target":"UNDERLINE_NAV.TAB"}" data-view-component="true" class="UnderlineNav-item no-wrap js-responsive-underlinenav-item js-selected-navigation-item"> <svg aria-hidden="true" height="16" viewBox="0 0 16 16" version="1.1" width="16" data-view-component="true" class="octicon octicon-graph UnderlineNav-octicon d-none d-sm-inline"> <path d="M1.5 1.75V13.5h13.75a.75.75 0 0 1 0 1.5H.75a.75.75 0 0 1-.75-.75V1.75a.75.75 0 0 1 1.5 0Zm14.28 2.53-5.25 5.25a.75.75 0 0 1-1.06 0L7 7.06 4.28 9.78a.751.751 0 0 1-1.042-.018.751.751 0 0 1-.018-1.042l3.25-3.25a.75.75 0 0 1 1.06 0L10 7.94l4.72-4.72a.751.751 0 0 1 1.042.018.751.751 0 0 1 .018 1.042Z"></path> </svg> <span data-content="Insights">Insights</span> <span id="insights-repo-tab-count" data-pjax-replace="" data-turbo-replace="" title="Not available" data-view-component="true" class="Counter"></span> </a></li> </ul> <div style="visibility:hidden;" data-view-component="true" class="UnderlineNav-actions js-responsive-underlinenav-overflow position-absolute pr-3 pr-md-4 pr-lg-5 right-0"> <action-menu data-select-variant="none" data-view-component="true"> <focus-group direction="vertical" mnemonics retain> <button id="action-menu-c0d03328-27f9-4a5e-a886-6970e47fb09d-button" popovertarget="action-menu-c0d03328-27f9-4a5e-a886-6970e47fb09d-overlay" aria-controls="action-menu-c0d03328-27f9-4a5e-a886-6970e47fb09d-list" aria-haspopup="true" aria-labelledby="tooltip-13fef528-f9e5-4735-a5fd-da2f35375991" type="button" data-view-component="true" class="Button Button--iconOnly Button--secondary Button--medium UnderlineNav-item"> <svg aria-hidden="true" height="16" viewBox="0 0 16 16" version="1.1" width="16" data-view-component="true" class="octicon octicon-kebab-horizontal Button-visual"> <path d="M8 9a1.5 1.5 0 1 0 0-3 1.5 1.5 0 0 0 0 3ZM1.5 9a1.5 1.5 0 1 0 0-3 1.5 1.5 0 0 0 0 3Zm13 0a1.5 1.5 0 1 0 0-3 1.5 1.5 0 0 0 0 3Z"></path> </svg> </button><tool-tip id="tooltip-13fef528-f9e5-4735-a5fd-da2f35375991" for="action-menu-c0d03328-27f9-4a5e-a886-6970e47fb09d-button" popover="manual" data-direction="s" data-type="label" data-view-component="true" class="sr-only position-absolute">Additional navigation options</tool-tip> <anchored-position id="action-menu-c0d03328-27f9-4a5e-a886-6970e47fb09d-overlay" anchor="action-menu-c0d03328-27f9-4a5e-a886-6970e47fb09d-button" align="start" side="outside-bottom" anchor-offset="normal" popover="auto" data-view-component="true"> <div data-view-component="true" class="Overlay Overlay--size-auto"> <div data-view-component="true" class="Overlay-body Overlay-body--paddingNone"> <action-list> <div data-view-component="true"> <ul aria-labelledby="action-menu-c0d03328-27f9-4a5e-a886-6970e47fb09d-button" id="action-menu-c0d03328-27f9-4a5e-a886-6970e47fb09d-list" role="menu" data-view-component="true" class="ActionListWrap--inset ActionListWrap"> <li hidden="hidden" data-menu-item="i0code-tab" data-targets="action-list.items" role="none" data-view-component="true" class="ActionListItem"> <a tabindex="-1" id="item-edb98488-cb98-47ad-bc5f-57f7b395c51c" href="/RenderKit/oidn" role="menuitem" data-view-component="true" class="ActionListContent ActionListContent--visual16"> <span class="ActionListItem-visual ActionListItem-visual--leading"> <svg aria-hidden="true" height="16" viewBox="0 0 16 16" version="1.1" width="16" data-view-component="true" class="octicon octicon-code"> <path d="m11.28 3.22 4.25 4.25a.75.75 0 0 1 0 1.06l-4.25 4.25a.749.749 0 0 1-1.275-.326.749.749 0 0 1 .215-.734L13.94 8l-3.72-3.72a.749.749 0 0 1 .326-1.275.749.749 0 0 1 .734.215Zm-6.56 0a.751.751 0 0 1 1.042.018.751.751 0 0 1 .018 1.042L2.06 8l3.72 3.72a.749.749 0 0 1-.326 1.275.749.749 0 0 1-.734-.215L.47 8.53a.75.75 0 0 1 0-1.06Z"></path> </svg> </span> <span data-view-component="true" class="ActionListItem-label"> Code </span> </a> </li> <li hidden="hidden" data-menu-item="i1issues-tab" data-targets="action-list.items" role="none" data-view-component="true" class="ActionListItem"> <a tabindex="-1" id="item-d32cdea0-55d5-441e-8e0e-e2b96b3cf436" href="/RenderKit/oidn/issues" role="menuitem" data-view-component="true" class="ActionListContent ActionListContent--visual16"> <span class="ActionListItem-visual ActionListItem-visual--leading"> <svg aria-hidden="true" height="16" viewBox="0 0 16 16" version="1.1" width="16" data-view-component="true" class="octicon octicon-issue-opened"> <path d="M8 9.5a1.5 1.5 0 1 0 0-3 1.5 1.5 0 0 0 0 3Z"></path><path d="M8 0a8 8 0 1 1 0 16A8 8 0 0 1 8 0ZM1.5 8a6.5 6.5 0 1 0 13 0 6.5 6.5 0 0 0-13 0Z"></path> </svg> </span> <span data-view-component="true" class="ActionListItem-label"> Issues </span> </a> </li> <li hidden="hidden" data-menu-item="i2pull-requests-tab" data-targets="action-list.items" role="none" data-view-component="true" class="ActionListItem"> <a tabindex="-1" id="item-c719faea-2e0a-4313-bfa6-499fc8b2222b" href="/RenderKit/oidn/pulls" role="menuitem" data-view-component="true" class="ActionListContent ActionListContent--visual16"> <span class="ActionListItem-visual ActionListItem-visual--leading"> <svg aria-hidden="true" height="16" viewBox="0 0 16 16" version="1.1" width="16" data-view-component="true" class="octicon octicon-git-pull-request"> <path d="M1.5 3.25a2.25 2.25 0 1 1 3 2.122v5.256a2.251 2.251 0 1 1-1.5 0V5.372A2.25 2.25 0 0 1 1.5 3.25Zm5.677-.177L9.573.677A.25.25 0 0 1 10 .854V2.5h1A2.5 2.5 0 0 1 13.5 5v5.628a2.251 2.251 0 1 1-1.5 0V5a1 1 0 0 0-1-1h-1v1.646a.25.25 0 0 1-.427.177L7.177 3.427a.25.25 0 0 1 0-.354ZM3.75 2.5a.75.75 0 1 0 0 1.5.75.75 0 0 0 0-1.5Zm0 9.5a.75.75 0 1 0 0 1.5.75.75 0 0 0 0-1.5Zm8.25.75a.75.75 0 1 0 1.5 0 .75.75 0 0 0-1.5 0Z"></path> </svg> </span> <span data-view-component="true" class="ActionListItem-label"> Pull requests </span> </a> </li> <li hidden="hidden" data-menu-item="i3actions-tab" data-targets="action-list.items" role="none" data-view-component="true" class="ActionListItem"> <a tabindex="-1" id="item-29718936-b72d-4a7a-ab4b-ec4c1a2ae30e" href="/RenderKit/oidn/actions" role="menuitem" data-view-component="true" class="ActionListContent ActionListContent--visual16"> <span class="ActionListItem-visual ActionListItem-visual--leading"> <svg aria-hidden="true" height="16" viewBox="0 0 16 16" version="1.1" width="16" data-view-component="true" class="octicon octicon-play"> <path d="M8 0a8 8 0 1 1 0 16A8 8 0 0 1 8 0ZM1.5 8a6.5 6.5 0 1 0 13 0 6.5 6.5 0 0 0-13 0Zm4.879-2.773 4.264 2.559a.25.25 0 0 1 0 .428l-4.264 2.559A.25.25 0 0 1 6 10.559V5.442a.25.25 0 0 1 .379-.215Z"></path> </svg> </span> <span data-view-component="true" class="ActionListItem-label"> Actions </span> </a> </li> <li hidden="hidden" data-menu-item="i4projects-tab" data-targets="action-list.items" role="none" data-view-component="true" class="ActionListItem"> <a tabindex="-1" id="item-530847db-0c4c-4813-bcdb-3fcab4b631ec" href="/RenderKit/oidn/projects" role="menuitem" data-view-component="true" class="ActionListContent ActionListContent--visual16"> <span class="ActionListItem-visual ActionListItem-visual--leading"> <svg aria-hidden="true" height="16" viewBox="0 0 16 16" version="1.1" width="16" data-view-component="true" class="octicon octicon-table"> <path d="M0 1.75C0 .784.784 0 1.75 0h12.5C15.216 0 16 .784 16 1.75v12.5A1.75 1.75 0 0 1 14.25 16H1.75A1.75 1.75 0 0 1 0 14.25ZM6.5 6.5v8h7.75a.25.25 0 0 0 .25-.25V6.5Zm8-1.5V1.75a.25.25 0 0 0-.25-.25H6.5V5Zm-13 1.5v7.75c0 .138.112.25.25.25H5v-8ZM5 5V1.5H1.75a.25.25 0 0 0-.25.25V5Z"></path> </svg> </span> <span data-view-component="true" class="ActionListItem-label"> Projects </span> </a> </li> <li hidden="hidden" data-menu-item="i5security-tab" data-targets="action-list.items" role="none" data-view-component="true" class="ActionListItem"> <a tabindex="-1" id="item-9bf9d6f9-0e52-4b5a-a7ea-a690d5ed058f" href="/RenderKit/oidn/security" role="menuitem" data-view-component="true" class="ActionListContent ActionListContent--visual16"> <span class="ActionListItem-visual ActionListItem-visual--leading"> <svg aria-hidden="true" height="16" viewBox="0 0 16 16" version="1.1" width="16" data-view-component="true" class="octicon octicon-shield"> <path d="M7.467.133a1.748 1.748 0 0 1 1.066 0l5.25 1.68A1.75 1.75 0 0 1 15 3.48V7c0 1.566-.32 3.182-1.303 4.682-.983 1.498-2.585 2.813-5.032 3.855a1.697 1.697 0 0 1-1.33 0c-2.447-1.042-4.049-2.357-5.032-3.855C1.32 10.182 1 8.566 1 7V3.48a1.75 1.75 0 0 1 1.217-1.667Zm.61 1.429a.25.25 0 0 0-.153 0l-5.25 1.68a.25.25 0 0 0-.174.238V7c0 1.358.275 2.666 1.057 3.86.784 1.194 2.121 2.34 4.366 3.297a.196.196 0 0 0 .154 0c2.245-.956 3.582-2.104 4.366-3.298C13.225 9.666 13.5 8.36 13.5 7V3.48a.251.251 0 0 0-.174-.237l-5.25-1.68ZM8.75 4.75v3a.75.75 0 0 1-1.5 0v-3a.75.75 0 0 1 1.5 0ZM9 10.5a1 1 0 1 1-2 0 1 1 0 0 1 2 0Z"></path> </svg> </span> <span data-view-component="true" class="ActionListItem-label"> Security </span> </a> </li> <li hidden="hidden" data-menu-item="i6insights-tab" data-targets="action-list.items" role="none" data-view-component="true" class="ActionListItem"> <a tabindex="-1" id="item-a62feaad-df21-4671-b466-b68918fbfb80" href="/RenderKit/oidn/pulse" role="menuitem" data-view-component="true" class="ActionListContent ActionListContent--visual16"> <span class="ActionListItem-visual ActionListItem-visual--leading"> <svg aria-hidden="true" height="16" viewBox="0 0 16 16" version="1.1" width="16" data-view-component="true" class="octicon octicon-graph"> <path d="M1.5 1.75V13.5h13.75a.75.75 0 0 1 0 1.5H.75a.75.75 0 0 1-.75-.75V1.75a.75.75 0 0 1 1.5 0Zm14.28 2.53-5.25 5.25a.75.75 0 0 1-1.06 0L7 7.06 4.28 9.78a.751.751 0 0 1-1.042-.018.751.751 0 0 1-.018-1.042l3.25-3.25a.75.75 0 0 1 1.06 0L10 7.94l4.72-4.72a.751.751 0 0 1 1.042.018.751.751 0 0 1 .018 1.042Z"></path> </svg> </span> <span data-view-component="true" class="ActionListItem-label"> Insights </span> </a> </li> </ul> </div></action-list> </div> </div></anchored-position> </focus-group> </action-menu></div> </nav> </div> <turbo-frame id="repo-content-turbo-frame" target="_top" data-turbo-action="advance" class=""> <div id="repo-content-pjax-container" class="repository-content " > <h1 class='sr-only'>RenderKit/oidn</h1> <div class="clearfix container-xl px-md-4 px-lg-5 px-3"> <div> <div style="max-width: 100%" data-view-component="true" class="Layout Layout--flowRow-until-md react-repos-overview-margin Layout--sidebarPosition-end Layout--sidebarPosition-flowRow-end"> <div data-view-component="true" class="Layout-main"> <script crossorigin="anonymous" defer="defer" type="application/javascript" src="https://github.githubassets.com/assets/primer-react-765944243383.js"></script> <script crossorigin="anonymous" defer="defer" type="application/javascript" src="https://github.githubassets.com/assets/react-core-cd0a67881543.js"></script> <script crossorigin="anonymous" defer="defer" type="application/javascript" src="https://github.githubassets.com/assets/react-lib-7b7b5264f6c1.js"></script> <script crossorigin="anonymous" defer="defer" type="application/javascript" src="https://github.githubassets.com/assets/octicons-react-45c3a19dd792.js"></script> <script crossorigin="anonymous" defer="defer" type="application/javascript" src="https://github.githubassets.com/assets/vendors-node_modules_tanstack_query-core_build_modern_queryClient_js-e40bb86d3e93.js"></script> <script crossorigin="anonymous" defer="defer" type="application/javascript" src="https://github.githubassets.com/assets/vendors-node_modules_emotion_is-prop-valid_dist_emotion-is-prop-valid_esm_js-node_modules_emo-37e3d5-31653d7f2342.js"></script> <script crossorigin="anonymous" defer="defer" type="application/javascript" src="https://github.githubassets.com/assets/vendors-node_modules_github_mini-throttle_dist_index_js-node_modules_stacktrace-parser_dist_s-e7dcdd-285fc29e9fa5.js"></script> <script crossorigin="anonymous" defer="defer" type="application/javascript" src="https://github.githubassets.com/assets/vendors-node_modules_oddbird_popover-polyfill_dist_popover-fn_js-4896ddd4b7bb.js"></script> <script crossorigin="anonymous" defer="defer" type="application/javascript" src="https://github.githubassets.com/assets/vendors-node_modules_tanstack_query-core_build_modern_queryObserver_js-node_modules_tanstack_-defd52-585c05e837f3.js"></script> <script crossorigin="anonymous" defer="defer" type="application/javascript" src="https://github.githubassets.com/assets/vendors-node_modules_github_hydro-analytics-client_dist_analytics-client_js-node_modules_gith-9002b0-8e5e346f0cbe.js"></script> <script crossorigin="anonymous" defer="defer" type="application/javascript" src="https://github.githubassets.com/assets/ui_packages_aria-live_aria-live_ts-ui_packages_promise-with-resolvers-polyfill_promise-with-r-014121-e1792bd5a31e.js"></script> <script crossorigin="anonymous" defer="defer" type="application/javascript" src="https://github.githubassets.com/assets/ui_packages_paths_index_ts-c733d4a976df.js"></script> <script crossorigin="anonymous" defer="defer" type="application/javascript" src="https://github.githubassets.com/assets/ui_packages_ref-selector_RefSelector_tsx-b10086b6761e.js"></script> <script crossorigin="anonymous" defer="defer" type="application/javascript" src="https://github.githubassets.com/assets/ui_packages_hydro-analytics_hydro-analytics_ts-ui_packages_verified-fetch_verified-fetch_ts-u-4672d1-0996d093463a.js"></script> <script crossorigin="anonymous" defer="defer" type="application/javascript" src="https://github.githubassets.com/assets/ui_packages_code-view-shared_hooks_use-file-page-payload_ts-ui_packages_code-view-shared_comp-1beb66-b07e414af699.js"></script> <script crossorigin="anonymous" defer="defer" type="application/javascript" src="https://github.githubassets.com/assets/ui_packages_commit-attribution_index_ts-ui_packages_commit-checks-status_index_ts-ui_packages-7207c9-f3f10560fb6f.js"></script> <script crossorigin="anonymous" defer="defer" type="application/javascript" src="https://github.githubassets.com/assets/repos-overview-5b8b9c05acbf.js"></script> <link crossorigin="anonymous" media="all" rel="stylesheet" href="https://github.githubassets.com/assets/primer-react.9fa170e9435ed4b922b9.module.css" /> <link crossorigin="anonymous" media="all" rel="stylesheet" href="https://github.githubassets.com/assets/repos-overview.9cc263aa0716ce801059.module.css" /> <react-partial partial-name="repos-overview" data-ssr="true" data-attempted-ssr="true" > <script type="application/json" data-target="react-partial.embeddedData">{"props":{"initialPayload":{"allShortcutsEnabled":false,"path":"/","repo":{"id":168025831,"defaultBranch":"master","name":"oidn","ownerLogin":"RenderKit","currentUserCanPush":false,"isFork":false,"isEmpty":false,"createdAt":"2019-01-28T19:48:52.000Z","ownerAvatar":"https://avatars.githubusercontent.com/u/61704897?v=4","public":true,"private":false,"isOrgOwned":true},"currentUser":null,"refInfo":{"name":"master","listCacheKey":"v0:1731366377.0","canEdit":false,"refType":"branch","currentOid":"a21330356508383f54b15efee67dbd0fd00ee87b"},"tree":{"items":[{"name":".github","path":".github","contentType":"directory"},{"name":"api","path":"api","contentType":"directory"},{"name":"apps","path":"apps","contentType":"directory"},{"name":"cmake","path":"cmake","contentType":"directory"},{"name":"common","path":"common","contentType":"directory"},{"name":"core","path":"core","contentType":"directory"},{"name":"devices","path":"devices","contentType":"directory"},{"name":"doc","path":"doc","contentType":"directory"},{"name":"external","path":"external","contentType":"directory"},{"name":"include/OpenImageDenoise","path":"include/OpenImageDenoise","contentType":"directory","hasSimplifiedPath":true},{"name":"scripts","path":"scripts","contentType":"directory"},{"name":"training","path":"training","contentType":"directory"},{"name":"weights","path":"weights","contentType":"submodule","submoduleUrl":"/RenderKit/oidn-weights/tree/28883d1769d5930e13cf7f1676dd852bd81ed9e7","submoduleDisplayName":"weights @ 28883d1"},{"name":".gitignore","path":".gitignore","contentType":"file"},{"name":".gitmodules","path":".gitmodules","contentType":"file"},{"name":"CHANGELOG.md","path":"CHANGELOG.md","contentType":"file"},{"name":"CMakeLists.txt","path":"CMakeLists.txt","contentType":"file"},{"name":"LICENSE.txt","path":"LICENSE.txt","contentType":"file"},{"name":"README.md","path":"README.md","contentType":"file"},{"name":"SECURITY.md","path":"SECURITY.md","contentType":"file"},{"name":"readme.pdf","path":"readme.pdf","contentType":"file"},{"name":"requirements.txt","path":"requirements.txt","contentType":"file"},{"name":"third-party-programs-DPCPP.txt","path":"third-party-programs-DPCPP.txt","contentType":"file"},{"name":"third-party-programs-oneDNN.txt","path":"third-party-programs-oneDNN.txt","contentType":"file"},{"name":"third-party-programs-oneTBB.txt","path":"third-party-programs-oneTBB.txt","contentType":"file"},{"name":"third-party-programs.txt","path":"third-party-programs.txt","contentType":"file"}],"templateDirectorySuggestionUrl":null,"readme":null,"totalCount":26,"showBranchInfobar":false},"fileTree":null,"fileTreeProcessingTime":null,"foldersToFetch":[],"treeExpanded":false,"symbolsExpanded":false,"isOverview":true,"overview":{"banners":{"shouldRecommendReadme":false,"isPersonalRepo":false,"showUseActionBanner":false,"actionSlug":null,"actionId":null,"showProtectBranchBanner":false,"publishBannersInfo":{"dismissActionNoticePath":"/settings/dismiss-notice/publish_action_from_repo","releasePath":"/RenderKit/oidn/releases/new?marketplace=true","showPublishActionBanner":false},"interactionLimitBanner":null,"showInvitationBanner":false,"inviterName":null,"actionsMigrationBannerInfo":{"releaseTags":[],"showImmutableActionsMigrationBanner":false,"initialMigrationStatus":null}},"codeButton":{"contactPath":"/contact","isEnterprise":false,"local":{"protocolInfo":{"httpAvailable":true,"sshAvailable":null,"httpUrl":"https://github.com/RenderKit/oidn.git","showCloneWarning":null,"sshUrl":null,"sshCertificatesRequired":null,"sshCertificatesAvailable":null,"ghCliUrl":"gh repo clone RenderKit/oidn","defaultProtocol":"http","newSshKeyUrl":"/settings/ssh/new","setProtocolPath":"/users/set_protocol"},"platformInfo":{"cloneUrl":"https://desktop.github.com","showVisualStudioCloneButton":false,"visualStudioCloneUrl":"https://windows.github.com","showXcodeCloneButton":false,"xcodeCloneUrl":"xcode://clone?repo=https%3A%2F%2Fgithub.com%2FRenderKit%2Foidn","zipballUrl":"/RenderKit/oidn/archive/refs/heads/master.zip"}},"newCodespacePath":"/codespaces/new?hide_repo_select=true\u0026repo=168025831"},"popovers":{"rename":null,"renamedParentRepo":null},"commitCount":"1,956","overviewFiles":[{"displayName":"README.md","repoName":"oidn","refName":"master","path":"README.md","preferredFileType":"readme","tabName":"README","richText":"\u003carticle class=\"markdown-body entry-content container-lg\" itemprop=\"text\"\u003e\u003cdiv class=\"markdown-heading\" dir=\"auto\"\u003e\u003ch1 tabindex=\"-1\" class=\"heading-element\" dir=\"auto\"\u003eIntel® Open Image Denoise\u003c/h1\u003e\u003ca id=\"user-content-intel-open-image-denoise\" class=\"anchor\" aria-label=\"Permalink: Intel® Open Image Denoise\" href=\"#intel-open-image-denoise\"\u003e\u003csvg class=\"octicon octicon-link\" viewBox=\"0 0 16 16\" version=\"1.1\" width=\"16\" height=\"16\" aria-hidden=\"true\"\u003e\u003cpath d=\"m7.775 3.275 1.25-1.25a3.5 3.5 0 1 1 4.95 4.95l-2.5 2.5a3.5 3.5 0 0 1-4.95 0 .751.751 0 0 1 .018-1.042.751.751 0 0 1 1.042-.018 1.998 1.998 0 0 0 2.83 0l2.5-2.5a2.002 2.002 0 0 0-2.83-2.83l-1.25 1.25a.751.751 0 0 1-1.042-.018.751.751 0 0 1-.018-1.042Zm-4.69 9.64a1.998 1.998 0 0 0 2.83 0l1.25-1.25a.751.751 0 0 1 1.042.018.751.751 0 0 1 .018 1.042l-1.25 1.25a3.5 3.5 0 1 1-4.95-4.95l2.5-2.5a3.5 3.5 0 0 1 4.95 0 .751.751 0 0 1-.018 1.042.751.751 0 0 1-1.042.018 1.998 1.998 0 0 0-2.83 0l-2.5 2.5a1.998 1.998 0 0 0 0 2.83Z\"\u003e\u003c/path\u003e\u003c/svg\u003e\u003c/a\u003e\u003c/div\u003e\n\u003cp dir=\"auto\"\u003eThis is release v2.3.1 of Intel Open Image Denoise. For changes and new\nfeatures see the \u003ca href=\"/RenderKit/oidn/blob/master/CHANGELOG.md\"\u003echangelog\u003c/a\u003e. Visit\n\u003ca href=\"https://www.openimagedenoise.org\" rel=\"nofollow\"\u003ehttps://www.openimagedenoise.org\u003c/a\u003e for more information.\u003c/p\u003e\n\u003cdiv class=\"markdown-heading\" dir=\"auto\"\u003e\u003ch1 tabindex=\"-1\" class=\"heading-element\" dir=\"auto\"\u003eOverview\u003c/h1\u003e\u003ca id=\"user-content-overview\" class=\"anchor\" aria-label=\"Permalink: Overview\" href=\"#overview\"\u003e\u003csvg class=\"octicon octicon-link\" viewBox=\"0 0 16 16\" version=\"1.1\" width=\"16\" height=\"16\" aria-hidden=\"true\"\u003e\u003cpath d=\"m7.775 3.275 1.25-1.25a3.5 3.5 0 1 1 4.95 4.95l-2.5 2.5a3.5 3.5 0 0 1-4.95 0 .751.751 0 0 1 .018-1.042.751.751 0 0 1 1.042-.018 1.998 1.998 0 0 0 2.83 0l2.5-2.5a2.002 2.002 0 0 0-2.83-2.83l-1.25 1.25a.751.751 0 0 1-1.042-.018.751.751 0 0 1-.018-1.042Zm-4.69 9.64a1.998 1.998 0 0 0 2.83 0l1.25-1.25a.751.751 0 0 1 1.042.018.751.751 0 0 1 .018 1.042l-1.25 1.25a3.5 3.5 0 1 1-4.95-4.95l2.5-2.5a3.5 3.5 0 0 1 4.95 0 .751.751 0 0 1-.018 1.042.751.751 0 0 1-1.042.018 1.998 1.998 0 0 0-2.83 0l-2.5 2.5a1.998 1.998 0 0 0 0 2.83Z\"\u003e\u003c/path\u003e\u003c/svg\u003e\u003c/a\u003e\u003c/div\u003e\n\u003cp dir=\"auto\"\u003eIntel Open Image Denoise is an open source library of high-performance,\nhigh-quality denoising filters for images rendered with ray tracing.\nIntel Open Image Denoise is part of the \u003ca href=\"https://software.intel.com/en-us/oneapi/render-kit\" rel=\"nofollow\"\u003eIntel® Rendering\nToolkit\u003c/a\u003e and is\nreleased under the permissive \u003ca href=\"http://www.apache.org/licenses/LICENSE-2.0\" rel=\"nofollow\"\u003eApache 2.0\nlicense\u003c/a\u003e.\u003c/p\u003e\n\u003cp dir=\"auto\"\u003eThe purpose of Intel Open Image Denoise is to provide an open,\nhigh-quality, efficient, and easy-to-use denoising library that allows\none to significantly reduce rendering times in ray tracing based\nrendering applications. It filters out the Monte Carlo noise inherent to\nstochastic ray tracing methods like path tracing, reducing the amount of\nnecessary samples per pixel by even multiple orders of magnitude\n(depending on the desired closeness to the ground truth). A simple but\nflexible C/C++ API ensures that the library can be easily integrated\ninto most existing or new rendering solutions.\u003c/p\u003e\n\u003cp dir=\"auto\"\u003eAt the heart of the Intel Open Image Denoise library is a collection of\nefficient deep learning based denoising filters, which were trained to\nhandle a wide range of samples per pixel (spp), from 1 spp to almost\nfully converged. Thus it is suitable for both preview and final-frame\nrendering. The filters can denoise images either using only the noisy\ncolor (\u003cem\u003ebeauty\u003c/em\u003e) buffer, or, to preserve as much detail as possible, can\noptionally utilize auxiliary feature buffers as well (e.g. albedo,\nnormal). Such buffers are supported by most renderers as arbitrary\noutput variables (AOVs) or can be usually implemented with little\neffort.\u003c/p\u003e\n\u003cp dir=\"auto\"\u003eAlthough the library ships with a set of pre-trained filter models, it\nis not mandatory to use these. To optimize a filter for a specific\nrenderer, sample count, content type, scene, etc., it is possible to\ntrain the model using the included training toolkit and user-provided\nimage datasets.\u003c/p\u003e\n\u003cp dir=\"auto\"\u003eIntel Open Image Denoise supports a wide variety of CPUs and GPUs from\ndifferent vendors:\u003c/p\u003e\n\u003cul dir=\"auto\"\u003e\n\u003cli\u003e\n\u003cp dir=\"auto\"\u003eIntel® 64 architecture compatible CPUs (with at least SSE4.1)\u003c/p\u003e\n\u003c/li\u003e\n\u003cli\u003e\n\u003cp dir=\"auto\"\u003eARM64 (AArch64) architecture CPUs (e.g. Apple silicon CPUs)\u003c/p\u003e\n\u003c/li\u003e\n\u003cli\u003e\n\u003cp dir=\"auto\"\u003eIntel Xe and Xe2 architecture dedicated and integrated GPUs,\nincluding Intel® Arc™ A-Series Graphics, Intel® Data Center GPU Flex\nSeries, Intel® Data Center GPU Max Series, Intel® Iris® Xe Graphics,\nIntel® Core™ Ultra Processors with Intel® Arc™ Graphics, 11th-14th\nGen Intel® Core™ processor graphics, and related Intel Pentium® and\nCeleron® processors (Xe-LP, Xe-LPG, Xe-LPG+, Xe-HPG, Xe-HPC,\nXe2-LPG, and Xe2-HPG microarchitectures)\u003c/p\u003e\n\u003c/li\u003e\n\u003cli\u003e\n\u003cp dir=\"auto\"\u003eNVIDIA GPUs with Volta, Turing, Ampere, Ada Lovelace, and Hopper\narchitectures\u003c/p\u003e\n\u003c/li\u003e\n\u003cli\u003e\n\u003cp dir=\"auto\"\u003eAMD GPUs with RDNA2 (Navi 21 only) and RDNA3 (Navi 3x) architectures\u003c/p\u003e\n\u003c/li\u003e\n\u003cli\u003e\n\u003cp dir=\"auto\"\u003eApple silicon GPUs (M1 and newer)\u003c/p\u003e\n\u003c/li\u003e\n\u003c/ul\u003e\n\u003cp dir=\"auto\"\u003eIt runs on most machines ranging from laptops to workstations and\ncompute nodes in HPC systems. It is efficient enough to be suitable not\nonly for offline rendering, but, depending on the hardware used, also\nfor interactive or even real-time ray tracing.\u003c/p\u003e\n\u003cp dir=\"auto\"\u003eIntel Open Image Denoise exploits modern instruction sets like SSE4,\nAVX2, AVX-512, and NEON on CPUs, Intel® Xe Matrix Extensions (Intel®\nXMX) on Intel GPUs, and tensor cores on NVIDIA GPUs to achieve high\ndenoising performance.\u003c/p\u003e\n\u003cdiv class=\"markdown-heading\" dir=\"auto\"\u003e\u003ch2 tabindex=\"-1\" class=\"heading-element\" dir=\"auto\"\u003eSystem Requirements\u003c/h2\u003e\u003ca id=\"user-content-system-requirements\" class=\"anchor\" aria-label=\"Permalink: System Requirements\" href=\"#system-requirements\"\u003e\u003csvg class=\"octicon octicon-link\" viewBox=\"0 0 16 16\" version=\"1.1\" width=\"16\" height=\"16\" aria-hidden=\"true\"\u003e\u003cpath d=\"m7.775 3.275 1.25-1.25a3.5 3.5 0 1 1 4.95 4.95l-2.5 2.5a3.5 3.5 0 0 1-4.95 0 .751.751 0 0 1 .018-1.042.751.751 0 0 1 1.042-.018 1.998 1.998 0 0 0 2.83 0l2.5-2.5a2.002 2.002 0 0 0-2.83-2.83l-1.25 1.25a.751.751 0 0 1-1.042-.018.751.751 0 0 1-.018-1.042Zm-4.69 9.64a1.998 1.998 0 0 0 2.83 0l1.25-1.25a.751.751 0 0 1 1.042.018.751.751 0 0 1 .018 1.042l-1.25 1.25a3.5 3.5 0 1 1-4.95-4.95l2.5-2.5a3.5 3.5 0 0 1 4.95 0 .751.751 0 0 1-.018 1.042.751.751 0 0 1-1.042.018 1.998 1.998 0 0 0-2.83 0l-2.5 2.5a1.998 1.998 0 0 0 0 2.83Z\"\u003e\u003c/path\u003e\u003c/svg\u003e\u003c/a\u003e\u003c/div\u003e\n\u003cp dir=\"auto\"\u003eYou need an Intel® 64 (with SSE4.1) or ARM64 architecture compatible CPU\nto run Intel Open Image Denoise, and you need a 64-bit Windows, Linux,\nor macOS operating system as well.\u003c/p\u003e\n\u003cp dir=\"auto\"\u003eFor Intel GPU support, please also install the latest Intel graphics\ndrivers:\u003c/p\u003e\n\u003cul dir=\"auto\"\u003e\n\u003cli\u003e\n\u003cp dir=\"auto\"\u003eWindows: \u003ca href=\"https://www.intel.com/content/www/us/en/download/726609/intel-arc-iris-xe-graphics-whql-windows.html\" rel=\"nofollow\"\u003eIntel® Graphics\nDriver\u003c/a\u003e\n31.0.101.4953 or newer\u003c/p\u003e\n\u003c/li\u003e\n\u003cli\u003e\n\u003cp dir=\"auto\"\u003eLinux: \u003ca href=\"https://dgpu-docs.intel.com/driver/installation.html\" rel=\"nofollow\"\u003eIntel® software for General Purpose GPU\ncapabilities\u003c/a\u003e\nrelease\n\u003ca href=\"https://dgpu-docs.intel.com/releases/stable_602_20230323.html\" rel=\"nofollow\"\u003e20230323\u003c/a\u003e\nor newer\u003c/p\u003e\n\u003c/li\u003e\n\u003c/ul\u003e\n\u003cp dir=\"auto\"\u003eUsing older driver versions is \u003cem\u003enot\u003c/em\u003e supported and Intel Open Image\nDenoise might run with only limited capabilities, have suboptimal\nperformance or might be unstable. Also, Resizable BAR \u003cem\u003emust\u003c/em\u003e be enabled\nin the BIOS for Intel dedicated GPUs if running on Linux, and strongly\nrecommended if running on Windows.\u003c/p\u003e\n\u003cp dir=\"auto\"\u003eFor NVIDIA GPU support, please also install the latest \u003ca href=\"https://www.nvidia.com/en-us/geforce/drivers/\" rel=\"nofollow\"\u003eNVIDIA graphics\ndrivers\u003c/a\u003e:\u003c/p\u003e\n\u003cul dir=\"auto\"\u003e\n\u003cli\u003e\n\u003cp dir=\"auto\"\u003eWindows: Version 452.39 or newer\u003c/p\u003e\n\u003c/li\u003e\n\u003cli\u003e\n\u003cp dir=\"auto\"\u003eLinux: Version 450.80.02 or newer\u003c/p\u003e\n\u003c/li\u003e\n\u003c/ul\u003e\n\u003cp dir=\"auto\"\u003eFor AMD GPU support, please also install the latest \u003ca href=\"https://www.amd.com/en/support\" rel=\"nofollow\"\u003eAMD graphics\ndrivers\u003c/a\u003e:\u003c/p\u003e\n\u003cul dir=\"auto\"\u003e\n\u003cli\u003e\n\u003cp dir=\"auto\"\u003eWindows: AMD Software: Adrenalin Edition 24.10.1 or newer\u003c/p\u003e\n\u003c/li\u003e\n\u003cli\u003e\n\u003cp dir=\"auto\"\u003eLinux: \u003ca href=\"https://www.amd.com/en/support/linux-drivers\" rel=\"nofollow\"\u003eRadeon Software for\nLinux\u003c/a\u003e version 24.20.3\nor newer\u003c/p\u003e\n\u003c/li\u003e\n\u003c/ul\u003e\n\u003cp dir=\"auto\"\u003eFor Apple GPU support, macOS Ventura or newer is required.\u003c/p\u003e\n\u003cdiv class=\"markdown-heading\" dir=\"auto\"\u003e\u003ch2 tabindex=\"-1\" class=\"heading-element\" dir=\"auto\"\u003eSupport and Contact\u003c/h2\u003e\u003ca id=\"user-content-support-and-contact\" class=\"anchor\" aria-label=\"Permalink: Support and Contact\" href=\"#support-and-contact\"\u003e\u003csvg class=\"octicon octicon-link\" viewBox=\"0 0 16 16\" version=\"1.1\" width=\"16\" height=\"16\" aria-hidden=\"true\"\u003e\u003cpath d=\"m7.775 3.275 1.25-1.25a3.5 3.5 0 1 1 4.95 4.95l-2.5 2.5a3.5 3.5 0 0 1-4.95 0 .751.751 0 0 1 .018-1.042.751.751 0 0 1 1.042-.018 1.998 1.998 0 0 0 2.83 0l2.5-2.5a2.002 2.002 0 0 0-2.83-2.83l-1.25 1.25a.751.751 0 0 1-1.042-.018.751.751 0 0 1-.018-1.042Zm-4.69 9.64a1.998 1.998 0 0 0 2.83 0l1.25-1.25a.751.751 0 0 1 1.042.018.751.751 0 0 1 .018 1.042l-1.25 1.25a3.5 3.5 0 1 1-4.95-4.95l2.5-2.5a3.5 3.5 0 0 1 4.95 0 .751.751 0 0 1-.018 1.042.751.751 0 0 1-1.042.018 1.998 1.998 0 0 0-2.83 0l-2.5 2.5a1.998 1.998 0 0 0 0 2.83Z\"\u003e\u003c/path\u003e\u003c/svg\u003e\u003c/a\u003e\u003c/div\u003e\n\u003cp dir=\"auto\"\u003eIntel Open Image Denoise is under active development, and though we do\nour best to guarantee stable release versions a certain number of bugs,\nas-yet-missing features, inconsistencies, or any other issues are still\npossible. Should you find any such issues please report them immediately\nvia the \u003ca href=\"https://github.com/OpenImageDenoise/oidn/issues\"\u003eIntel Open Image Denoise GitHub Issue\nTracker\u003c/a\u003e (or, if you\nshould happen to have a fix for it, you can also send us a pull\nrequest); for missing features please contact us via email at\n\u003ca href=\"mailto:openimagedenoise@googlegroups.com\"\u003eopenimagedenoise@googlegroups.com\u003c/a\u003e.\u003c/p\u003e\n\u003cp dir=\"auto\"\u003eJoin our \u003ca href=\"https://groups.google.com/d/forum/openimagedenoise/\" rel=\"nofollow\"\u003emailing\nlist\u003c/a\u003e to receive\nrelease announcements and major news regarding Intel Open Image Denoise.\u003c/p\u003e\n\u003cdiv class=\"markdown-heading\" dir=\"auto\"\u003e\u003ch2 tabindex=\"-1\" class=\"heading-element\" dir=\"auto\"\u003eCitation\u003c/h2\u003e\u003ca id=\"user-content-citation\" class=\"anchor\" aria-label=\"Permalink: Citation\" href=\"#citation\"\u003e\u003csvg class=\"octicon octicon-link\" viewBox=\"0 0 16 16\" version=\"1.1\" width=\"16\" height=\"16\" aria-hidden=\"true\"\u003e\u003cpath d=\"m7.775 3.275 1.25-1.25a3.5 3.5 0 1 1 4.95 4.95l-2.5 2.5a3.5 3.5 0 0 1-4.95 0 .751.751 0 0 1 .018-1.042.751.751 0 0 1 1.042-.018 1.998 1.998 0 0 0 2.83 0l2.5-2.5a2.002 2.002 0 0 0-2.83-2.83l-1.25 1.25a.751.751 0 0 1-1.042-.018.751.751 0 0 1-.018-1.042Zm-4.69 9.64a1.998 1.998 0 0 0 2.83 0l1.25-1.25a.751.751 0 0 1 1.042.018.751.751 0 0 1 .018 1.042l-1.25 1.25a3.5 3.5 0 1 1-4.95-4.95l2.5-2.5a3.5 3.5 0 0 1 4.95 0 .751.751 0 0 1-.018 1.042.751.751 0 0 1-1.042.018 1.998 1.998 0 0 0-2.83 0l-2.5 2.5a1.998 1.998 0 0 0 0 2.83Z\"\u003e\u003c/path\u003e\u003c/svg\u003e\u003c/a\u003e\u003c/div\u003e\n\u003cp dir=\"auto\"\u003eIf you use Intel Open Image Denoise in a research publication, please\ncite the project using the following BibTeX entry:\u003c/p\u003e\n\u003cdiv class=\"highlight highlight-text-bibtex notranslate position-relative overflow-auto\" dir=\"auto\" data-snippet-clipboard-copy-content=\"@misc{OpenImageDenoise,\n author = {Attila T. {\\'A}fra},\n title = {{Intel\\textsuperscript{\\textregistered} Open Image Denoise}},\n year = {2024},\n note = {\\url{https://www.openimagedenoise.org}}\n}\"\u003e\u003cpre\u003e\u003cspan class=\"pl-k\"\u003e@misc\u003c/span\u003e{\u003cspan class=\"pl-en\"\u003eOpenImageDenoise\u003c/span\u003e,\n \u003cspan class=\"pl-s\"\u003eauthor\u003c/span\u003e = \u003cspan class=\"pl-s\"\u003e\u003cspan class=\"pl-pds\"\u003e{\u003c/span\u003eAttila T. {\\'A}fra\u003cspan class=\"pl-pds\"\u003e}\u003c/span\u003e\u003c/span\u003e,\n \u003cspan class=\"pl-s\"\u003etitle\u003c/span\u003e = \u003cspan class=\"pl-s\"\u003e\u003cspan class=\"pl-pds\"\u003e{\u003c/span\u003e{Intel\\textsuperscript{\\textregistered} Open Image Denoise}\u003cspan class=\"pl-pds\"\u003e}\u003c/span\u003e\u003c/span\u003e,\n \u003cspan class=\"pl-s\"\u003eyear\u003c/span\u003e = \u003cspan class=\"pl-s\"\u003e\u003cspan class=\"pl-pds\"\u003e{\u003c/span\u003e2024\u003cspan class=\"pl-pds\"\u003e}\u003c/span\u003e\u003c/span\u003e,\n \u003cspan class=\"pl-s\"\u003enote\u003c/span\u003e = \u003cspan class=\"pl-s\"\u003e\u003cspan class=\"pl-pds\"\u003e{\u003c/span\u003e\\url{https://www.openimagedenoise.org}\u003cspan class=\"pl-pds\"\u003e}\u003c/span\u003e\u003c/span\u003e\n}\u003c/pre\u003e\u003c/div\u003e\n\u003cdiv class=\"markdown-heading\" dir=\"auto\"\u003e\u003ch1 tabindex=\"-1\" class=\"heading-element\" dir=\"auto\"\u003eCompilation\u003c/h1\u003e\u003ca id=\"user-content-compilation\" class=\"anchor\" aria-label=\"Permalink: Compilation\" href=\"#compilation\"\u003e\u003csvg class=\"octicon octicon-link\" viewBox=\"0 0 16 16\" version=\"1.1\" width=\"16\" height=\"16\" aria-hidden=\"true\"\u003e\u003cpath d=\"m7.775 3.275 1.25-1.25a3.5 3.5 0 1 1 4.95 4.95l-2.5 2.5a3.5 3.5 0 0 1-4.95 0 .751.751 0 0 1 .018-1.042.751.751 0 0 1 1.042-.018 1.998 1.998 0 0 0 2.83 0l2.5-2.5a2.002 2.002 0 0 0-2.83-2.83l-1.25 1.25a.751.751 0 0 1-1.042-.018.751.751 0 0 1-.018-1.042Zm-4.69 9.64a1.998 1.998 0 0 0 2.83 0l1.25-1.25a.751.751 0 0 1 1.042.018.751.751 0 0 1 .018 1.042l-1.25 1.25a3.5 3.5 0 1 1-4.95-4.95l2.5-2.5a3.5 3.5 0 0 1 4.95 0 .751.751 0 0 1-.018 1.042.751.751 0 0 1-1.042.018 1.998 1.998 0 0 0-2.83 0l-2.5 2.5a1.998 1.998 0 0 0 0 2.83Z\"\u003e\u003c/path\u003e\u003c/svg\u003e\u003c/a\u003e\u003c/div\u003e\n\u003cp dir=\"auto\"\u003eThe latest Intel Open Image Denoise sources are always available at the\n\u003ca href=\"http://github.com/OpenImageDenoise/oidn\"\u003eIntel Open Image Denoise GitHub\nrepository\u003c/a\u003e. The default\n\u003ccode\u003emaster\u003c/code\u003e branch should always point to the latest tested bugfix release.\u003c/p\u003e\n\u003cdiv class=\"markdown-heading\" dir=\"auto\"\u003e\u003ch2 tabindex=\"-1\" class=\"heading-element\" dir=\"auto\"\u003ePrerequisites\u003c/h2\u003e\u003ca id=\"user-content-prerequisites\" class=\"anchor\" aria-label=\"Permalink: Prerequisites\" href=\"#prerequisites\"\u003e\u003csvg class=\"octicon octicon-link\" viewBox=\"0 0 16 16\" version=\"1.1\" width=\"16\" height=\"16\" aria-hidden=\"true\"\u003e\u003cpath d=\"m7.775 3.275 1.25-1.25a3.5 3.5 0 1 1 4.95 4.95l-2.5 2.5a3.5 3.5 0 0 1-4.95 0 .751.751 0 0 1 .018-1.042.751.751 0 0 1 1.042-.018 1.998 1.998 0 0 0 2.83 0l2.5-2.5a2.002 2.002 0 0 0-2.83-2.83l-1.25 1.25a.751.751 0 0 1-1.042-.018.751.751 0 0 1-.018-1.042Zm-4.69 9.64a1.998 1.998 0 0 0 2.83 0l1.25-1.25a.751.751 0 0 1 1.042.018.751.751 0 0 1 .018 1.042l-1.25 1.25a3.5 3.5 0 1 1-4.95-4.95l2.5-2.5a3.5 3.5 0 0 1 4.95 0 .751.751 0 0 1-.018 1.042.751.751 0 0 1-1.042.018 1.998 1.998 0 0 0-2.83 0l-2.5 2.5a1.998 1.998 0 0 0 0 2.83Z\"\u003e\u003c/path\u003e\u003c/svg\u003e\u003c/a\u003e\u003c/div\u003e\n\u003cp dir=\"auto\"\u003eYou can clone the latest Intel Open Image Denoise sources using Git with\nthe \u003ca href=\"https://git-lfs.github.com/\"\u003eGit Large File Storage (LFS)\u003c/a\u003e\nextension installed:\u003c/p\u003e\n\u003cdiv class=\"snippet-clipboard-content notranslate position-relative overflow-auto\" data-snippet-clipboard-copy-content=\"git clone --recursive https://github.com/OpenImageDenoise/oidn.git\"\u003e\u003cpre class=\"notranslate\"\u003e\u003ccode\u003egit clone --recursive https://github.com/OpenImageDenoise/oidn.git\n\u003c/code\u003e\u003c/pre\u003e\u003c/div\u003e\n\u003cp dir=\"auto\"\u003ePlease note that installing the Git LFS extension is \u003cem\u003erequired\u003c/em\u003e to\ncorrectly clone the repository. Cloning without Git LFS will seemingly\nsucceed but actually some of the files will be invalid and thus\ncompilation will fail.\u003c/p\u003e\n\u003cp dir=\"auto\"\u003eIntel Open Image Denoise currently supports 64-bit Linux, Windows, and\nmacOS operating systems. Before you can build Intel Open Image Denoise\nyou need the following basic prerequisites:\u003c/p\u003e\n\u003cul dir=\"auto\"\u003e\n\u003cli\u003e\n\u003cp dir=\"auto\"\u003e\u003ca href=\"http://www.cmake.org\" rel=\"nofollow\"\u003eCMake\u003c/a\u003e 3.15 or newer\u003c/p\u003e\n\u003c/li\u003e\n\u003cli\u003e\n\u003cp dir=\"auto\"\u003eA C++11 compiler (we recommend using a Clang-based compiler but also\nsupport GCC and Microsoft Visual Studio 2015 and newer)\u003c/p\u003e\n\u003c/li\u003e\n\u003cli\u003e\n\u003cp dir=\"auto\"\u003ePython 3\u003c/p\u003e\n\u003c/li\u003e\n\u003c/ul\u003e\n\u003cp dir=\"auto\"\u003eTo build support for different types of CPUs and GPUs, the following\nadditional prerequisites are needed:\u003c/p\u003e\n\u003cdiv class=\"markdown-heading\" dir=\"auto\"\u003e\u003ch4 tabindex=\"-1\" class=\"heading-element\" dir=\"auto\"\u003eCPU device:\u003c/h4\u003e\u003ca id=\"user-content-cpu-device\" class=\"anchor\" aria-label=\"Permalink: CPU device:\" href=\"#cpu-device\"\u003e\u003csvg class=\"octicon octicon-link\" viewBox=\"0 0 16 16\" version=\"1.1\" width=\"16\" height=\"16\" aria-hidden=\"true\"\u003e\u003cpath d=\"m7.775 3.275 1.25-1.25a3.5 3.5 0 1 1 4.95 4.95l-2.5 2.5a3.5 3.5 0 0 1-4.95 0 .751.751 0 0 1 .018-1.042.751.751 0 0 1 1.042-.018 1.998 1.998 0 0 0 2.83 0l2.5-2.5a2.002 2.002 0 0 0-2.83-2.83l-1.25 1.25a.751.751 0 0 1-1.042-.018.751.751 0 0 1-.018-1.042Zm-4.69 9.64a1.998 1.998 0 0 0 2.83 0l1.25-1.25a.751.751 0 0 1 1.042.018.751.751 0 0 1 .018 1.042l-1.25 1.25a3.5 3.5 0 1 1-4.95-4.95l2.5-2.5a3.5 3.5 0 0 1 4.95 0 .751.751 0 0 1-.018 1.042.751.751 0 0 1-1.042.018 1.998 1.998 0 0 0-2.83 0l-2.5 2.5a1.998 1.998 0 0 0 0 2.83Z\"\u003e\u003c/path\u003e\u003c/svg\u003e\u003c/a\u003e\u003c/div\u003e\n\u003cul dir=\"auto\"\u003e\n\u003cli\u003e\n\u003cp dir=\"auto\"\u003e\u003ca href=\"http://ispc.github.io\" rel=\"nofollow\"\u003eIntel® SPMD Program Compiler (ISPC)\u003c/a\u003e 1.21.0\nor newer. Please obtain a release of ISPC from the \u003ca href=\"https://ispc.github.io/downloads.html\" rel=\"nofollow\"\u003eISPC downloads\npage\u003c/a\u003e. The build system looks\nfor ISPC in the \u003ccode\u003ePATH\u003c/code\u003e and in the directory right “next to” the\nchecked-out Intel Open Image Denoise sources. For example, if Intel\nOpen Image Denoise is in \u003ccode\u003e~/Projects/oidn\u003c/code\u003e, ISPC will also be\nsearched in \u003ccode\u003e~/Projects/ispc-v1.21.0-linux\u003c/code\u003e. Alternatively set the\nCMake variable \u003ccode\u003eISPC_EXECUTABLE\u003c/code\u003e to the location of the ISPC\ncompiler.\u003c/p\u003e\n\u003c/li\u003e\n\u003cli\u003e\n\u003cp dir=\"auto\"\u003e\u003ca href=\"https://github.com/oneapi-src/oneTBB\"\u003eIntel® Threading Building\nBlocks\u003c/a\u003e (TBB) 2017 or newer\u003c/p\u003e\n\u003c/li\u003e\n\u003c/ul\u003e\n\u003cdiv class=\"markdown-heading\" dir=\"auto\"\u003e\u003ch4 tabindex=\"-1\" class=\"heading-element\" dir=\"auto\"\u003eSYCL device for Intel GPUs:\u003c/h4\u003e\u003ca id=\"user-content-sycl-device-for-intel-gpus\" class=\"anchor\" aria-label=\"Permalink: SYCL device for Intel GPUs:\" href=\"#sycl-device-for-intel-gpus\"\u003e\u003csvg class=\"octicon octicon-link\" viewBox=\"0 0 16 16\" version=\"1.1\" width=\"16\" height=\"16\" aria-hidden=\"true\"\u003e\u003cpath d=\"m7.775 3.275 1.25-1.25a3.5 3.5 0 1 1 4.95 4.95l-2.5 2.5a3.5 3.5 0 0 1-4.95 0 .751.751 0 0 1 .018-1.042.751.751 0 0 1 1.042-.018 1.998 1.998 0 0 0 2.83 0l2.5-2.5a2.002 2.002 0 0 0-2.83-2.83l-1.25 1.25a.751.751 0 0 1-1.042-.018.751.751 0 0 1-.018-1.042Zm-4.69 9.64a1.998 1.998 0 0 0 2.83 0l1.25-1.25a.751.751 0 0 1 1.042.018.751.751 0 0 1 .018 1.042l-1.25 1.25a3.5 3.5 0 1 1-4.95-4.95l2.5-2.5a3.5 3.5 0 0 1 4.95 0 .751.751 0 0 1-.018 1.042.751.751 0 0 1-1.042.018 1.998 1.998 0 0 0-2.83 0l-2.5 2.5a1.998 1.998 0 0 0 0 2.83Z\"\u003e\u003c/path\u003e\u003c/svg\u003e\u003c/a\u003e\u003c/div\u003e\n\u003cul dir=\"auto\"\u003e\n\u003cli\u003e\n\u003cp dir=\"auto\"\u003eoneAPI DPC++ Compiler, one of the following versions (other versions\nare \u003cem\u003enot\u003c/em\u003e supported):\u003c/p\u003e\n\u003cul dir=\"auto\"\u003e\n\u003cli\u003e\u003ca href=\"https://github.com/intel/llvm/releases/tag/nightly-2023-10-26\"\u003eoneAPI DPC++\nCompiler 2023-10-26\u003c/a\u003e.\nThis is the open source version of the compiler, which is more\nup-to-date but less stable, so we \u003cem\u003estrongly\u003c/em\u003e recommend to use\nthis exact version. On Linux we also recommend to rebuild it\nfrom source with the \u003ccode\u003e--disable-fusion\u003c/code\u003e flag to minimize the\nsize of the SYCL runtime.\u003c/li\u003e\n\u003cli\u003e\u003ca href=\"https://github.com/intel/llvm/releases/tag/2022-12\"\u003eoneAPI DPC++\nCompiler 2022-12\u003c/a\u003e.\n\u003cem\u003eMust\u003c/em\u003e be rebuilt from source.\u003c/li\u003e\n\u003cli\u003e\u003ca href=\"https://www.intel.com/content/www/us/en/developer/tools/oneapi/dpc-compiler.html\" rel=\"nofollow\"\u003eIntel® oneAPI DPC++/C++\nCompiler\u003c/a\u003e\n2024.1 or newer\u003c/li\u003e\n\u003c/ul\u003e\n\u003c/li\u003e\n\u003cli\u003e\n\u003cp dir=\"auto\"\u003eIntel® Graphics Offline Compiler for OpenCL™ Code (OCLOC)\u003c/p\u003e\n\u003cul dir=\"auto\"\u003e\n\u003cli\u003e\n\u003cp dir=\"auto\"\u003eWindows: Version \u003ca href=\"https://registrationcenter-download.intel.com/akdlm/IRC_NAS/7000f8d2-dda8-4dd6-8b63-3917e4476fa5/intel-ocloc-2025.0.0.257_offline.exe\" rel=\"nofollow\"\u003e2025.0.0\n/ 32.0.101.6129\u003c/a\u003e\nor newer as a \u003ca href=\"https://www.intel.com/content/www/us/en/developer/articles/tool/oneapi-standalone-components.html\" rel=\"nofollow\"\u003estandalone component of Intel® oneAPI\nToolkits\u003c/a\u003e,\nwhich must be extracted and its contents added to the \u003ccode\u003ePATH\u003c/code\u003e.\nAlso included with \u003ca href=\"https://www.intel.com/content/www/us/en/developer/tools/oneapi/toolkits.html#base-kit\" rel=\"nofollow\"\u003eIntel® oneAPI Base\nToolkit\u003c/a\u003e.\u003c/p\u003e\n\u003c/li\u003e\n\u003cli\u003e\n\u003cp dir=\"auto\"\u003eLinux: Included with \u003ca href=\"https://dgpu-docs.intel.com\" rel=\"nofollow\"\u003eIntel® software for General Purpose GPU\ncapabilities\u003c/a\u003e release\n\u003ca href=\"https://dgpu-docs.intel.com/releases/rolling-release-notes.html#release-2024-10-31\" rel=\"nofollow\"\u003e2441.19\u003c/a\u003e\nor newer (install at least \u003ccode\u003eintel-opencl-icd\u003c/code\u003e on Ubuntu,\n\u003ccode\u003eintel-ocloc\u003c/code\u003e on RHEL or SLES). Also available with \u003ca href=\"https://github.com/intel/compute-runtime\"\u003eIntel®\nGraphics Compute Runtime for oneAPI Level Zero and OpenCL™\nDriver\u003c/a\u003e.\u003c/p\u003e\n\u003c/li\u003e\n\u003c/ul\u003e\n\u003c/li\u003e\n\u003cli\u003e\n\u003cp dir=\"auto\"\u003eIf using Intel® oneAPI DPC++/C++ Compiler:\n\u003ca href=\"http://www.cmake.org\" rel=\"nofollow\"\u003eCMake\u003c/a\u003e 3.25.2 or newer\u003c/p\u003e\n\u003c/li\u003e\n\u003cli\u003e\n\u003cp dir=\"auto\"\u003e\u003ca href=\"https://ninja-build.org\" rel=\"nofollow\"\u003eNinja\u003c/a\u003e or Make as the CMake generator. The\nVisual Studio generator is \u003cem\u003enot\u003c/em\u003e supported.\u003c/p\u003e\n\u003c/li\u003e\n\u003c/ul\u003e\n\u003cdiv class=\"markdown-heading\" dir=\"auto\"\u003e\u003ch4 tabindex=\"-1\" class=\"heading-element\" dir=\"auto\"\u003eCUDA device for NVIDIA GPUs:\u003c/h4\u003e\u003ca id=\"user-content-cuda-device-for-nvidia-gpus\" class=\"anchor\" aria-label=\"Permalink: CUDA device for NVIDIA GPUs:\" href=\"#cuda-device-for-nvidia-gpus\"\u003e\u003csvg class=\"octicon octicon-link\" viewBox=\"0 0 16 16\" version=\"1.1\" width=\"16\" height=\"16\" aria-hidden=\"true\"\u003e\u003cpath d=\"m7.775 3.275 1.25-1.25a3.5 3.5 0 1 1 4.95 4.95l-2.5 2.5a3.5 3.5 0 0 1-4.95 0 .751.751 0 0 1 .018-1.042.751.751 0 0 1 1.042-.018 1.998 1.998 0 0 0 2.83 0l2.5-2.5a2.002 2.002 0 0 0-2.83-2.83l-1.25 1.25a.751.751 0 0 1-1.042-.018.751.751 0 0 1-.018-1.042Zm-4.69 9.64a1.998 1.998 0 0 0 2.83 0l1.25-1.25a.751.751 0 0 1 1.042.018.751.751 0 0 1 .018 1.042l-1.25 1.25a3.5 3.5 0 1 1-4.95-4.95l2.5-2.5a3.5 3.5 0 0 1 4.95 0 .751.751 0 0 1-.018 1.042.751.751 0 0 1-1.042.018 1.998 1.998 0 0 0-2.83 0l-2.5 2.5a1.998 1.998 0 0 0 0 2.83Z\"\u003e\u003c/path\u003e\u003c/svg\u003e\u003c/a\u003e\u003c/div\u003e\n\u003cul dir=\"auto\"\u003e\n\u003cli\u003e\n\u003cp dir=\"auto\"\u003e\u003ca href=\"http://www.cmake.org\" rel=\"nofollow\"\u003eCMake\u003c/a\u003e 3.18 or newer\u003c/p\u003e\n\u003c/li\u003e\n\u003cli\u003e\n\u003cp dir=\"auto\"\u003e\u003ca href=\"https://developer.nvidia.com/cuda-toolkit\" rel=\"nofollow\"\u003eNVIDIA CUDA Toolkit\u003c/a\u003e\n11.8 or newer\u003c/p\u003e\n\u003c/li\u003e\n\u003c/ul\u003e\n\u003cdiv class=\"markdown-heading\" dir=\"auto\"\u003e\u003ch4 tabindex=\"-1\" class=\"heading-element\" dir=\"auto\"\u003eHIP device for AMD GPUs:\u003c/h4\u003e\u003ca id=\"user-content-hip-device-for-amd-gpus\" class=\"anchor\" aria-label=\"Permalink: HIP device for AMD GPUs:\" href=\"#hip-device-for-amd-gpus\"\u003e\u003csvg class=\"octicon octicon-link\" viewBox=\"0 0 16 16\" version=\"1.1\" width=\"16\" height=\"16\" aria-hidden=\"true\"\u003e\u003cpath d=\"m7.775 3.275 1.25-1.25a3.5 3.5 0 1 1 4.95 4.95l-2.5 2.5a3.5 3.5 0 0 1-4.95 0 .751.751 0 0 1 .018-1.042.751.751 0 0 1 1.042-.018 1.998 1.998 0 0 0 2.83 0l2.5-2.5a2.002 2.002 0 0 0-2.83-2.83l-1.25 1.25a.751.751 0 0 1-1.042-.018.751.751 0 0 1-.018-1.042Zm-4.69 9.64a1.998 1.998 0 0 0 2.83 0l1.25-1.25a.751.751 0 0 1 1.042.018.751.751 0 0 1 .018 1.042l-1.25 1.25a3.5 3.5 0 1 1-4.95-4.95l2.5-2.5a3.5 3.5 0 0 1 4.95 0 .751.751 0 0 1-.018 1.042.751.751 0 0 1-1.042.018 1.998 1.998 0 0 0-2.83 0l-2.5 2.5a1.998 1.998 0 0 0 0 2.83Z\"\u003e\u003c/path\u003e\u003c/svg\u003e\u003c/a\u003e\u003c/div\u003e\n\u003cul dir=\"auto\"\u003e\n\u003cli\u003e\n\u003cp dir=\"auto\"\u003e\u003ca href=\"http://www.cmake.org\" rel=\"nofollow\"\u003eCMake\u003c/a\u003e 3.21 or newer\u003c/p\u003e\n\u003c/li\u003e\n\u003cli\u003e\n\u003cp dir=\"auto\"\u003e\u003ca href=\"https://ninja-build.org\" rel=\"nofollow\"\u003eNinja\u003c/a\u003e or Make as the CMake generator. The\nVisual Studio generator is \u003cem\u003enot\u003c/em\u003e supported.\u003c/p\u003e\n\u003c/li\u003e\n\u003cli\u003e\n\u003cp dir=\"auto\"\u003e\u003ca href=\"https://rocm.docs.amd.com\" rel=\"nofollow\"\u003eAMD ROCm (HIP SDK)\u003c/a\u003e v6.1.2 or newer.\u003c/p\u003e\n\u003c/li\u003e\n\u003cli\u003e\n\u003cp dir=\"auto\"\u003ePerl (e.g. \u003ca href=\"https://strawberryperl.com\" rel=\"nofollow\"\u003eStrawberry Perl\u003c/a\u003e on Windows)\u003c/p\u003e\n\u003c/li\u003e\n\u003c/ul\u003e\n\u003cdiv class=\"markdown-heading\" dir=\"auto\"\u003e\u003ch4 tabindex=\"-1\" class=\"heading-element\" dir=\"auto\"\u003eMetal device for Apple GPUs:\u003c/h4\u003e\u003ca id=\"user-content-metal-device-for-apple-gpus\" class=\"anchor\" aria-label=\"Permalink: Metal device for Apple GPUs:\" href=\"#metal-device-for-apple-gpus\"\u003e\u003csvg class=\"octicon octicon-link\" viewBox=\"0 0 16 16\" version=\"1.1\" width=\"16\" height=\"16\" aria-hidden=\"true\"\u003e\u003cpath d=\"m7.775 3.275 1.25-1.25a3.5 3.5 0 1 1 4.95 4.95l-2.5 2.5a3.5 3.5 0 0 1-4.95 0 .751.751 0 0 1 .018-1.042.751.751 0 0 1 1.042-.018 1.998 1.998 0 0 0 2.83 0l2.5-2.5a2.002 2.002 0 0 0-2.83-2.83l-1.25 1.25a.751.751 0 0 1-1.042-.018.751.751 0 0 1-.018-1.042Zm-4.69 9.64a1.998 1.998 0 0 0 2.83 0l1.25-1.25a.751.751 0 0 1 1.042.018.751.751 0 0 1 .018 1.042l-1.25 1.25a3.5 3.5 0 1 1-4.95-4.95l2.5-2.5a3.5 3.5 0 0 1 4.95 0 .751.751 0 0 1-.018 1.042.751.751 0 0 1-1.042.018 1.998 1.998 0 0 0-2.83 0l-2.5 2.5a1.998 1.998 0 0 0 0 2.83Z\"\u003e\u003c/path\u003e\u003c/svg\u003e\u003c/a\u003e\u003c/div\u003e\n\u003cul dir=\"auto\"\u003e\n\u003cli\u003e\n\u003cp dir=\"auto\"\u003e\u003ca href=\"http://www.cmake.org\" rel=\"nofollow\"\u003eCMake\u003c/a\u003e 3.21 or newer\u003c/p\u003e\n\u003c/li\u003e\n\u003cli\u003e\n\u003cp dir=\"auto\"\u003e\u003ca href=\"https://developer.apple.com/xcode/\" rel=\"nofollow\"\u003eXcode\u003c/a\u003e 15.0 or newer\u003c/p\u003e\n\u003c/li\u003e\n\u003c/ul\u003e\n\u003cp dir=\"auto\"\u003eDepending on your operating system, you can install some required\ndependencies (e.g., TBB) using \u003ccode\u003eyum\u003c/code\u003e or \u003ccode\u003eapt-get\u003c/code\u003e on Linux,\n\u003ca href=\"https://brew.sh\" rel=\"nofollow\"\u003eHomebrew\u003c/a\u003e or \u003ca href=\"https://www.macports.org\" rel=\"nofollow\"\u003eMacPorts\u003c/a\u003e on\nmacOS, and \u003ca href=\"https://vcpkg.io\" rel=\"nofollow\"\u003e\u003ccode\u003evcpkg\u003c/code\u003e\u003c/a\u003e on Windows. For the other\ndependencies please download the necessary packages or installers and\nfollow the included instructions.\u003c/p\u003e\n\u003cdiv class=\"markdown-heading\" dir=\"auto\"\u003e\u003ch2 tabindex=\"-1\" class=\"heading-element\" dir=\"auto\"\u003eCompiling on Linux/macOS\u003c/h2\u003e\u003ca id=\"user-content-compiling-on-linuxmacos\" class=\"anchor\" aria-label=\"Permalink: Compiling on Linux/macOS\" href=\"#compiling-on-linuxmacos\"\u003e\u003csvg class=\"octicon octicon-link\" viewBox=\"0 0 16 16\" version=\"1.1\" width=\"16\" height=\"16\" aria-hidden=\"true\"\u003e\u003cpath d=\"m7.775 3.275 1.25-1.25a3.5 3.5 0 1 1 4.95 4.95l-2.5 2.5a3.5 3.5 0 0 1-4.95 0 .751.751 0 0 1 .018-1.042.751.751 0 0 1 1.042-.018 1.998 1.998 0 0 0 2.83 0l2.5-2.5a2.002 2.002 0 0 0-2.83-2.83l-1.25 1.25a.751.751 0 0 1-1.042-.018.751.751 0 0 1-.018-1.042Zm-4.69 9.64a1.998 1.998 0 0 0 2.83 0l1.25-1.25a.751.751 0 0 1 1.042.018.751.751 0 0 1 .018 1.042l-1.25 1.25a3.5 3.5 0 1 1-4.95-4.95l2.5-2.5a3.5 3.5 0 0 1 4.95 0 .751.751 0 0 1-.018 1.042.751.751 0 0 1-1.042.018 1.998 1.998 0 0 0-2.83 0l-2.5 2.5a1.998 1.998 0 0 0 0 2.83Z\"\u003e\u003c/path\u003e\u003c/svg\u003e\u003c/a\u003e\u003c/div\u003e\n\u003cp dir=\"auto\"\u003eIf you are building with SYCL support on Linux, make sure that the DPC++\ncompiler is properly set up. The open source oneAPI DPC++ Compiler can\nbe downloaded and simply extracted. However, before using the compiler,\nthe environment must be set up as well with the following command:\u003c/p\u003e\n\u003cdiv class=\"snippet-clipboard-content notranslate position-relative overflow-auto\" data-snippet-clipboard-copy-content=\"source ./dpcpp_compiler/startup.sh\"\u003e\u003cpre class=\"notranslate\"\u003e\u003ccode\u003esource ./dpcpp_compiler/startup.sh\n\u003c/code\u003e\u003c/pre\u003e\u003c/div\u003e\n\u003cp dir=\"auto\"\u003eThe \u003ccode\u003estartup.sh\u003c/code\u003e script will put \u003ccode\u003eclang\u003c/code\u003e and \u003ccode\u003eclang++\u003c/code\u003e from the oneAPI\nDPC++ Compiler into your \u003ccode\u003ePATH\u003c/code\u003e.\u003c/p\u003e\n\u003cp dir=\"auto\"\u003eAlternatively, if you have installed Intel® oneAPI DPC++/C++ Compiler\ninstead, you can set up the compiler by sourcing the \u003ccode\u003evars.sh\u003c/code\u003e script in\nthe \u003ccode\u003eenv\u003c/code\u003e directory of the compiler install directory, for example,\u003c/p\u003e\n\u003cdiv class=\"snippet-clipboard-content notranslate position-relative overflow-auto\" data-snippet-clipboard-copy-content=\"source /opt/intel/oneAPI/compiler/latest/env/vars.sh\"\u003e\u003cpre class=\"notranslate\"\u003e\u003ccode\u003esource /opt/intel/oneAPI/compiler/latest/env/vars.sh\n\u003c/code\u003e\u003c/pre\u003e\u003c/div\u003e\n\u003cp dir=\"auto\"\u003eThis script will put the \u003ccode\u003eicx\u003c/code\u003e and \u003ccode\u003eicpx\u003c/code\u003e compiler executables from the\nIntel(R) oneAPI DPC++/C++ Compiler in your \u003ccode\u003ePATH\u003c/code\u003e.\u003c/p\u003e\n\u003cul dir=\"auto\"\u003e\n\u003cli\u003e\n\u003cp dir=\"auto\"\u003eCreate a build directory, and go into it using a command prompt\u003c/p\u003e\n\u003cdiv class=\"snippet-clipboard-content notranslate position-relative overflow-auto\" data-snippet-clipboard-copy-content=\"mkdir oidn/build\ncd oidn/build\"\u003e\u003cpre class=\"notranslate\"\u003e\u003ccode\u003emkdir oidn/build\ncd oidn/build\n\u003c/code\u003e\u003c/pre\u003e\u003c/div\u003e\n\u003cp dir=\"auto\"\u003e(We do recommend having separate build directories for different\nconfigurations such as release, debug, etc.).\u003c/p\u003e\n\u003c/li\u003e\n\u003cli\u003e\n\u003cp dir=\"auto\"\u003eCMake will use the default compiler, which on most Linux machines is\n\u003ccode\u003egcc\u003c/code\u003e, but it can be switched to \u003ccode\u003eclang\u003c/code\u003e by executing the following:\u003c/p\u003e\n\u003cdiv class=\"snippet-clipboard-content notranslate position-relative overflow-auto\" data-snippet-clipboard-copy-content=\"cmake -G Ninja -DCMAKE_C_COMPILER=clang -DCMAKE_CXX_COMPILER=clang++ ..\"\u003e\u003cpre class=\"notranslate\"\u003e\u003ccode\u003ecmake -G Ninja -DCMAKE_C_COMPILER=clang -DCMAKE_CXX_COMPILER=clang++ ..\n\u003c/code\u003e\u003c/pre\u003e\u003c/div\u003e\n\u003cp dir=\"auto\"\u003eIf you are building with SYCL support, you must set the DPC++\ncompiler (\u003ccode\u003eclang\u003c/code\u003e/\u003ccode\u003eclang++\u003c/code\u003e or \u003ccode\u003eicx\u003c/code\u003e/\u003ccode\u003eicpx\u003c/code\u003e) as the C/C++ compiler\nhere. Note that the compiler variables cannot be changed after the\nfirst \u003ccode\u003ecmake\u003c/code\u003e or \u003ccode\u003eccmake\u003c/code\u003e run.\u003c/p\u003e\n\u003c/li\u003e\n\u003cli\u003e\n\u003cp dir=\"auto\"\u003eOpen the CMake configuration dialog\u003c/p\u003e\n\u003cdiv class=\"snippet-clipboard-content notranslate position-relative overflow-auto\" data-snippet-clipboard-copy-content=\"ccmake ..\"\u003e\u003cpre class=\"notranslate\"\u003e\u003ccode\u003eccmake ..\n\u003c/code\u003e\u003c/pre\u003e\u003c/div\u003e\n\u003c/li\u003e\n\u003cli\u003e\n\u003cp dir=\"auto\"\u003eMake sure to properly set the build mode and enable the components\nand options you need. By default only CPU support is built, so SYCL\nand other device support must be enabled manually (e.g. with the\n\u003ccode\u003eOIDN_DEVICE_SYCL\u003c/code\u003e option). Then type ’c’onfigure and ’g’enerate.\nWhen back on the command prompt, build the library using\u003c/p\u003e\n\u003cdiv class=\"snippet-clipboard-content notranslate position-relative overflow-auto\" data-snippet-clipboard-copy-content=\"ninja\"\u003e\u003cpre class=\"notranslate\"\u003e\u003ccode\u003eninja\n\u003c/code\u003e\u003c/pre\u003e\u003c/div\u003e\n\u003c/li\u003e\n\u003c/ul\u003e\n\u003cdiv class=\"markdown-heading\" dir=\"auto\"\u003e\u003ch2 tabindex=\"-1\" class=\"heading-element\" dir=\"auto\"\u003eCompiling on Windows\u003c/h2\u003e\u003ca id=\"user-content-compiling-on-windows\" class=\"anchor\" aria-label=\"Permalink: Compiling on Windows\" href=\"#compiling-on-windows\"\u003e\u003csvg class=\"octicon octicon-link\" viewBox=\"0 0 16 16\" version=\"1.1\" width=\"16\" height=\"16\" aria-hidden=\"true\"\u003e\u003cpath d=\"m7.775 3.275 1.25-1.25a3.5 3.5 0 1 1 4.95 4.95l-2.5 2.5a3.5 3.5 0 0 1-4.95 0 .751.751 0 0 1 .018-1.042.751.751 0 0 1 1.042-.018 1.998 1.998 0 0 0 2.83 0l2.5-2.5a2.002 2.002 0 0 0-2.83-2.83l-1.25 1.25a.751.751 0 0 1-1.042-.018.751.751 0 0 1-.018-1.042Zm-4.69 9.64a1.998 1.998 0 0 0 2.83 0l1.25-1.25a.751.751 0 0 1 1.042.018.751.751 0 0 1 .018 1.042l-1.25 1.25a3.5 3.5 0 1 1-4.95-4.95l2.5-2.5a3.5 3.5 0 0 1 4.95 0 .751.751 0 0 1-.018 1.042.751.751 0 0 1-1.042.018 1.998 1.998 0 0 0-2.83 0l-2.5 2.5a1.998 1.998 0 0 0 0 2.83Z\"\u003e\u003c/path\u003e\u003c/svg\u003e\u003c/a\u003e\u003c/div\u003e\n\u003cp dir=\"auto\"\u003eIf you are building with SYCL support, make sure that the DPC++ compiler\nis properly set up. The open source oneAPI DPC++ Compiler can be\ndownloaded and simply extracted. However, before using the compiler, the\nenvironment must be set up. To achieve this, open the “x64 Native Tools\nCommand Prompt for VS” that ships with Visual Studio and execute the\nfollowing commands:\u003c/p\u003e\n\u003cdiv class=\"snippet-clipboard-content notranslate position-relative overflow-auto\" data-snippet-clipboard-copy-content=\"set \u0026quot;DPCPP_DIR=path_to_dpcpp_compiler\u0026quot;\nset \u0026quot;PATH=%DPCPP_DIR%\\bin;%PATH%\u0026quot;\nset \u0026quot;PATH=%DPCPP_DIR%\\lib;%PATH%\u0026quot;\nset \u0026quot;CPATH=%DPCPP_DIR%\\include;%CPATH%\u0026quot;\nset \u0026quot;INCLUDE=%DPCPP_DIR%\\include;%INCLUDE%\u0026quot;\nset \u0026quot;LIB=%DPCPP_DIR%\\lib;%LIB%\u0026quot;\"\u003e\u003cpre class=\"notranslate\"\u003e\u003ccode\u003eset \"DPCPP_DIR=path_to_dpcpp_compiler\"\nset \"PATH=%DPCPP_DIR%\\bin;%PATH%\"\nset \"PATH=%DPCPP_DIR%\\lib;%PATH%\"\nset \"CPATH=%DPCPP_DIR%\\include;%CPATH%\"\nset \"INCLUDE=%DPCPP_DIR%\\include;%INCLUDE%\"\nset \"LIB=%DPCPP_DIR%\\lib;%LIB%\"\n\u003c/code\u003e\u003c/pre\u003e\u003c/div\u003e\n\u003cp dir=\"auto\"\u003eThe \u003ccode\u003epath_to_dpcpp_compiler\u003c/code\u003e should point to the unpacked oneAPI DPC++\nCompiler.\u003c/p\u003e\n\u003cp dir=\"auto\"\u003eAlternatively, if you have installed Intel® oneAPI DPC++/C++ Compiler\ninstead, you can either open a regular “Command Prompt” and execute the\n\u003ccode\u003evars.bat\u003c/code\u003e script in the \u003ccode\u003eenv\u003c/code\u003e directory of the compiler install\ndirectory, for example\u003c/p\u003e\n\u003cdiv class=\"snippet-clipboard-content notranslate position-relative overflow-auto\" data-snippet-clipboard-copy-content=\"C:\\Program Files (x86)\\Intel\\oneAPI\\compiler\\latest\\env\\vars.bat\"\u003e\u003cpre class=\"notranslate\"\u003e\u003ccode\u003eC:\\Program Files (x86)\\Intel\\oneAPI\\compiler\\latest\\env\\vars.bat\n\u003c/code\u003e\u003c/pre\u003e\u003c/div\u003e\n\u003cp dir=\"auto\"\u003eor simply open the installed “Intel oneAPI command prompt for Intel 64\nfor Visual Studio”. Either way, the \u003ccode\u003eicx\u003c/code\u003e compiler executable from the\nIntel® oneAPI DPC++/C++ Compiler will be added to your \u003ccode\u003ePATH\u003c/code\u003e.\u003c/p\u003e\n\u003cp dir=\"auto\"\u003eOn Windows we highly recommend to use Ninja as the CMake generator\nbecause not all devices can be built using the Visual Studio generator\n(e.g. SYCL).\u003c/p\u003e\n\u003cul dir=\"auto\"\u003e\n\u003cli\u003e\n\u003cp dir=\"auto\"\u003eCreate a build directory, and go into it using a Visual Studio\ncommand prompt\u003c/p\u003e\n\u003cdiv class=\"snippet-clipboard-content notranslate position-relative overflow-auto\" data-snippet-clipboard-copy-content=\"mkdir oidn/build\ncd oidn/build\"\u003e\u003cpre class=\"notranslate\"\u003e\u003ccode\u003emkdir oidn/build\ncd oidn/build\n\u003c/code\u003e\u003c/pre\u003e\u003c/div\u003e\n\u003cp dir=\"auto\"\u003e(We do recommend having separate build directories for different\nconfigurations such as release, debug, etc.).\u003c/p\u003e\n\u003c/li\u003e\n\u003cli\u003e\n\u003cp dir=\"auto\"\u003eCMake will use the default compiler, which on most Windows machines\nis MSVC, but it can be switched to \u003ccode\u003eclang\u003c/code\u003e by executing the\nfollowing:\u003c/p\u003e\n\u003cdiv class=\"snippet-clipboard-content notranslate position-relative overflow-auto\" data-snippet-clipboard-copy-content=\"cmake -G Ninja -DCMAKE_C_COMPILER=clang -DCMAKE_CXX_COMPILER=clang++ ..\"\u003e\u003cpre class=\"notranslate\"\u003e\u003ccode\u003ecmake -G Ninja -DCMAKE_C_COMPILER=clang -DCMAKE_CXX_COMPILER=clang++ ..\n\u003c/code\u003e\u003c/pre\u003e\u003c/div\u003e\n\u003cp dir=\"auto\"\u003eIf you are building with SYCL support, you must set the DPC++\ncompiler (\u003ccode\u003eclang\u003c/code\u003e/\u003ccode\u003eclang++\u003c/code\u003e or \u003ccode\u003eicx\u003c/code\u003e) as the C/C++ compiler here.\nNote that the compiler variables cannot be changed after the first\n\u003ccode\u003ecmake\u003c/code\u003e or \u003ccode\u003ecmake-gui\u003c/code\u003e run.\u003c/p\u003e\n\u003c/li\u003e\n\u003cli\u003e\n\u003cp dir=\"auto\"\u003eOpen the CMake GUI (\u003ccode\u003ecmake-gui.exe\u003c/code\u003e)\u003c/p\u003e\n\u003cdiv class=\"snippet-clipboard-content notranslate position-relative overflow-auto\" data-snippet-clipboard-copy-content=\"cmake-gui ..\"\u003e\u003cpre class=\"notranslate\"\u003e\u003ccode\u003ecmake-gui ..\n\u003c/code\u003e\u003c/pre\u003e\u003c/div\u003e\n\u003c/li\u003e\n\u003cli\u003e\n\u003cp dir=\"auto\"\u003eMake sure to properly set the build mode and enable the components\nand options you need. By default only CPU support is built, so SYCL\nand other device support must be enabled manually\n(e.g. \u003ccode\u003eOIDN_DEVICE_SYCL\u003c/code\u003e option). Then click on Configure and\nGenerate. When back on the command prompt, build the library using\u003c/p\u003e\n\u003cdiv class=\"snippet-clipboard-content notranslate position-relative overflow-auto\" data-snippet-clipboard-copy-content=\"ninja\"\u003e\u003cpre class=\"notranslate\"\u003e\u003ccode\u003eninja\n\u003c/code\u003e\u003c/pre\u003e\u003c/div\u003e\n\u003c/li\u003e\n\u003c/ul\u003e\n\u003cdiv class=\"markdown-heading\" dir=\"auto\"\u003e\u003ch2 tabindex=\"-1\" class=\"heading-element\" dir=\"auto\"\u003eCMake Configuration\u003c/h2\u003e\u003ca id=\"user-content-cmake-configuration\" class=\"anchor\" aria-label=\"Permalink: CMake Configuration\" href=\"#cmake-configuration\"\u003e\u003csvg class=\"octicon octicon-link\" viewBox=\"0 0 16 16\" version=\"1.1\" width=\"16\" height=\"16\" aria-hidden=\"true\"\u003e\u003cpath d=\"m7.775 3.275 1.25-1.25a3.5 3.5 0 1 1 4.95 4.95l-2.5 2.5a3.5 3.5 0 0 1-4.95 0 .751.751 0 0 1 .018-1.042.751.751 0 0 1 1.042-.018 1.998 1.998 0 0 0 2.83 0l2.5-2.5a2.002 2.002 0 0 0-2.83-2.83l-1.25 1.25a.751.751 0 0 1-1.042-.018.751.751 0 0 1-.018-1.042Zm-4.69 9.64a1.998 1.998 0 0 0 2.83 0l1.25-1.25a.751.751 0 0 1 1.042.018.751.751 0 0 1 .018 1.042l-1.25 1.25a3.5 3.5 0 1 1-4.95-4.95l2.5-2.5a3.5 3.5 0 0 1 4.95 0 .751.751 0 0 1-.018 1.042.751.751 0 0 1-1.042.018 1.998 1.998 0 0 0-2.83 0l-2.5 2.5a1.998 1.998 0 0 0 0 2.83Z\"\u003e\u003c/path\u003e\u003c/svg\u003e\u003c/a\u003e\u003c/div\u003e\n\u003cp dir=\"auto\"\u003eThe following list describes the options that can be configured in\nCMake:\u003c/p\u003e\n\u003cul dir=\"auto\"\u003e\n\u003cli\u003e\n\u003cp dir=\"auto\"\u003e\u003ccode\u003eCMAKE_BUILD_TYPE\u003c/code\u003e: Can be used to switch between Debug mode\n(Debug), Release mode (Release) (default), and Release mode with\nenabled assertions and debug symbols (RelWithDebInfo).\u003c/p\u003e\n\u003c/li\u003e\n\u003cli\u003e\n\u003cp dir=\"auto\"\u003e\u003ccode\u003eOIDN_STATIC_LIB\u003c/code\u003e: Build Open Image Denoise as a static (if only CPU\nsupport is enabled) or a hybrid static/shared (if GPU support is\nenabled as well) library.\u003c/p\u003e\n\u003c/li\u003e\n\u003cli\u003e\n\u003cp dir=\"auto\"\u003e\u003ccode\u003eOIDN_LIBRARY_NAME\u003c/code\u003e: Specifies the base name of the Open Image\nDenoise library files (\u003ccode\u003eOpenImageDenoise\u003c/code\u003e by default).\u003c/p\u003e\n\u003c/li\u003e\n\u003cli\u003e\n\u003cp dir=\"auto\"\u003e\u003ccode\u003eOIDN_API_NAMESPACE\u003c/code\u003e: Specifies a namespace to put all Open Image\nDenoise API symbols inside. This is also added as an outer namespace\nfor the C++ wrapper API. By default no namespace is used and plain C\nsymbols are exported.\u003c/p\u003e\n\u003c/li\u003e\n\u003cli\u003e\n\u003cp dir=\"auto\"\u003e\u003ccode\u003eOIDN_DEVICE_CPU\u003c/code\u003e: Enable CPU device support (ON by default).\u003c/p\u003e\n\u003c/li\u003e\n\u003cli\u003e\n\u003cp dir=\"auto\"\u003e\u003ccode\u003eOIDN_DEVICE_SYCL\u003c/code\u003e: Enable SYCL device support for Intel GPUs (OFF\nby default).\u003c/p\u003e\n\u003c/li\u003e\n\u003cli\u003e\n\u003cp dir=\"auto\"\u003e\u003ccode\u003eOIDN_DEVICE_SYCL_AOT\u003c/code\u003e: Enable ahead-of-time (AOT) compilation for\nSYCL kernels (ON by default). Turning this off removes dependency on\nOCLOC at build time and decreases binary size but significantly\nincreases initialization time at runtime, so it is recommended only\nfor development.\u003c/p\u003e\n\u003c/li\u003e\n\u003cli\u003e\n\u003cp dir=\"auto\"\u003e\u003ccode\u003eOIDN_DEVICE_CUDA\u003c/code\u003e: Enable CUDA device support for NVIDIA GPUs (OFF\nby default).\u003c/p\u003e\n\u003c/li\u003e\n\u003cli\u003e\n\u003cp dir=\"auto\"\u003e\u003ccode\u003eOIDN_DEVICE_CUDA_API\u003c/code\u003e: Use the CUDA driver API (\u003ccode\u003eDriver\u003c/code\u003e, default),\nthe static CUDA runtime library (\u003ccode\u003eRuntimeStatic\u003c/code\u003e), or the shared\nCUDA runtime library (\u003ccode\u003eRuntimeShared\u003c/code\u003e).\u003c/p\u003e\n\u003c/li\u003e\n\u003cli\u003e\n\u003cp dir=\"auto\"\u003e\u003ccode\u003eOIDN_DEVICE_HIP\u003c/code\u003e: Enable HIP device support for AMD GPUs (OFF by\ndefault).\u003c/p\u003e\n\u003c/li\u003e\n\u003cli\u003e\n\u003cp dir=\"auto\"\u003e\u003ccode\u003eOIDN_DEVICE_METAL\u003c/code\u003e: Enable Metal device support for Apple GPUs (OFF\nby default).\u003c/p\u003e\n\u003c/li\u003e\n\u003cli\u003e\n\u003cp dir=\"auto\"\u003e\u003ccode\u003eOIDN_FILTER_RT\u003c/code\u003e: Include the trained weights of the \u003ccode\u003eRT\u003c/code\u003e filter in\nthe build (ON by default). Turning this OFF significantly decreases\nthe size of the library binary, while the filter remains functional\nif the weights are set by the user at runtime.\u003c/p\u003e\n\u003c/li\u003e\n\u003cli\u003e\n\u003cp dir=\"auto\"\u003e\u003ccode\u003eOIDN_FILTER_RTLIGHTMAP\u003c/code\u003e: Include the trained weights of the\n\u003ccode\u003eRTLightmap\u003c/code\u003e filter in the build (ON by default).\u003c/p\u003e\n\u003c/li\u003e\n\u003cli\u003e\n\u003cp dir=\"auto\"\u003e\u003ccode\u003eOIDN_APPS\u003c/code\u003e: Enable building example and test applications (ON by\ndefault).\u003c/p\u003e\n\u003c/li\u003e\n\u003cli\u003e\n\u003cp dir=\"auto\"\u003e\u003ccode\u003eOIDN_APPS_OPENIMAGEIO\u003c/code\u003e: Enable\n\u003ca href=\"http://openimageio.org/\" rel=\"nofollow\"\u003eOpenImageIO\u003c/a\u003e support in the example and\ntest applications to be able to load/save OpenEXR, PNG, and other\nimage file formats (OFF by default).\u003c/p\u003e\n\u003c/li\u003e\n\u003cli\u003e\n\u003cp dir=\"auto\"\u003e\u003ccode\u003eOIDN_INSTALL_DEPENDENCIES\u003c/code\u003e: Enable installing the dependencies\n(e.g. TBB, SYCL runtime) as well.\u003c/p\u003e\n\u003c/li\u003e\n\u003cli\u003e\n\u003cp dir=\"auto\"\u003e\u003ccode\u003eTBB_ROOT\u003c/code\u003e: The path to the TBB installation (autodetected by\ndefault).\u003c/p\u003e\n\u003c/li\u003e\n\u003cli\u003e\n\u003cp dir=\"auto\"\u003e\u003ccode\u003eROCM_PATH\u003c/code\u003e: The path to the ROCm installation (autodetected by\ndefault).\u003c/p\u003e\n\u003c/li\u003e\n\u003cli\u003e\n\u003cp dir=\"auto\"\u003e\u003ccode\u003eOpenImageIO_ROOT\u003c/code\u003e: The path to the OpenImageIO installation\n(autodetected by default).\u003c/p\u003e\n\u003c/li\u003e\n\u003c/ul\u003e\n\u003cdiv class=\"markdown-heading\" dir=\"auto\"\u003e\u003ch1 tabindex=\"-1\" class=\"heading-element\" dir=\"auto\"\u003eDocumentation\u003c/h1\u003e\u003ca id=\"user-content-documentation\" class=\"anchor\" aria-label=\"Permalink: Documentation\" href=\"#documentation\"\u003e\u003csvg class=\"octicon octicon-link\" viewBox=\"0 0 16 16\" version=\"1.1\" width=\"16\" height=\"16\" aria-hidden=\"true\"\u003e\u003cpath d=\"m7.775 3.275 1.25-1.25a3.5 3.5 0 1 1 4.95 4.95l-2.5 2.5a3.5 3.5 0 0 1-4.95 0 .751.751 0 0 1 .018-1.042.751.751 0 0 1 1.042-.018 1.998 1.998 0 0 0 2.83 0l2.5-2.5a2.002 2.002 0 0 0-2.83-2.83l-1.25 1.25a.751.751 0 0 1-1.042-.018.751.751 0 0 1-.018-1.042Zm-4.69 9.64a1.998 1.998 0 0 0 2.83 0l1.25-1.25a.751.751 0 0 1 1.042.018.751.751 0 0 1 .018 1.042l-1.25 1.25a3.5 3.5 0 1 1-4.95-4.95l2.5-2.5a3.5 3.5 0 0 1 4.95 0 .751.751 0 0 1-.018 1.042.751.751 0 0 1-1.042.018 1.998 1.998 0 0 0-2.83 0l-2.5 2.5a1.998 1.998 0 0 0 0 2.83Z\"\u003e\u003c/path\u003e\u003c/svg\u003e\u003c/a\u003e\u003c/div\u003e\n\u003cp dir=\"auto\"\u003eThe following\n\u003ca href=\"https://github.com/OpenImageDenoise/oidn/blob/master/readme.pdf\" title=\"Intel Open Image Denoise Documentation\"\u003edocumentation\u003c/a\u003e\nof Intel Open Image Denoise can also be found as a \u003ca href=\"https://github.com/OpenImageDenoise/oidn/blob/master/readme.pdf\" title=\"Intel Open Image Denoise Documentation\"\u003epdf\ndocument\u003c/a\u003e.\u003c/p\u003e\n\u003cdiv class=\"markdown-heading\" dir=\"auto\"\u003e\u003ch1 tabindex=\"-1\" class=\"heading-element\" dir=\"auto\"\u003eOpen Image Denoise API\u003c/h1\u003e\u003ca id=\"user-content-open-image-denoise-api\" class=\"anchor\" aria-label=\"Permalink: Open Image Denoise API\" href=\"#open-image-denoise-api\"\u003e\u003csvg class=\"octicon octicon-link\" viewBox=\"0 0 16 16\" version=\"1.1\" width=\"16\" height=\"16\" aria-hidden=\"true\"\u003e\u003cpath d=\"m7.775 3.275 1.25-1.25a3.5 3.5 0 1 1 4.95 4.95l-2.5 2.5a3.5 3.5 0 0 1-4.95 0 .751.751 0 0 1 .018-1.042.751.751 0 0 1 1.042-.018 1.998 1.998 0 0 0 2.83 0l2.5-2.5a2.002 2.002 0 0 0-2.83-2.83l-1.25 1.25a.751.751 0 0 1-1.042-.018.751.751 0 0 1-.018-1.042Zm-4.69 9.64a1.998 1.998 0 0 0 2.83 0l1.25-1.25a.751.751 0 0 1 1.042.018.751.751 0 0 1 .018 1.042l-1.25 1.25a3.5 3.5 0 1 1-4.95-4.95l2.5-2.5a3.5 3.5 0 0 1 4.95 0 .751.751 0 0 1-.018 1.042.751.751 0 0 1-1.042.018 1.998 1.998 0 0 0-2.83 0l-2.5 2.5a1.998 1.998 0 0 0 0 2.83Z\"\u003e\u003c/path\u003e\u003c/svg\u003e\u003c/a\u003e\u003c/div\u003e\n\u003cp dir=\"auto\"\u003eOpen Image Denoise provides a C99 API (also compatible with C++) and a\nC++11 wrapper API as well. For simplicity, this document mostly refers\nto the C99 version of the API.\u003c/p\u003e\n\u003cp dir=\"auto\"\u003eThe API is designed in an object-oriented manner, e.g. it contains\ndevice objects (\u003ccode\u003eOIDNDevice\u003c/code\u003e type), buffer objects (\u003ccode\u003eOIDNBuffer\u003c/code\u003e type),\nand filter objects (\u003ccode\u003eOIDNFilter\u003c/code\u003e type). All objects are\nreference-counted, and handles can be released by calling the\nappropriate release function (e.g. \u003ccode\u003eoidnReleaseDevice\u003c/code\u003e) or retained by\nincrementing the reference count (e.g. \u003ccode\u003eoidnRetainDevice\u003c/code\u003e).\u003c/p\u003e\n\u003cp dir=\"auto\"\u003eAn important aspect of objects is that setting their parameters do not\nhave an immediate effect (with a few exceptions). Instead, objects with\nupdated parameters are in an unusable state until the parameters get\nexplicitly committed to a given object. The commit semantic allows for\nbatching up multiple small changes, and specifies exactly when changes\nto objects will occur.\u003c/p\u003e\n\u003cp dir=\"auto\"\u003eAll API calls are thread-safe, but operations that use the same device\nwill be serialized, so the amount of API calls from different threads\nshould be minimized.\u003c/p\u003e\n\u003cdiv class=\"markdown-heading\" dir=\"auto\"\u003e\u003ch2 tabindex=\"-1\" class=\"heading-element\" dir=\"auto\"\u003eExamples\u003c/h2\u003e\u003ca id=\"user-content-examples\" class=\"anchor\" aria-label=\"Permalink: Examples\" href=\"#examples\"\u003e\u003csvg class=\"octicon octicon-link\" viewBox=\"0 0 16 16\" version=\"1.1\" width=\"16\" height=\"16\" aria-hidden=\"true\"\u003e\u003cpath d=\"m7.775 3.275 1.25-1.25a3.5 3.5 0 1 1 4.95 4.95l-2.5 2.5a3.5 3.5 0 0 1-4.95 0 .751.751 0 0 1 .018-1.042.751.751 0 0 1 1.042-.018 1.998 1.998 0 0 0 2.83 0l2.5-2.5a2.002 2.002 0 0 0-2.83-2.83l-1.25 1.25a.751.751 0 0 1-1.042-.018.751.751 0 0 1-.018-1.042Zm-4.69 9.64a1.998 1.998 0 0 0 2.83 0l1.25-1.25a.751.751 0 0 1 1.042.018.751.751 0 0 1 .018 1.042l-1.25 1.25a3.5 3.5 0 1 1-4.95-4.95l2.5-2.5a3.5 3.5 0 0 1 4.95 0 .751.751 0 0 1-.018 1.042.751.751 0 0 1-1.042.018 1.998 1.998 0 0 0-2.83 0l-2.5 2.5a1.998 1.998 0 0 0 0 2.83Z\"\u003e\u003c/path\u003e\u003c/svg\u003e\u003c/a\u003e\u003c/div\u003e\n\u003cp dir=\"auto\"\u003eTo have a quick overview of the C99 and C++11 APIs, see the following\nsimple example code snippets.\u003c/p\u003e\n\u003cdiv class=\"markdown-heading\" dir=\"auto\"\u003e\u003ch3 tabindex=\"-1\" class=\"heading-element\" dir=\"auto\"\u003eBasic Denoising (C99 API)\u003c/h3\u003e\u003ca id=\"user-content-basic-denoising-c99-api\" class=\"anchor\" aria-label=\"Permalink: Basic Denoising (C99 API)\" href=\"#basic-denoising-c99-api\"\u003e\u003csvg class=\"octicon octicon-link\" viewBox=\"0 0 16 16\" version=\"1.1\" width=\"16\" height=\"16\" aria-hidden=\"true\"\u003e\u003cpath d=\"m7.775 3.275 1.25-1.25a3.5 3.5 0 1 1 4.95 4.95l-2.5 2.5a3.5 3.5 0 0 1-4.95 0 .751.751 0 0 1 .018-1.042.751.751 0 0 1 1.042-.018 1.998 1.998 0 0 0 2.83 0l2.5-2.5a2.002 2.002 0 0 0-2.83-2.83l-1.25 1.25a.751.751 0 0 1-1.042-.018.751.751 0 0 1-.018-1.042Zm-4.69 9.64a1.998 1.998 0 0 0 2.83 0l1.25-1.25a.751.751 0 0 1 1.042.018.751.751 0 0 1 .018 1.042l-1.25 1.25a3.5 3.5 0 1 1-4.95-4.95l2.5-2.5a3.5 3.5 0 0 1 4.95 0 .751.751 0 0 1-.018 1.042.751.751 0 0 1-1.042.018 1.998 1.998 0 0 0-2.83 0l-2.5 2.5a1.998 1.998 0 0 0 0 2.83Z\"\u003e\u003c/path\u003e\u003c/svg\u003e\u003c/a\u003e\u003c/div\u003e\n\u003cdiv class=\"highlight highlight-source-c++ notranslate position-relative overflow-auto\" dir=\"auto\" data-snippet-clipboard-copy-content=\"#include \u0026lt;OpenImageDenoise/oidn.h\u0026gt;\n...\n\n// Create an Open Image Denoise device\nOIDNDevice device = oidnNewDevice(OIDN_DEVICE_TYPE_DEFAULT); // CPU or GPU if available\n// OIDNDevice device = oidnNewDevice(OIDN_DEVICE_TYPE_CPU);\noidnCommitDevice(device);\n\n// Create buffers for input/output images accessible by both host (CPU) and device (CPU/GPU)\nOIDNBuffer colorBuf = oidnNewBuffer(device, width * height * 3 * sizeof(float));\nOIDNBuffer albedoBuf = ...\n\n// Create a filter for denoising a beauty (color) image using optional auxiliary images too\n// This can be an expensive operation, so try not to create a new filter for every image!\nOIDNFilter filter = oidnNewFilter(device, \u0026quot;RT\u0026quot;); // generic ray tracing filter\noidnSetFilterImage(filter, \u0026quot;color\u0026quot;, colorBuf,\n OIDN_FORMAT_FLOAT3, width, height, 0, 0, 0); // beauty\noidnSetFilterImage(filter, \u0026quot;albedo\u0026quot;, albedoBuf,\n OIDN_FORMAT_FLOAT3, width, height, 0, 0, 0); // auxiliary\noidnSetFilterImage(filter, \u0026quot;normal\u0026quot;, normalBuf,\n OIDN_FORMAT_FLOAT3, width, height, 0, 0, 0); // auxiliary\noidnSetFilterImage(filter, \u0026quot;output\u0026quot;, colorBuf,\n OIDN_FORMAT_FLOAT3, width, height, 0, 0, 0); // denoised beauty\noidnSetFilterBool(filter, \u0026quot;hdr\u0026quot;, true); // beauty image is HDR\noidnCommitFilter(filter);\n\n// Fill the input image buffers\nfloat* colorPtr = (float*)oidnGetBufferData(colorBuf);\n...\n\n// Filter the beauty image\noidnExecuteFilter(filter);\n\n// Check for errors\nconst char* errorMessage;\nif (oidnGetDeviceError(device, \u0026amp;errorMessage) != OIDN_ERROR_NONE)\n printf(\u0026quot;Error: %s\\n\u0026quot;, errorMessage);\n\n// Cleanup\noidnReleaseBuffer(colorBuf);\n...\noidnReleaseFilter(filter);\noidnReleaseDevice(device);\"\u003e\u003cpre\u003e#\u003cspan class=\"pl-k\"\u003einclude\u003c/span\u003e \u003cspan class=\"pl-s\"\u003e\u003cspan class=\"pl-pds\"\u003e\u0026lt;\u003c/span\u003eOpenImageDenoise/oidn.h\u003cspan class=\"pl-pds\"\u003e\u0026gt;\u003c/span\u003e\u003c/span\u003e\n...\n\n\u003cspan class=\"pl-c\"\u003e\u003cspan class=\"pl-c\"\u003e//\u003c/span\u003e Create an Open Image Denoise device\u003c/span\u003e\nOIDNDevice device = oidnNewDevice(OIDN_DEVICE_TYPE_DEFAULT); \u003cspan class=\"pl-c\"\u003e\u003cspan class=\"pl-c\"\u003e//\u003c/span\u003e CPU or GPU if available\u003c/span\u003e\n\u003cspan class=\"pl-c\"\u003e\u003cspan class=\"pl-c\"\u003e//\u003c/span\u003e OIDNDevice device = oidnNewDevice(OIDN_DEVICE_TYPE_CPU);\u003c/span\u003e\n\u003cspan class=\"pl-en\"\u003eoidnCommitDevice\u003c/span\u003e(device);\n\n\u003cspan class=\"pl-c\"\u003e\u003cspan class=\"pl-c\"\u003e//\u003c/span\u003e Create buffers for input/output images accessible by both host (CPU) and device (CPU/GPU)\u003c/span\u003e\nOIDNBuffer colorBuf = oidnNewBuffer(device, width * height * \u003cspan class=\"pl-c1\"\u003e3\u003c/span\u003e * \u003cspan class=\"pl-k\"\u003esizeof\u003c/span\u003e(\u003cspan class=\"pl-k\"\u003efloat\u003c/span\u003e));\nOIDNBuffer albedoBuf = ...\n\n\u003cspan class=\"pl-c\"\u003e\u003cspan class=\"pl-c\"\u003e//\u003c/span\u003e Create a filter for denoising a beauty (color) image using optional auxiliary images too\u003c/span\u003e\n\u003cspan class=\"pl-c\"\u003e\u003cspan class=\"pl-c\"\u003e//\u003c/span\u003e This can be an expensive operation, so try not to create a new filter for every image!\u003c/span\u003e\nOIDNFilter filter = oidnNewFilter(device, \u003cspan class=\"pl-s\"\u003e\u003cspan class=\"pl-pds\"\u003e\"\u003c/span\u003eRT\u003cspan class=\"pl-pds\"\u003e\"\u003c/span\u003e\u003c/span\u003e); \u003cspan class=\"pl-c\"\u003e\u003cspan class=\"pl-c\"\u003e//\u003c/span\u003e generic ray tracing filter\u003c/span\u003e\n\u003cspan class=\"pl-en\"\u003eoidnSetFilterImage\u003c/span\u003e(filter, \u003cspan class=\"pl-s\"\u003e\u003cspan class=\"pl-pds\"\u003e\"\u003c/span\u003ecolor\u003cspan class=\"pl-pds\"\u003e\"\u003c/span\u003e\u003c/span\u003e, colorBuf,\n OIDN_FORMAT_FLOAT3, width, height, \u003cspan class=\"pl-c1\"\u003e0\u003c/span\u003e, \u003cspan class=\"pl-c1\"\u003e0\u003c/span\u003e, \u003cspan class=\"pl-c1\"\u003e0\u003c/span\u003e); \u003cspan class=\"pl-c\"\u003e\u003cspan class=\"pl-c\"\u003e//\u003c/span\u003e beauty\u003c/span\u003e\n\u003cspan class=\"pl-en\"\u003eoidnSetFilterImage\u003c/span\u003e(filter, \u003cspan class=\"pl-s\"\u003e\u003cspan class=\"pl-pds\"\u003e\"\u003c/span\u003ealbedo\u003cspan class=\"pl-pds\"\u003e\"\u003c/span\u003e\u003c/span\u003e, albedoBuf,\n OIDN_FORMAT_FLOAT3, width, height, \u003cspan class=\"pl-c1\"\u003e0\u003c/span\u003e, \u003cspan class=\"pl-c1\"\u003e0\u003c/span\u003e, \u003cspan class=\"pl-c1\"\u003e0\u003c/span\u003e); \u003cspan class=\"pl-c\"\u003e\u003cspan class=\"pl-c\"\u003e//\u003c/span\u003e auxiliary\u003c/span\u003e\n\u003cspan class=\"pl-en\"\u003eoidnSetFilterImage\u003c/span\u003e(filter, \u003cspan class=\"pl-s\"\u003e\u003cspan class=\"pl-pds\"\u003e\"\u003c/span\u003enormal\u003cspan class=\"pl-pds\"\u003e\"\u003c/span\u003e\u003c/span\u003e, normalBuf,\n OIDN_FORMAT_FLOAT3, width, height, \u003cspan class=\"pl-c1\"\u003e0\u003c/span\u003e, \u003cspan class=\"pl-c1\"\u003e0\u003c/span\u003e, \u003cspan class=\"pl-c1\"\u003e0\u003c/span\u003e); \u003cspan class=\"pl-c\"\u003e\u003cspan class=\"pl-c\"\u003e//\u003c/span\u003e auxiliary\u003c/span\u003e\n\u003cspan class=\"pl-en\"\u003eoidnSetFilterImage\u003c/span\u003e(filter, \u003cspan class=\"pl-s\"\u003e\u003cspan class=\"pl-pds\"\u003e\"\u003c/span\u003eoutput\u003cspan class=\"pl-pds\"\u003e\"\u003c/span\u003e\u003c/span\u003e, colorBuf,\n OIDN_FORMAT_FLOAT3, width, height, \u003cspan class=\"pl-c1\"\u003e0\u003c/span\u003e, \u003cspan class=\"pl-c1\"\u003e0\u003c/span\u003e, \u003cspan class=\"pl-c1\"\u003e0\u003c/span\u003e); \u003cspan class=\"pl-c\"\u003e\u003cspan class=\"pl-c\"\u003e//\u003c/span\u003e denoised beauty\u003c/span\u003e\n\u003cspan class=\"pl-en\"\u003eoidnSetFilterBool\u003c/span\u003e(filter, \u003cspan class=\"pl-s\"\u003e\u003cspan class=\"pl-pds\"\u003e\"\u003c/span\u003ehdr\u003cspan class=\"pl-pds\"\u003e\"\u003c/span\u003e\u003c/span\u003e, \u003cspan class=\"pl-c1\"\u003etrue\u003c/span\u003e); \u003cspan class=\"pl-c\"\u003e\u003cspan class=\"pl-c\"\u003e//\u003c/span\u003e beauty image is HDR\u003c/span\u003e\n\u003cspan class=\"pl-en\"\u003eoidnCommitFilter\u003c/span\u003e(filter);\n\n\u003cspan class=\"pl-c\"\u003e\u003cspan class=\"pl-c\"\u003e//\u003c/span\u003e Fill the input image buffers\u003c/span\u003e\n\u003cspan class=\"pl-k\"\u003efloat\u003c/span\u003e* colorPtr = (\u003cspan class=\"pl-k\"\u003efloat\u003c/span\u003e*)oidnGetBufferData(colorBuf);\n...\n\n\u003cspan class=\"pl-c\"\u003e\u003cspan class=\"pl-c\"\u003e//\u003c/span\u003e Filter the beauty image\u003c/span\u003e\n\u003cspan class=\"pl-en\"\u003eoidnExecuteFilter\u003c/span\u003e(filter);\n\n\u003cspan class=\"pl-c\"\u003e\u003cspan class=\"pl-c\"\u003e//\u003c/span\u003e Check for errors\u003c/span\u003e\n\u003cspan class=\"pl-k\"\u003econst\u003c/span\u003e \u003cspan class=\"pl-k\"\u003echar\u003c/span\u003e* errorMessage;\n\u003cspan class=\"pl-k\"\u003eif\u003c/span\u003e (oidnGetDeviceError(device, \u0026amp;errorMessage) != OIDN_ERROR_NONE)\n \u003cspan class=\"pl-en\"\u003eprintf\u003c/span\u003e(\u003cspan class=\"pl-s\"\u003e\u003cspan class=\"pl-pds\"\u003e\"\u003c/span\u003eError: %s\u003cspan class=\"pl-cce\"\u003e\\n\u003c/span\u003e\u003cspan class=\"pl-pds\"\u003e\"\u003c/span\u003e\u003c/span\u003e, errorMessage);\n\n\u003cspan class=\"pl-c\"\u003e\u003cspan class=\"pl-c\"\u003e//\u003c/span\u003e Cleanup\u003c/span\u003e\n\u003cspan class=\"pl-en\"\u003eoidnReleaseBuffer\u003c/span\u003e(colorBuf);\n...\n\u003cspan class=\"pl-en\"\u003eoidnReleaseFilter\u003c/span\u003e(filter);\n\u003cspan class=\"pl-en\"\u003eoidnReleaseDevice\u003c/span\u003e(device);\u003c/pre\u003e\u003c/div\u003e\n\u003cdiv class=\"markdown-heading\" dir=\"auto\"\u003e\u003ch3 tabindex=\"-1\" class=\"heading-element\" dir=\"auto\"\u003eBasic Denoising (C++11 API)\u003c/h3\u003e\u003ca id=\"user-content-basic-denoising-c11-api\" class=\"anchor\" aria-label=\"Permalink: Basic Denoising (C++11 API)\" href=\"#basic-denoising-c11-api\"\u003e\u003csvg class=\"octicon octicon-link\" viewBox=\"0 0 16 16\" version=\"1.1\" width=\"16\" height=\"16\" aria-hidden=\"true\"\u003e\u003cpath d=\"m7.775 3.275 1.25-1.25a3.5 3.5 0 1 1 4.95 4.95l-2.5 2.5a3.5 3.5 0 0 1-4.95 0 .751.751 0 0 1 .018-1.042.751.751 0 0 1 1.042-.018 1.998 1.998 0 0 0 2.83 0l2.5-2.5a2.002 2.002 0 0 0-2.83-2.83l-1.25 1.25a.751.751 0 0 1-1.042-.018.751.751 0 0 1-.018-1.042Zm-4.69 9.64a1.998 1.998 0 0 0 2.83 0l1.25-1.25a.751.751 0 0 1 1.042.018.751.751 0 0 1 .018 1.042l-1.25 1.25a3.5 3.5 0 1 1-4.95-4.95l2.5-2.5a3.5 3.5 0 0 1 4.95 0 .751.751 0 0 1-.018 1.042.751.751 0 0 1-1.042.018 1.998 1.998 0 0 0-2.83 0l-2.5 2.5a1.998 1.998 0 0 0 0 2.83Z\"\u003e\u003c/path\u003e\u003c/svg\u003e\u003c/a\u003e\u003c/div\u003e\n\u003cdiv class=\"highlight highlight-source-c++ notranslate position-relative overflow-auto\" dir=\"auto\" data-snippet-clipboard-copy-content=\"#include \u0026lt;OpenImageDenoise/oidn.hpp\u0026gt;\n...\n\n// Create an Open Image Denoise device\noidn::DeviceRef device = oidn::newDevice(); // CPU or GPU if available\n// oidn::DeviceRef device = oidn::newDevice(oidn::DeviceType::CPU);\ndevice.commit();\n\n// Create buffers for input/output images accessible by both host (CPU) and device (CPU/GPU)\noidn::BufferRef colorBuf = device.newBuffer(width * height * 3 * sizeof(float));\noidn::BufferRef albedoBuf = ...\n\n// Create a filter for denoising a beauty (color) image using optional auxiliary images too\n// This can be an expensive operation, so try no to create a new filter for every image!\noidn::FilterRef filter = device.newFilter(\u0026quot;RT\u0026quot;); // generic ray tracing filter\nfilter.setImage(\u0026quot;color\u0026quot;, colorBuf, oidn::Format::Float3, width, height); // beauty\nfilter.setImage(\u0026quot;albedo\u0026quot;, albedoBuf, oidn::Format::Float3, width, height); // auxiliary\nfilter.setImage(\u0026quot;normal\u0026quot;, normalBuf, oidn::Format::Float3, width, height); // auxiliary\nfilter.setImage(\u0026quot;output\u0026quot;, colorBuf, oidn::Format::Float3, width, height); // denoised beauty\nfilter.set(\u0026quot;hdr\u0026quot;, true); // beauty image is HDR\nfilter.commit();\n\n// Fill the input image buffers\nfloat* colorPtr = (float*)colorBuf.getData();\n...\n\n// Filter the beauty image\nfilter.execute();\n\n// Check for errors\nconst char* errorMessage;\nif (device.getError(errorMessage) != oidn::Error::None)\n std::cout \u0026lt;\u0026lt; \u0026quot;Error: \u0026quot; \u0026lt;\u0026lt; errorMessage \u0026lt;\u0026lt; std::endl;\"\u003e\u003cpre\u003e#\u003cspan class=\"pl-k\"\u003einclude\u003c/span\u003e \u003cspan class=\"pl-s\"\u003e\u003cspan class=\"pl-pds\"\u003e\u0026lt;\u003c/span\u003eOpenImageDenoise/oidn.hpp\u003cspan class=\"pl-pds\"\u003e\u0026gt;\u003c/span\u003e\u003c/span\u003e\n...\n\n\u003cspan class=\"pl-c\"\u003e\u003cspan class=\"pl-c\"\u003e//\u003c/span\u003e Create an Open Image Denoise device\u003c/span\u003e\noidn::DeviceRef device = oidn::newDevice(); \u003cspan class=\"pl-c\"\u003e\u003cspan class=\"pl-c\"\u003e//\u003c/span\u003e CPU or GPU if available\u003c/span\u003e\n\u003cspan class=\"pl-c\"\u003e\u003cspan class=\"pl-c\"\u003e//\u003c/span\u003e oidn::DeviceRef device = oidn::newDevice(oidn::DeviceType::CPU);\u003c/span\u003e\ndevice.commit();\n\n\u003cspan class=\"pl-c\"\u003e\u003cspan class=\"pl-c\"\u003e//\u003c/span\u003e Create buffers for input/output images accessible by both host (CPU) and device (CPU/GPU)\u003c/span\u003e\noidn::BufferRef colorBuf = device.newBuffer(width * height * \u003cspan class=\"pl-c1\"\u003e3\u003c/span\u003e * \u003cspan class=\"pl-k\"\u003esizeof\u003c/span\u003e(\u003cspan class=\"pl-k\"\u003efloat\u003c/span\u003e));\noidn::BufferRef albedoBuf = ...\n\n\u003cspan class=\"pl-c\"\u003e\u003cspan class=\"pl-c\"\u003e//\u003c/span\u003e Create a filter for denoising a beauty (color) image using optional auxiliary images too\u003c/span\u003e\n\u003cspan class=\"pl-c\"\u003e\u003cspan class=\"pl-c\"\u003e//\u003c/span\u003e This can be an expensive operation, so try no to create a new filter for every image!\u003c/span\u003e\noidn::FilterRef filter = device.newFilter(\u003cspan class=\"pl-s\"\u003e\u003cspan class=\"pl-pds\"\u003e\"\u003c/span\u003eRT\u003cspan class=\"pl-pds\"\u003e\"\u003c/span\u003e\u003c/span\u003e); \u003cspan class=\"pl-c\"\u003e\u003cspan class=\"pl-c\"\u003e//\u003c/span\u003e generic ray tracing filter\u003c/span\u003e\nfilter.setImage(\u003cspan class=\"pl-s\"\u003e\u003cspan class=\"pl-pds\"\u003e\"\u003c/span\u003ecolor\u003cspan class=\"pl-pds\"\u003e\"\u003c/span\u003e\u003c/span\u003e, colorBuf, oidn::Format::Float3, width, height); \u003cspan class=\"pl-c\"\u003e\u003cspan class=\"pl-c\"\u003e//\u003c/span\u003e beauty\u003c/span\u003e\nfilter.setImage(\u003cspan class=\"pl-s\"\u003e\u003cspan class=\"pl-pds\"\u003e\"\u003c/span\u003ealbedo\u003cspan class=\"pl-pds\"\u003e\"\u003c/span\u003e\u003c/span\u003e, albedoBuf, oidn::Format::Float3, width, height); \u003cspan class=\"pl-c\"\u003e\u003cspan class=\"pl-c\"\u003e//\u003c/span\u003e auxiliary\u003c/span\u003e\nfilter.setImage(\u003cspan class=\"pl-s\"\u003e\u003cspan class=\"pl-pds\"\u003e\"\u003c/span\u003enormal\u003cspan class=\"pl-pds\"\u003e\"\u003c/span\u003e\u003c/span\u003e, normalBuf, oidn::Format::Float3, width, height); \u003cspan class=\"pl-c\"\u003e\u003cspan class=\"pl-c\"\u003e//\u003c/span\u003e auxiliary\u003c/span\u003e\nfilter.setImage(\u003cspan class=\"pl-s\"\u003e\u003cspan class=\"pl-pds\"\u003e\"\u003c/span\u003eoutput\u003cspan class=\"pl-pds\"\u003e\"\u003c/span\u003e\u003c/span\u003e, colorBuf, oidn::Format::Float3, width, height); \u003cspan class=\"pl-c\"\u003e\u003cspan class=\"pl-c\"\u003e//\u003c/span\u003e denoised beauty\u003c/span\u003e\nfilter.set(\u003cspan class=\"pl-s\"\u003e\u003cspan class=\"pl-pds\"\u003e\"\u003c/span\u003ehdr\u003cspan class=\"pl-pds\"\u003e\"\u003c/span\u003e\u003c/span\u003e, \u003cspan class=\"pl-c1\"\u003etrue\u003c/span\u003e); \u003cspan class=\"pl-c\"\u003e\u003cspan class=\"pl-c\"\u003e//\u003c/span\u003e beauty image is HDR\u003c/span\u003e\nfilter.commit();\n\n\u003cspan class=\"pl-c\"\u003e\u003cspan class=\"pl-c\"\u003e//\u003c/span\u003e Fill the input image buffers\u003c/span\u003e\n\u003cspan class=\"pl-k\"\u003efloat\u003c/span\u003e* colorPtr = (\u003cspan class=\"pl-k\"\u003efloat\u003c/span\u003e*)colorBuf.getData();\n...\n\n\u003cspan class=\"pl-c\"\u003e\u003cspan class=\"pl-c\"\u003e//\u003c/span\u003e Filter the beauty image\u003c/span\u003e\nfilter.execute();\n\n\u003cspan class=\"pl-c\"\u003e\u003cspan class=\"pl-c\"\u003e//\u003c/span\u003e Check for errors\u003c/span\u003e\n\u003cspan class=\"pl-k\"\u003econst\u003c/span\u003e \u003cspan class=\"pl-k\"\u003echar\u003c/span\u003e* errorMessage;\n\u003cspan class=\"pl-k\"\u003eif\u003c/span\u003e (device.getError(errorMessage) != oidn::Error::None)\n std::cout \u0026lt;\u0026lt; \u003cspan class=\"pl-s\"\u003e\u003cspan class=\"pl-pds\"\u003e\"\u003c/span\u003eError: \u003cspan class=\"pl-pds\"\u003e\"\u003c/span\u003e\u003c/span\u003e \u0026lt;\u0026lt; errorMessage \u0026lt;\u0026lt; std::endl;\u003c/pre\u003e\u003c/div\u003e\n\u003cdiv class=\"markdown-heading\" dir=\"auto\"\u003e\u003ch3 tabindex=\"-1\" class=\"heading-element\" dir=\"auto\"\u003eDenoising with Prefiltering (C++11 API)\u003c/h3\u003e\u003ca id=\"user-content-denoising-with-prefiltering-c11-api\" class=\"anchor\" aria-label=\"Permalink: Denoising with Prefiltering (C++11 API)\" href=\"#denoising-with-prefiltering-c11-api\"\u003e\u003csvg class=\"octicon octicon-link\" viewBox=\"0 0 16 16\" version=\"1.1\" width=\"16\" height=\"16\" aria-hidden=\"true\"\u003e\u003cpath d=\"m7.775 3.275 1.25-1.25a3.5 3.5 0 1 1 4.95 4.95l-2.5 2.5a3.5 3.5 0 0 1-4.95 0 .751.751 0 0 1 .018-1.042.751.751 0 0 1 1.042-.018 1.998 1.998 0 0 0 2.83 0l2.5-2.5a2.002 2.002 0 0 0-2.83-2.83l-1.25 1.25a.751.751 0 0 1-1.042-.018.751.751 0 0 1-.018-1.042Zm-4.69 9.64a1.998 1.998 0 0 0 2.83 0l1.25-1.25a.751.751 0 0 1 1.042.018.751.751 0 0 1 .018 1.042l-1.25 1.25a3.5 3.5 0 1 1-4.95-4.95l2.5-2.5a3.5 3.5 0 0 1 4.95 0 .751.751 0 0 1-.018 1.042.751.751 0 0 1-1.042.018 1.998 1.998 0 0 0-2.83 0l-2.5 2.5a1.998 1.998 0 0 0 0 2.83Z\"\u003e\u003c/path\u003e\u003c/svg\u003e\u003c/a\u003e\u003c/div\u003e\n\u003cdiv class=\"highlight highlight-source-c++ notranslate position-relative overflow-auto\" dir=\"auto\" data-snippet-clipboard-copy-content=\"// Create a filter for denoising a beauty (color) image using prefiltered auxiliary images too\noidn::FilterRef filter = device.newFilter(\u0026quot;RT\u0026quot;); // generic ray tracing filter\nfilter.setImage(\u0026quot;color\u0026quot;, colorBuf, oidn::Format::Float3, width, height); // beauty\nfilter.setImage(\u0026quot;albedo\u0026quot;, albedoBuf, oidn::Format::Float3, width, height); // auxiliary\nfilter.setImage(\u0026quot;normal\u0026quot;, normalBuf, oidn::Format::Float3, width, height); // auxiliary\nfilter.setImage(\u0026quot;output\u0026quot;, outputBuf, oidn::Format::Float3, width, height); // denoised beauty\nfilter.set(\u0026quot;hdr\u0026quot;, true); // beauty image is HDR\nfilter.set(\u0026quot;cleanAux\u0026quot;, true); // auxiliary images will be prefiltered\nfilter.commit();\n\n// Create a separate filter for denoising an auxiliary albedo image (in-place)\noidn::FilterRef albedoFilter = device.newFilter(\u0026quot;RT\u0026quot;); // same filter type as for beauty\nalbedoFilter.setImage(\u0026quot;albedo\u0026quot;, albedoBuf, oidn::Format::Float3, width, height);\nalbedoFilter.setImage(\u0026quot;output\u0026quot;, albedoBuf, oidn::Format::Float3, width, height);\nalbedoFilter.commit();\n\n// Create a separate filter for denoising an auxiliary normal image (in-place)\noidn::FilterRef normalFilter = device.newFilter(\u0026quot;RT\u0026quot;); // same filter type as for beauty\nnormalFilter.setImage(\u0026quot;normal\u0026quot;, normalBuf, oidn::Format::Float3, width, height);\nnormalFilter.setImage(\u0026quot;output\u0026quot;, normalBuf, oidn::Format::Float3, width, height);\nnormalFilter.commit();\n\n// Prefilter the auxiliary images\nalbedoFilter.execute();\nnormalFilter.execute();\n\n// Filter the beauty image\nfilter.execute();\"\u003e\u003cpre\u003e\u003cspan class=\"pl-c\"\u003e\u003cspan class=\"pl-c\"\u003e//\u003c/span\u003e Create a filter for denoising a beauty (color) image using prefiltered auxiliary images too\u003c/span\u003e\noidn::FilterRef filter = device.newFilter(\u003cspan class=\"pl-s\"\u003e\u003cspan class=\"pl-pds\"\u003e\"\u003c/span\u003eRT\u003cspan class=\"pl-pds\"\u003e\"\u003c/span\u003e\u003c/span\u003e); \u003cspan class=\"pl-c\"\u003e\u003cspan class=\"pl-c\"\u003e//\u003c/span\u003e generic ray tracing filter\u003c/span\u003e\nfilter.setImage(\u003cspan class=\"pl-s\"\u003e\u003cspan class=\"pl-pds\"\u003e\"\u003c/span\u003ecolor\u003cspan class=\"pl-pds\"\u003e\"\u003c/span\u003e\u003c/span\u003e, colorBuf, oidn::Format::Float3, width, height); \u003cspan class=\"pl-c\"\u003e\u003cspan class=\"pl-c\"\u003e//\u003c/span\u003e beauty\u003c/span\u003e\nfilter.setImage(\u003cspan class=\"pl-s\"\u003e\u003cspan class=\"pl-pds\"\u003e\"\u003c/span\u003ealbedo\u003cspan class=\"pl-pds\"\u003e\"\u003c/span\u003e\u003c/span\u003e, albedoBuf, oidn::Format::Float3, width, height); \u003cspan class=\"pl-c\"\u003e\u003cspan class=\"pl-c\"\u003e//\u003c/span\u003e auxiliary\u003c/span\u003e\nfilter.setImage(\u003cspan class=\"pl-s\"\u003e\u003cspan class=\"pl-pds\"\u003e\"\u003c/span\u003enormal\u003cspan class=\"pl-pds\"\u003e\"\u003c/span\u003e\u003c/span\u003e, normalBuf, oidn::Format::Float3, width, height); \u003cspan class=\"pl-c\"\u003e\u003cspan class=\"pl-c\"\u003e//\u003c/span\u003e auxiliary\u003c/span\u003e\nfilter.setImage(\u003cspan class=\"pl-s\"\u003e\u003cspan class=\"pl-pds\"\u003e\"\u003c/span\u003eoutput\u003cspan class=\"pl-pds\"\u003e\"\u003c/span\u003e\u003c/span\u003e, outputBuf, oidn::Format::Float3, width, height); \u003cspan class=\"pl-c\"\u003e\u003cspan class=\"pl-c\"\u003e//\u003c/span\u003e denoised beauty\u003c/span\u003e\nfilter.set(\u003cspan class=\"pl-s\"\u003e\u003cspan class=\"pl-pds\"\u003e\"\u003c/span\u003ehdr\u003cspan class=\"pl-pds\"\u003e\"\u003c/span\u003e\u003c/span\u003e, \u003cspan class=\"pl-c1\"\u003etrue\u003c/span\u003e); \u003cspan class=\"pl-c\"\u003e\u003cspan class=\"pl-c\"\u003e//\u003c/span\u003e beauty image is HDR\u003c/span\u003e\nfilter.set(\u003cspan class=\"pl-s\"\u003e\u003cspan class=\"pl-pds\"\u003e\"\u003c/span\u003ecleanAux\u003cspan class=\"pl-pds\"\u003e\"\u003c/span\u003e\u003c/span\u003e, \u003cspan class=\"pl-c1\"\u003etrue\u003c/span\u003e); \u003cspan class=\"pl-c\"\u003e\u003cspan class=\"pl-c\"\u003e//\u003c/span\u003e auxiliary images will be prefiltered\u003c/span\u003e\nfilter.commit();\n\n\u003cspan class=\"pl-c\"\u003e\u003cspan class=\"pl-c\"\u003e//\u003c/span\u003e Create a separate filter for denoising an auxiliary albedo image (in-place)\u003c/span\u003e\noidn::FilterRef albedoFilter = device.newFilter(\u003cspan class=\"pl-s\"\u003e\u003cspan class=\"pl-pds\"\u003e\"\u003c/span\u003eRT\u003cspan class=\"pl-pds\"\u003e\"\u003c/span\u003e\u003c/span\u003e); \u003cspan class=\"pl-c\"\u003e\u003cspan class=\"pl-c\"\u003e//\u003c/span\u003e same filter type as for beauty\u003c/span\u003e\nalbedoFilter.setImage(\u003cspan class=\"pl-s\"\u003e\u003cspan class=\"pl-pds\"\u003e\"\u003c/span\u003ealbedo\u003cspan class=\"pl-pds\"\u003e\"\u003c/span\u003e\u003c/span\u003e, albedoBuf, oidn::Format::Float3, width, height);\nalbedoFilter.setImage(\u003cspan class=\"pl-s\"\u003e\u003cspan class=\"pl-pds\"\u003e\"\u003c/span\u003eoutput\u003cspan class=\"pl-pds\"\u003e\"\u003c/span\u003e\u003c/span\u003e, albedoBuf, oidn::Format::Float3, width, height);\nalbedoFilter.commit();\n\n\u003cspan class=\"pl-c\"\u003e\u003cspan class=\"pl-c\"\u003e//\u003c/span\u003e Create a separate filter for denoising an auxiliary normal image (in-place)\u003c/span\u003e\noidn::FilterRef normalFilter = device.newFilter(\u003cspan class=\"pl-s\"\u003e\u003cspan class=\"pl-pds\"\u003e\"\u003c/span\u003eRT\u003cspan class=\"pl-pds\"\u003e\"\u003c/span\u003e\u003c/span\u003e); \u003cspan class=\"pl-c\"\u003e\u003cspan class=\"pl-c\"\u003e//\u003c/span\u003e same filter type as for beauty\u003c/span\u003e\nnormalFilter.setImage(\u003cspan class=\"pl-s\"\u003e\u003cspan class=\"pl-pds\"\u003e\"\u003c/span\u003enormal\u003cspan class=\"pl-pds\"\u003e\"\u003c/span\u003e\u003c/span\u003e, normalBuf, oidn::Format::Float3, width, height);\nnormalFilter.setImage(\u003cspan class=\"pl-s\"\u003e\u003cspan class=\"pl-pds\"\u003e\"\u003c/span\u003eoutput\u003cspan class=\"pl-pds\"\u003e\"\u003c/span\u003e\u003c/span\u003e, normalBuf, oidn::Format::Float3, width, height);\nnormalFilter.commit();\n\n\u003cspan class=\"pl-c\"\u003e\u003cspan class=\"pl-c\"\u003e//\u003c/span\u003e Prefilter the auxiliary images\u003c/span\u003e\nalbedoFilter.execute();\nnormalFilter.execute();\n\n\u003cspan class=\"pl-c\"\u003e\u003cspan class=\"pl-c\"\u003e//\u003c/span\u003e Filter the beauty image\u003c/span\u003e\nfilter.execute();\u003c/pre\u003e\u003c/div\u003e\n\u003cdiv class=\"markdown-heading\" dir=\"auto\"\u003e\u003ch2 tabindex=\"-1\" class=\"heading-element\" dir=\"auto\"\u003eUpgrading from Open Image Denoise 1.x\u003c/h2\u003e\u003ca id=\"user-content-upgrading-from-open-image-denoise-1x\" class=\"anchor\" aria-label=\"Permalink: Upgrading from Open Image Denoise 1.x\" href=\"#upgrading-from-open-image-denoise-1x\"\u003e\u003csvg class=\"octicon octicon-link\" viewBox=\"0 0 16 16\" version=\"1.1\" width=\"16\" height=\"16\" aria-hidden=\"true\"\u003e\u003cpath d=\"m7.775 3.275 1.25-1.25a3.5 3.5 0 1 1 4.95 4.95l-2.5 2.5a3.5 3.5 0 0 1-4.95 0 .751.751 0 0 1 .018-1.042.751.751 0 0 1 1.042-.018 1.998 1.998 0 0 0 2.83 0l2.5-2.5a2.002 2.002 0 0 0-2.83-2.83l-1.25 1.25a.751.751 0 0 1-1.042-.018.751.751 0 0 1-.018-1.042Zm-4.69 9.64a1.998 1.998 0 0 0 2.83 0l1.25-1.25a.751.751 0 0 1 1.042.018.751.751 0 0 1 .018 1.042l-1.25 1.25a3.5 3.5 0 1 1-4.95-4.95l2.5-2.5a3.5 3.5 0 0 1 4.95 0 .751.751 0 0 1-.018 1.042.751.751 0 0 1-1.042.018 1.998 1.998 0 0 0-2.83 0l-2.5 2.5a1.998 1.998 0 0 0 0 2.83Z\"\u003e\u003c/path\u003e\u003c/svg\u003e\u003c/a\u003e\u003c/div\u003e\n\u003cp dir=\"auto\"\u003eOpen Image Denoise 2 introduces GPU support, which requires implementing\nsome minor changes in applications. There are also small API changes,\nadditions and improvements in this new version. In this section we\nsummarize the necessary code modifications and also briefly mention the\nnew features that users might find useful when upgrading to version 2.x.\nFor a full description of the changes and new functionality, please see\nthe API reference.\u003c/p\u003e\n\u003cdiv class=\"markdown-heading\" dir=\"auto\"\u003e\u003ch3 tabindex=\"-1\" class=\"heading-element\" dir=\"auto\"\u003eBuffers\u003c/h3\u003e\u003ca id=\"user-content-buffers\" class=\"anchor\" aria-label=\"Permalink: Buffers\" href=\"#buffers\"\u003e\u003csvg class=\"octicon octicon-link\" viewBox=\"0 0 16 16\" version=\"1.1\" width=\"16\" height=\"16\" aria-hidden=\"true\"\u003e\u003cpath d=\"m7.775 3.275 1.25-1.25a3.5 3.5 0 1 1 4.95 4.95l-2.5 2.5a3.5 3.5 0 0 1-4.95 0 .751.751 0 0 1 .018-1.042.751.751 0 0 1 1.042-.018 1.998 1.998 0 0 0 2.83 0l2.5-2.5a2.002 2.002 0 0 0-2.83-2.83l-1.25 1.25a.751.751 0 0 1-1.042-.018.751.751 0 0 1-.018-1.042Zm-4.69 9.64a1.998 1.998 0 0 0 2.83 0l1.25-1.25a.751.751 0 0 1 1.042.018.751.751 0 0 1 .018 1.042l-1.25 1.25a3.5 3.5 0 1 1-4.95-4.95l2.5-2.5a3.5 3.5 0 0 1 4.95 0 .751.751 0 0 1-.018 1.042.751.751 0 0 1-1.042.018 1.998 1.998 0 0 0-2.83 0l-2.5 2.5a1.998 1.998 0 0 0 0 2.83Z\"\u003e\u003c/path\u003e\u003c/svg\u003e\u003c/a\u003e\u003c/div\u003e\n\u003cp dir=\"auto\"\u003eThe most important required change is related to how data is passed to\nOpen Image Denoise. If the application is explicitly using only the CPU\n(by specifying \u003ccode\u003eOIDN_DEVICE_TYPE_CPU\u003c/code\u003e), no changes should be necessary.\nBut if it wants to support GPUs as well, passing pointers to memory\nallocated with the system allocator (e.g. \u003ccode\u003emalloc\u003c/code\u003e) would raise an error\nbecause GPUs cannot access such memory in almost all cases.\u003c/p\u003e\n\u003cp dir=\"auto\"\u003eTo ensure compatibility with any kind of device, including GPUs, the\napplication should use \u003ccode\u003eOIDNBuffer\u003c/code\u003e objects to store all image data\npassed to the library. Memory allocated using buffers is by default\naccessible by both the host (CPU) and the device (CPU or GPU).\u003c/p\u003e\n\u003cp dir=\"auto\"\u003eIdeally, the application should directly read and write image data\nto/from such buffers to avoid redundant and inefficient data copying. If\nthis cannot be implemented, the application should try to minimize the\noverhead of copying as much as possible:\u003c/p\u003e\n\u003cul dir=\"auto\"\u003e\n\u003cli\u003e\n\u003cp dir=\"auto\"\u003eData should be copied to/from buffers only if the data in system\nmemory indeed cannot be accessed by the device. This can be\ndetermined by simply querying the \u003ccode\u003esystemMemorySupported\u003c/code\u003e device\nparameter. If system allocated memory is accessible by the device,\nno buffers are necessary and filter image parameters can be set with\n\u003ccode\u003eoidnSetSharedFilterImage\u003c/code\u003e.\u003c/p\u003e\n\u003c/li\u003e\n\u003cli\u003e\n\u003cp dir=\"auto\"\u003eIf the image data cannot be accessed by the device, buffers must be\ncreated and the data must be copied to/from these buffers. These\nbuffers should be directly passed to filters as image parameters\ninstead of the original pointers using \u003ccode\u003eoidnSetFilterImage\u003c/code\u003e.\u003c/p\u003e\n\u003c/li\u003e\n\u003cli\u003e\n\u003cp dir=\"auto\"\u003eData should be copied asynchronously using using the new\n\u003ccode\u003eoidnReadBufferAsync\u003c/code\u003e and \u003ccode\u003eoidnWriteBufferAsync\u003c/code\u003e functions, which\nmay achieve higher performance than plain \u003ccode\u003ememcpy\u003c/code\u003e.\u003c/p\u003e\n\u003c/li\u003e\n\u003cli\u003e\n\u003cp dir=\"auto\"\u003eIf image data must be copied, using the default buffer allocation\nmay not be the most efficient method. If the device memory is not\nphysically shared with the host memory (e.g. for dedicated GPUs),\nhigher performance may be achieved by creating the buffers with\ndevice storage (\u003ccode\u003eOIDN_STORAGE_DEVICE\u003c/code\u003e) using the new\n\u003ccode\u003eoidnNewBufferWithStorage\u003c/code\u003e function. This way, the buffer data\ncannot be directly accessed by the host anymore but this should not\nmatter because the data must be copied from some other memory\nlocation anyway. However, this ensures that the data is stored only\nin high-performance device memory, and the user has full control\nover when and how the data is transferred between host and device.\u003c/p\u003e\n\u003c/li\u003e\n\u003c/ul\u003e\n\u003cp dir=\"auto\"\u003eThe \u003ccode\u003eoidnMapBuffer\u003c/code\u003e and \u003ccode\u003eoidnUnmapBuffer\u003c/code\u003e functions have been removed\nfrom the API due to these not being supported by any of the device\nbackends. Please use \u003ccode\u003eoidnReadBuffer(Async)\u003c/code\u003e and\n\u003ccode\u003eoidnWriteBuffer(Async)\u003c/code\u003e instead.\u003c/p\u003e\n\u003cdiv class=\"markdown-heading\" dir=\"auto\"\u003e\u003ch3 tabindex=\"-1\" class=\"heading-element\" dir=\"auto\"\u003eInterop with Compute (SYCL, CUDA, HIP) and Graphics (DX, Vulkan, Metal) APIs\u003c/h3\u003e\u003ca id=\"user-content-interop-with-compute-sycl-cuda-hip-and-graphics-dx-vulkan-metal-apis\" class=\"anchor\" aria-label=\"Permalink: Interop with Compute (SYCL, CUDA, HIP) and Graphics (DX, Vulkan, Metal) APIs\" href=\"#interop-with-compute-sycl-cuda-hip-and-graphics-dx-vulkan-metal-apis\"\u003e\u003csvg class=\"octicon octicon-link\" viewBox=\"0 0 16 16\" version=\"1.1\" width=\"16\" height=\"16\" aria-hidden=\"true\"\u003e\u003cpath d=\"m7.775 3.275 1.25-1.25a3.5 3.5 0 1 1 4.95 4.95l-2.5 2.5a3.5 3.5 0 0 1-4.95 0 .751.751 0 0 1 .018-1.042.751.751 0 0 1 1.042-.018 1.998 1.998 0 0 0 2.83 0l2.5-2.5a2.002 2.002 0 0 0-2.83-2.83l-1.25 1.25a.751.751 0 0 1-1.042-.018.751.751 0 0 1-.018-1.042Zm-4.69 9.64a1.998 1.998 0 0 0 2.83 0l1.25-1.25a.751.751 0 0 1 1.042.018.751.751 0 0 1 .018 1.042l-1.25 1.25a3.5 3.5 0 1 1-4.95-4.95l2.5-2.5a3.5 3.5 0 0 1 4.95 0 .751.751 0 0 1-.018 1.042.751.751 0 0 1-1.042.018 1.998 1.998 0 0 0-2.83 0l-2.5 2.5a1.998 1.998 0 0 0 0 2.83Z\"\u003e\u003c/path\u003e\u003c/svg\u003e\u003c/a\u003e\u003c/div\u003e\n\u003cp dir=\"auto\"\u003eIf the application is explicitly using a particular device type which\nsupports unified memory allocations, e.g. SYCL or CUDA, it may directly\npass pointers allocated using the native allocator of the respective\ncompute API (e.g. \u003ccode\u003esycl::malloc_device\u003c/code\u003e, \u003ccode\u003ecudaMalloc\u003c/code\u003e) instead of using\nbuffers. This way, it is the responsibility of the user to correctly\nallocate the memory for the device.\u003c/p\u003e\n\u003cp dir=\"auto\"\u003eIn such cases, it often necessary to have more control over the device\ncreation as well, to ensure that filtering is running on the intended\ndevice and command queues or streams from the application can be shared\nto improve performance. If the application is using the same compute or\ngraphics API as the Open Image Denoise device, this can be achieved by\ncreating devices with \u003ccode\u003eoidnNewSYCLDevice\u003c/code\u003e, \u003ccode\u003eoidnNewCUDADevice\u003c/code\u003e, etc. For\nsome APIs there are additional interoperability functions as well,\ne.g. \u003ccode\u003eoidnExecuteSYCLFilterAsync\u003c/code\u003e.\u003c/p\u003e\n\u003cp dir=\"auto\"\u003eIf the application is using a graphics API which does not support\nunified memory allocations, e.g. DX12 or Vulkan, it may be still\npossible to share memory between the application and Open Image Denoise\nusing buffers, avoiding expensive copying through host memory. External\nbuffers can be imported from graphics APIs with the new\n\u003ccode\u003eoidnNewSharedBufferFromFD\u003c/code\u003e and \u003ccode\u003eoidnNewSharedBufferFromWin32Handle\u003c/code\u003e\nfunctions. To use this feature, buffers must be exported in the graphics\nAPI and must be imported in Open Image Denoise using the same kind of\nhandle. Care must be taken to select an external memory handle type\nwhich is supported by both APIs. The external memory types supported by\nan Open Image Denoise device can be queried using the\n\u003ccode\u003eexternalMemoryTypes\u003c/code\u003e device parameter. Note that some devices do not\nsupport importing external memory at all (e.g. CPUs, and on GPUs it\nprimarily depends on the installed drivers), so the application should\nalways implement a fallback too, which copies the data through the host\nif there is no other supported way. Metal buffers can be used directly\nwith the \u003ccode\u003eoidnNewSharedBufferFromMetal\u003c/code\u003e function.\u003c/p\u003e\n\u003cp dir=\"auto\"\u003eSharing textures is currently not supported natively but it is still\npossible avoid copying texture data by using a linear texture layout\n(e.g. \u003ccode\u003eVK_IMAGE_TILING_LINEAR\u003c/code\u003e in Vulkan) and sharing the buffer that\nbacks this data. In this case, you should ensure that the row stride of\nthe linear texture data is correctly set.\u003c/p\u003e\n\u003cp dir=\"auto\"\u003eImporting external synchronization primitives (e.g. semaphores) from\ngraphics APIs is not yet supported either but it is planned for a future\nrelease. Meanwhile, synchronizing access to shared memory should be done\non the host using \u003ccode\u003eoidnSyncDevice\u003c/code\u003e and the used graphics API.\u003c/p\u003e\n\u003cp dir=\"auto\"\u003eWhen importing external memory, the application also needs to make sure\nthat the Open Image Denoise device is running on the same \u003cem\u003ephysical\u003c/em\u003e\ndevice as the graphics API. This can be easily achieved by using the new\nphysical device feature, described in the next section.\u003c/p\u003e\n\u003cdiv class=\"markdown-heading\" dir=\"auto\"\u003e\u003ch3 tabindex=\"-1\" class=\"heading-element\" dir=\"auto\"\u003ePhysical Devices\u003c/h3\u003e\u003ca id=\"user-content-physical-devices\" class=\"anchor\" aria-label=\"Permalink: Physical Devices\" href=\"#physical-devices\"\u003e\u003csvg class=\"octicon octicon-link\" viewBox=\"0 0 16 16\" version=\"1.1\" width=\"16\" height=\"16\" aria-hidden=\"true\"\u003e\u003cpath d=\"m7.775 3.275 1.25-1.25a3.5 3.5 0 1 1 4.95 4.95l-2.5 2.5a3.5 3.5 0 0 1-4.95 0 .751.751 0 0 1 .018-1.042.751.751 0 0 1 1.042-.018 1.998 1.998 0 0 0 2.83 0l2.5-2.5a2.002 2.002 0 0 0-2.83-2.83l-1.25 1.25a.751.751 0 0 1-1.042-.018.751.751 0 0 1-.018-1.042Zm-4.69 9.64a1.998 1.998 0 0 0 2.83 0l1.25-1.25a.751.751 0 0 1 1.042.018.751.751 0 0 1 .018 1.042l-1.25 1.25a3.5 3.5 0 1 1-4.95-4.95l2.5-2.5a3.5 3.5 0 0 1 4.95 0 .751.751 0 0 1-.018 1.042.751.751 0 0 1-1.042.018 1.998 1.998 0 0 0-2.83 0l-2.5 2.5a1.998 1.998 0 0 0 0 2.83Z\"\u003e\u003c/path\u003e\u003c/svg\u003e\u003c/a\u003e\u003c/div\u003e\n\u003cp dir=\"auto\"\u003eAlthough it is possible to explicitly create devices of a particular\ntype (with, e.g., \u003ccode\u003eOIDN_DEVICE_TYPE_SYCL\u003c/code\u003e), this is often insufficient,\nespecially if the system has multiple devices of the same type, and with\nGPU support it is very common that there are multiple different types of\nsupported devices in the system (e.g. a CPU and one or more GPUs).\u003c/p\u003e\n\u003cp dir=\"auto\"\u003eOpen Image Denoise 2 introduces a simple \u003cem\u003ephysical device\u003c/em\u003e API, which\nenables the application to query the list of supported physical devices\nin the system, including their name, type, UUID, LUID, PCI address, etc.\n(see \u003ccode\u003eoidnGetNumPhysicalDevices\u003c/code\u003e, \u003ccode\u003eoidnGetPhysicalDeviceString\u003c/code\u003e, etc.).\nNew logical device (i.e. \u003ccode\u003eOIDNDevice\u003c/code\u003e) creation functions for have been\nalso introduced, which enable creating a logical device on a specific\nphysical device: \u003ccode\u003eoidnNewDeviceByID\u003c/code\u003e, \u003ccode\u003eoidnNewDeviceByUUID\u003c/code\u003e, etc.\u003c/p\u003e\n\u003cp dir=\"auto\"\u003eCreating a logical device on a physical device having a particular UUID,\nLUID or PCI address is particularly important when importing external\nmemory from graphics APIs. However, not all device types support all\ntypes of IDs, and some graphics drivers may even report mismatching\nUUIDs or LUIDs for the same physical device, so applications should try\nto implement multiple identification methods, or at least assume that\nidentification might fail.\u003c/p\u003e\n\u003cdiv class=\"markdown-heading\" dir=\"auto\"\u003e\u003ch3 tabindex=\"-1\" class=\"heading-element\" dir=\"auto\"\u003eAsynchronous Execution\u003c/h3\u003e\u003ca id=\"user-content-asynchronous-execution\" class=\"anchor\" aria-label=\"Permalink: Asynchronous Execution\" href=\"#asynchronous-execution\"\u003e\u003csvg class=\"octicon octicon-link\" viewBox=\"0 0 16 16\" version=\"1.1\" width=\"16\" height=\"16\" aria-hidden=\"true\"\u003e\u003cpath d=\"m7.775 3.275 1.25-1.25a3.5 3.5 0 1 1 4.95 4.95l-2.5 2.5a3.5 3.5 0 0 1-4.95 0 .751.751 0 0 1 .018-1.042.751.751 0 0 1 1.042-.018 1.998 1.998 0 0 0 2.83 0l2.5-2.5a2.002 2.002 0 0 0-2.83-2.83l-1.25 1.25a.751.751 0 0 1-1.042-.018.751.751 0 0 1-.018-1.042Zm-4.69 9.64a1.998 1.998 0 0 0 2.83 0l1.25-1.25a.751.751 0 0 1 1.042.018.751.751 0 0 1 .018 1.042l-1.25 1.25a3.5 3.5 0 1 1-4.95-4.95l2.5-2.5a3.5 3.5 0 0 1 4.95 0 .751.751 0 0 1-.018 1.042.751.751 0 0 1-1.042.018 1.998 1.998 0 0 0-2.83 0l-2.5 2.5a1.998 1.998 0 0 0 0 2.83Z\"\u003e\u003c/path\u003e\u003c/svg\u003e\u003c/a\u003e\u003c/div\u003e\n\u003cp dir=\"auto\"\u003eIt is now possible to execute some operations asynchronously, most\nimportantly filtering (\u003ccode\u003eoidnExecuteFilterAsync\u003c/code\u003e,\n\u003ccode\u003eoidnExecuteSYCLFilterAsync\u003c/code\u003e) and copying data (the already mentioned\n\u003ccode\u003eoidnReadBufferAsync\u003c/code\u003e and \u003ccode\u003eoidnWriteBufferAsync\u003c/code\u003e).\u003c/p\u003e\n\u003cp dir=\"auto\"\u003eWhen using any asynchronous function it is the responsibility of the\napplication to handle correct synchronization using \u003ccode\u003eoidnSyncDevice\u003c/code\u003e.\u003c/p\u003e\n\u003cdiv class=\"markdown-heading\" dir=\"auto\"\u003e\u003ch3 tabindex=\"-1\" class=\"heading-element\" dir=\"auto\"\u003eFilter Quality\u003c/h3\u003e\u003ca id=\"user-content-filter-quality\" class=\"anchor\" aria-label=\"Permalink: Filter Quality\" href=\"#filter-quality\"\u003e\u003csvg class=\"octicon octicon-link\" viewBox=\"0 0 16 16\" version=\"1.1\" width=\"16\" height=\"16\" aria-hidden=\"true\"\u003e\u003cpath d=\"m7.775 3.275 1.25-1.25a3.5 3.5 0 1 1 4.95 4.95l-2.5 2.5a3.5 3.5 0 0 1-4.95 0 .751.751 0 0 1 .018-1.042.751.751 0 0 1 1.042-.018 1.998 1.998 0 0 0 2.83 0l2.5-2.5a2.002 2.002 0 0 0-2.83-2.83l-1.25 1.25a.751.751 0 0 1-1.042-.018.751.751 0 0 1-.018-1.042Zm-4.69 9.64a1.998 1.998 0 0 0 2.83 0l1.25-1.25a.751.751 0 0 1 1.042.018.751.751 0 0 1 .018 1.042l-1.25 1.25a3.5 3.5 0 1 1-4.95-4.95l2.5-2.5a3.5 3.5 0 0 1 4.95 0 .751.751 0 0 1-.018 1.042.751.751 0 0 1-1.042.018 1.998 1.998 0 0 0-2.83 0l-2.5 2.5a1.998 1.998 0 0 0 0 2.83Z\"\u003e\u003c/path\u003e\u003c/svg\u003e\u003c/a\u003e\u003c/div\u003e\n\u003cp dir=\"auto\"\u003eOpen Image Denoise still delivers the same high image quality on all\ndevice types as before, including on GPUs. But often filtering\nperformance is more important than having the highest possible image\nquality, so it is now possible to switch between multiple filter quality\nmodes. Filters have a new parameter called \u003ccode\u003equality\u003c/code\u003e, which defaults to\nthe existing \u003cem\u003ehigh\u003c/em\u003e image quality (\u003ccode\u003eOIDN_QUALITY_HIGH\u003c/code\u003e) but \u003cem\u003ebalanced\u003c/em\u003e\n(\u003ccode\u003eOIDN_QUALITY_BALANCED\u003c/code\u003e) and \u003cem\u003efast\u003c/em\u003e (\u003ccode\u003eOIDN_QUALITY_FAST\u003c/code\u003e) quality modes\nhave been added as well for even higher performance. We recommend using\n\u003cem\u003ebalanced\u003c/em\u003e or \u003cem\u003efast\u003c/em\u003e quality for interactive and real-time use cases.\u003c/p\u003e\n\u003cdiv class=\"markdown-heading\" dir=\"auto\"\u003e\u003ch3 tabindex=\"-1\" class=\"heading-element\" dir=\"auto\"\u003eSmall API Changes\u003c/h3\u003e\u003ca id=\"user-content-small-api-changes\" class=\"anchor\" aria-label=\"Permalink: Small API Changes\" href=\"#small-api-changes\"\u003e\u003csvg class=\"octicon octicon-link\" viewBox=\"0 0 16 16\" version=\"1.1\" width=\"16\" height=\"16\" aria-hidden=\"true\"\u003e\u003cpath d=\"m7.775 3.275 1.25-1.25a3.5 3.5 0 1 1 4.95 4.95l-2.5 2.5a3.5 3.5 0 0 1-4.95 0 .751.751 0 0 1 .018-1.042.751.751 0 0 1 1.042-.018 1.998 1.998 0 0 0 2.83 0l2.5-2.5a2.002 2.002 0 0 0-2.83-2.83l-1.25 1.25a.751.751 0 0 1-1.042-.018.751.751 0 0 1-.018-1.042Zm-4.69 9.64a1.998 1.998 0 0 0 2.83 0l1.25-1.25a.751.751 0 0 1 1.042.018.751.751 0 0 1 .018 1.042l-1.25 1.25a3.5 3.5 0 1 1-4.95-4.95l2.5-2.5a3.5 3.5 0 0 1 4.95 0 .751.751 0 0 1-.018 1.042.751.751 0 0 1-1.042.018 1.998 1.998 0 0 0-2.83 0l-2.5 2.5a1.998 1.998 0 0 0 0 2.83Z\"\u003e\u003c/path\u003e\u003c/svg\u003e\u003c/a\u003e\u003c/div\u003e\n\u003cp dir=\"auto\"\u003eA few existing API functions have been renamed to improve clarity (e.g.\n\u003ccode\u003eoidnSetFilter1i\u003c/code\u003e to \u003ccode\u003eoidnSetFilterInt\u003c/code\u003e) but the old function names are\nstill available as deprecated functions. When compiling legacy code,\nwarnings will be emitted for these deprecated functions. To upgrade to\nthe new API, please simply follow the instructions in the warnings.\u003c/p\u003e\n\u003cp dir=\"auto\"\u003eSome filter parameters have been also renamed (\u003ccode\u003ealignment\u003c/code\u003e to\n\u003ccode\u003etileAlignment\u003c/code\u003e, \u003ccode\u003eoverlap\u003c/code\u003e to \u003ccode\u003etileOverlap\u003c/code\u003e). When using the old names,\nwarnings will be emitted at runtime.\u003c/p\u003e\n\u003cdiv class=\"markdown-heading\" dir=\"auto\"\u003e\u003ch3 tabindex=\"-1\" class=\"heading-element\" dir=\"auto\"\u003eBuilding as a Static Library\u003c/h3\u003e\u003ca id=\"user-content-building-as-a-static-library\" class=\"anchor\" aria-label=\"Permalink: Building as a Static Library\" href=\"#building-as-a-static-library\"\u003e\u003csvg class=\"octicon octicon-link\" viewBox=\"0 0 16 16\" version=\"1.1\" width=\"16\" height=\"16\" aria-hidden=\"true\"\u003e\u003cpath d=\"m7.775 3.275 1.25-1.25a3.5 3.5 0 1 1 4.95 4.95l-2.5 2.5a3.5 3.5 0 0 1-4.95 0 .751.751 0 0 1 .018-1.042.751.751 0 0 1 1.042-.018 1.998 1.998 0 0 0 2.83 0l2.5-2.5a2.002 2.002 0 0 0-2.83-2.83l-1.25 1.25a.751.751 0 0 1-1.042-.018.751.751 0 0 1-.018-1.042Zm-4.69 9.64a1.998 1.998 0 0 0 2.83 0l1.25-1.25a.751.751 0 0 1 1.042.018.751.751 0 0 1 .018 1.042l-1.25 1.25a3.5 3.5 0 1 1-4.95-4.95l2.5-2.5a3.5 3.5 0 0 1 4.95 0 .751.751 0 0 1-.018 1.042.751.751 0 0 1-1.042.018 1.998 1.998 0 0 0-2.83 0l-2.5 2.5a1.998 1.998 0 0 0 0 2.83Z\"\u003e\u003c/path\u003e\u003c/svg\u003e\u003c/a\u003e\u003c/div\u003e\n\u003cp dir=\"auto\"\u003eThe support to build Open Image Denoise as a static library\n(\u003ccode\u003eOIDN_STATIC_LIB\u003c/code\u003e CMake option) has been limited to CPU-only builds due\nto switching to a modular library design that was necessary for adding\nmulti-vendor GPU support. If the library is built with GPU support as\nwell, the \u003ccode\u003eOIDN_STATIC_LIB\u003c/code\u003e option is still available but enabling it\nresults in a hybrid static/shared library.\u003c/p\u003e\n\u003cp dir=\"auto\"\u003eIf the main reason for building as a static library would be is the\nability to use multiple versions of Open Image Denoise in the same\nprocess, please use the existing \u003ccode\u003eOIDN_API_NAMESPACE\u003c/code\u003e CMake option\ninstead. With this feature all symbols of the library will be put into a\ncustom namespace, which can prevent symbol clashes.\u003c/p\u003e\n\u003cdiv class=\"markdown-heading\" dir=\"auto\"\u003e\u003ch2 tabindex=\"-1\" class=\"heading-element\" dir=\"auto\"\u003ePhysical Devices\u003c/h2\u003e\u003ca id=\"user-content-physical-devices-1\" class=\"anchor\" aria-label=\"Permalink: Physical Devices\" href=\"#physical-devices-1\"\u003e\u003csvg class=\"octicon octicon-link\" viewBox=\"0 0 16 16\" version=\"1.1\" width=\"16\" height=\"16\" aria-hidden=\"true\"\u003e\u003cpath d=\"m7.775 3.275 1.25-1.25a3.5 3.5 0 1 1 4.95 4.95l-2.5 2.5a3.5 3.5 0 0 1-4.95 0 .751.751 0 0 1 .018-1.042.751.751 0 0 1 1.042-.018 1.998 1.998 0 0 0 2.83 0l2.5-2.5a2.002 2.002 0 0 0-2.83-2.83l-1.25 1.25a.751.751 0 0 1-1.042-.018.751.751 0 0 1-.018-1.042Zm-4.69 9.64a1.998 1.998 0 0 0 2.83 0l1.25-1.25a.751.751 0 0 1 1.042.018.751.751 0 0 1 .018 1.042l-1.25 1.25a3.5 3.5 0 1 1-4.95-4.95l2.5-2.5a3.5 3.5 0 0 1 4.95 0 .751.751 0 0 1-.018 1.042.751.751 0 0 1-1.042.018 1.998 1.998 0 0 0-2.83 0l-2.5 2.5a1.998 1.998 0 0 0 0 2.83Z\"\u003e\u003c/path\u003e\u003c/svg\u003e\u003c/a\u003e\u003c/div\u003e\n\u003cp dir=\"auto\"\u003eSystems often have multiple different types of devices supported by Open\nImage Denoise (CPUs and GPUs). The application can get the list of\nsupported \u003cem\u003ephysical devices\u003c/em\u003e and select which of these to use for\ndenoising.\u003c/p\u003e\n\u003cp dir=\"auto\"\u003eThe number of supported physical devices can be queried with\u003c/p\u003e\n\u003cdiv class=\"highlight highlight-source-c++ notranslate position-relative overflow-auto\" dir=\"auto\" data-snippet-clipboard-copy-content=\"int oidnGetNumPhysicalDevices();\"\u003e\u003cpre\u003e\u003cspan class=\"pl-k\"\u003eint\u003c/span\u003e \u003cspan class=\"pl-en\"\u003eoidnGetNumPhysicalDevices\u003c/span\u003e();\u003c/pre\u003e\u003c/div\u003e\n\u003cp dir=\"auto\"\u003eThe physical devices can be identified using IDs between 0 and\n(\u003ccode\u003eoidnGetNumPhysicalDevices()\u003c/code\u003e (-) 1), and are ordered \u003cem\u003eapproximately\u003c/em\u003e\nfrom fastest to slowest (e.g., ID of 0 corresponds to the likely fastest\nphysical device). Note that the reported number and order of physical\ndevices may change between application runs, so no assumptions should be\nmade about this list.\u003c/p\u003e\n\u003cp dir=\"auto\"\u003eParameters of these physical devices can be queried using\u003c/p\u003e\n\u003cdiv class=\"highlight highlight-source-c++ notranslate position-relative overflow-auto\" dir=\"auto\" data-snippet-clipboard-copy-content=\"bool oidnGetPhysicalDeviceBool (int physicalDeviceID, const char* name);\nint oidnGetPhysicalDeviceInt (int physicalDeviceID, const char* name);\nunsigned int oidnGetPhysicalDeviceUInt (int physicalDeviceID, const char* name);\nconst char* oidnGetPhysicalDeviceString(int physicalDeviceID, const char* name);\nconst void* oidnGetPhysicalDeviceData (int physicalDeviceID, const char* name,\n size_t* byteSize);\"\u003e\u003cpre\u003e\u003cspan class=\"pl-k\"\u003ebool\u003c/span\u003e \u003cspan class=\"pl-en\"\u003eoidnGetPhysicalDeviceBool\u003c/span\u003e (\u003cspan class=\"pl-k\"\u003eint\u003c/span\u003e physicalDeviceID, \u003cspan class=\"pl-k\"\u003econst\u003c/span\u003e \u003cspan class=\"pl-k\"\u003echar\u003c/span\u003e* name);\n\u003cspan class=\"pl-k\"\u003eint\u003c/span\u003e \u003cspan class=\"pl-en\"\u003eoidnGetPhysicalDeviceInt\u003c/span\u003e (\u003cspan class=\"pl-k\"\u003eint\u003c/span\u003e physicalDeviceID, \u003cspan class=\"pl-k\"\u003econst\u003c/span\u003e \u003cspan class=\"pl-k\"\u003echar\u003c/span\u003e* name);\n\u003cspan class=\"pl-k\"\u003eunsigned\u003c/span\u003e \u003cspan class=\"pl-k\"\u003eint\u003c/span\u003e \u003cspan class=\"pl-en\"\u003eoidnGetPhysicalDeviceUInt\u003c/span\u003e (\u003cspan class=\"pl-k\"\u003eint\u003c/span\u003e physicalDeviceID, \u003cspan class=\"pl-k\"\u003econst\u003c/span\u003e \u003cspan class=\"pl-k\"\u003echar\u003c/span\u003e* name);\n\u003cspan class=\"pl-k\"\u003econst\u003c/span\u003e \u003cspan class=\"pl-k\"\u003echar\u003c/span\u003e* \u003cspan class=\"pl-en\"\u003eoidnGetPhysicalDeviceString\u003c/span\u003e(\u003cspan class=\"pl-k\"\u003eint\u003c/span\u003e physicalDeviceID, \u003cspan class=\"pl-k\"\u003econst\u003c/span\u003e \u003cspan class=\"pl-k\"\u003echar\u003c/span\u003e* name);\n\u003cspan class=\"pl-k\"\u003econst\u003c/span\u003e \u003cspan class=\"pl-k\"\u003evoid\u003c/span\u003e* \u003cspan class=\"pl-en\"\u003eoidnGetPhysicalDeviceData\u003c/span\u003e (\u003cspan class=\"pl-k\"\u003eint\u003c/span\u003e physicalDeviceID, \u003cspan class=\"pl-k\"\u003econst\u003c/span\u003e \u003cspan class=\"pl-k\"\u003echar\u003c/span\u003e* name,\n \u003cspan class=\"pl-c1\"\u003esize_t\u003c/span\u003e* byteSize);\u003c/pre\u003e\u003c/div\u003e\n\u003cp dir=\"auto\"\u003ewhere \u003ccode\u003ename\u003c/code\u003e is the name of the parameter, and \u003ccode\u003ebyteSize\u003c/code\u003e is the number\nof returned bytes for data parameters. The following parameters can be\nqueried:\u003c/p\u003e\n\u003cmarkdown-accessiblity-table\u003e\u003ctable\u003e\n\u003cthead\u003e\n\u003ctr\u003e\n\u003cth align=\"left\"\u003eType\u003c/th\u003e\n\u003cth align=\"left\"\u003eName\u003c/th\u003e\n\u003cth align=\"left\"\u003eDescription\u003c/th\u003e\n\u003c/tr\u003e\n\u003c/thead\u003e\n\u003ctbody\u003e\n\u003ctr\u003e\n\u003ctd align=\"left\"\u003e\u003ccode\u003eInt\u003c/code\u003e\u003c/td\u003e\n\u003ctd align=\"left\"\u003e\u003ccode\u003etype\u003c/code\u003e\u003c/td\u003e\n\u003ctd align=\"left\"\u003edevice type as an \u003ccode\u003eOIDNDeviceType\u003c/code\u003e value\u003c/td\u003e\n\u003c/tr\u003e\n\u003ctr\u003e\n\u003ctd align=\"left\"\u003e\u003ccode\u003eString\u003c/code\u003e\u003c/td\u003e\n\u003ctd align=\"left\"\u003e\u003ccode\u003ename\u003c/code\u003e\u003c/td\u003e\n\u003ctd align=\"left\"\u003ename string\u003c/td\u003e\n\u003c/tr\u003e\n\u003ctr\u003e\n\u003ctd align=\"left\"\u003e\u003ccode\u003eBool\u003c/code\u003e\u003c/td\u003e\n\u003ctd align=\"left\"\u003e\u003ccode\u003euuidSupported\u003c/code\u003e\u003c/td\u003e\n\u003ctd align=\"left\"\u003edevice supports universally unique identifier (UUID)\u003c/td\u003e\n\u003c/tr\u003e\n\u003ctr\u003e\n\u003ctd align=\"left\"\u003e\u003ccode\u003eData\u003c/code\u003e\u003c/td\u003e\n\u003ctd align=\"left\"\u003e\u003ccode\u003euuid\u003c/code\u003e\u003c/td\u003e\n\u003ctd align=\"left\"\u003eopaque UUID (\u003ccode\u003eOIDN_UUID_SIZE\u003c/code\u003e bytes, exists only if \u003ccode\u003euuidSupported\u003c/code\u003e is \u003ccode\u003etrue\u003c/code\u003e)\u003c/td\u003e\n\u003c/tr\u003e\n\u003ctr\u003e\n\u003ctd align=\"left\"\u003e\u003ccode\u003eBool\u003c/code\u003e\u003c/td\u003e\n\u003ctd align=\"left\"\u003e\u003ccode\u003eluidSupported\u003c/code\u003e\u003c/td\u003e\n\u003ctd align=\"left\"\u003edevice supports locally unique identifier (UUID)\u003c/td\u003e\n\u003c/tr\u003e\n\u003ctr\u003e\n\u003ctd align=\"left\"\u003e\u003ccode\u003eData\u003c/code\u003e\u003c/td\u003e\n\u003ctd align=\"left\"\u003e\u003ccode\u003eluid\u003c/code\u003e\u003c/td\u003e\n\u003ctd align=\"left\"\u003eopaque LUID (\u003ccode\u003eOIDN_LUID_SIZE\u003c/code\u003e bytes, exists only if \u003ccode\u003eluidSupported\u003c/code\u003e is \u003ccode\u003etrue\u003c/code\u003e)\u003c/td\u003e\n\u003c/tr\u003e\n\u003ctr\u003e\n\u003ctd align=\"left\"\u003e\u003ccode\u003eUInt\u003c/code\u003e\u003c/td\u003e\n\u003ctd align=\"left\"\u003e\u003ccode\u003enodeMask\u003c/code\u003e\u003c/td\u003e\n\u003ctd align=\"left\"\u003ebitfield identifying the node within a linked device adapter corresponding to the device (exists only if \u003ccode\u003eluidSupported\u003c/code\u003e is \u003ccode\u003etrue\u003c/code\u003e)\u003c/td\u003e\n\u003c/tr\u003e\n\u003ctr\u003e\n\u003ctd align=\"left\"\u003e\u003ccode\u003eBool\u003c/code\u003e\u003c/td\u003e\n\u003ctd align=\"left\"\u003e\u003ccode\u003epciAddressSupported\u003c/code\u003e\u003c/td\u003e\n\u003ctd align=\"left\"\u003edevice supports PCI address\u003c/td\u003e\n\u003c/tr\u003e\n\u003ctr\u003e\n\u003ctd align=\"left\"\u003e\u003ccode\u003eInt\u003c/code\u003e\u003c/td\u003e\n\u003ctd align=\"left\"\u003e\u003ccode\u003epciDomain\u003c/code\u003e\u003c/td\u003e\n\u003ctd align=\"left\"\u003ePCI domain (exists only if \u003ccode\u003epciAddressSupported\u003c/code\u003e is \u003ccode\u003etrue\u003c/code\u003e)\u003c/td\u003e\n\u003c/tr\u003e\n\u003ctr\u003e\n\u003ctd align=\"left\"\u003e\u003ccode\u003eInt\u003c/code\u003e\u003c/td\u003e\n\u003ctd align=\"left\"\u003e\u003ccode\u003epciBus\u003c/code\u003e\u003c/td\u003e\n\u003ctd align=\"left\"\u003ePCI bus (exists only if \u003ccode\u003epciAddressSupported\u003c/code\u003e is \u003ccode\u003etrue\u003c/code\u003e)\u003c/td\u003e\n\u003c/tr\u003e\n\u003ctr\u003e\n\u003ctd align=\"left\"\u003e\u003ccode\u003eInt\u003c/code\u003e\u003c/td\u003e\n\u003ctd align=\"left\"\u003e\u003ccode\u003epciDevice\u003c/code\u003e\u003c/td\u003e\n\u003ctd align=\"left\"\u003ePCI device (exists only if \u003ccode\u003epciAddressSupported\u003c/code\u003e is \u003ccode\u003etrue\u003c/code\u003e)\u003c/td\u003e\n\u003c/tr\u003e\n\u003ctr\u003e\n\u003ctd align=\"left\"\u003e\u003ccode\u003eInt\u003c/code\u003e\u003c/td\u003e\n\u003ctd align=\"left\"\u003e\u003ccode\u003epciFunction\u003c/code\u003e\u003c/td\u003e\n\u003ctd align=\"left\"\u003ePCI function (exists only if \u003ccode\u003epciAddressSupported\u003c/code\u003e is \u003ccode\u003etrue\u003c/code\u003e)\u003c/td\u003e\n\u003c/tr\u003e\n\u003c/tbody\u003e\n\u003c/table\u003e\u003c/markdown-accessiblity-table\u003e\n\u003cp dir=\"auto\"\u003eConstant parameters supported by physical devices.\u003c/p\u003e\n\u003cp dir=\"auto\"\u003eIt is also possible to directly query whether a physical device of a\nparticular type is supported, without iterating over all supported\nphysical devices:\u003c/p\u003e\n\u003cdiv class=\"highlight highlight-source-c++ notranslate position-relative overflow-auto\" dir=\"auto\" data-snippet-clipboard-copy-content=\"bool oidnIsCPUDeviceSupported();\nbool oidnIsSYCLDeviceSupported(const sycl::device* device);\nbool oidnIsCUDADeviceSupported(int deviceID);\nbool oidnIsHIPDeviceSupported(int deviceID);\nbool oidnIsMetalDeviceSupported(MTLDevice_id device);\"\u003e\u003cpre\u003e\u003cspan class=\"pl-k\"\u003ebool\u003c/span\u003e \u003cspan class=\"pl-en\"\u003eoidnIsCPUDeviceSupported\u003c/span\u003e();\n\u003cspan class=\"pl-k\"\u003ebool\u003c/span\u003e \u003cspan class=\"pl-en\"\u003eoidnIsSYCLDeviceSupported\u003c/span\u003e(\u003cspan class=\"pl-k\"\u003econst\u003c/span\u003e sycl::device* device);\n\u003cspan class=\"pl-k\"\u003ebool\u003c/span\u003e \u003cspan class=\"pl-en\"\u003eoidnIsCUDADeviceSupported\u003c/span\u003e(\u003cspan class=\"pl-k\"\u003eint\u003c/span\u003e deviceID);\n\u003cspan class=\"pl-k\"\u003ebool\u003c/span\u003e \u003cspan class=\"pl-en\"\u003eoidnIsHIPDeviceSupported\u003c/span\u003e(\u003cspan class=\"pl-k\"\u003eint\u003c/span\u003e deviceID);\n\u003cspan class=\"pl-k\"\u003ebool\u003c/span\u003e \u003cspan class=\"pl-en\"\u003eoidnIsMetalDeviceSupported\u003c/span\u003e(MTLDevice_id device);\u003c/pre\u003e\u003c/div\u003e\n\u003cdiv class=\"markdown-heading\" dir=\"auto\"\u003e\u003ch2 tabindex=\"-1\" class=\"heading-element\" dir=\"auto\"\u003eDevices\u003c/h2\u003e\u003ca id=\"user-content-devices\" class=\"anchor\" aria-label=\"Permalink: Devices\" href=\"#devices\"\u003e\u003csvg class=\"octicon octicon-link\" viewBox=\"0 0 16 16\" version=\"1.1\" width=\"16\" height=\"16\" aria-hidden=\"true\"\u003e\u003cpath d=\"m7.775 3.275 1.25-1.25a3.5 3.5 0 1 1 4.95 4.95l-2.5 2.5a3.5 3.5 0 0 1-4.95 0 .751.751 0 0 1 .018-1.042.751.751 0 0 1 1.042-.018 1.998 1.998 0 0 0 2.83 0l2.5-2.5a2.002 2.002 0 0 0-2.83-2.83l-1.25 1.25a.751.751 0 0 1-1.042-.018.751.751 0 0 1-.018-1.042Zm-4.69 9.64a1.998 1.998 0 0 0 2.83 0l1.25-1.25a.751.751 0 0 1 1.042.018.751.751 0 0 1 .018 1.042l-1.25 1.25a3.5 3.5 0 1 1-4.95-4.95l2.5-2.5a3.5 3.5 0 0 1 4.95 0 .751.751 0 0 1-.018 1.042.751.751 0 0 1-1.042.018 1.998 1.998 0 0 0-2.83 0l-2.5 2.5a1.998 1.998 0 0 0 0 2.83Z\"\u003e\u003c/path\u003e\u003c/svg\u003e\u003c/a\u003e\u003c/div\u003e\n\u003cp dir=\"auto\"\u003eOpen Image Denoise has a \u003cem\u003elogical\u003c/em\u003e device concept as well, or simply\nreferred to as \u003cem\u003edevice\u003c/em\u003e, which allows different components of the\napplication to use the Open Image Denoise API without interfering with\neach other. Each physical device may be associated with one ore more\nlogical devices. A basic way to create a device is by calling\u003c/p\u003e\n\u003cdiv class=\"highlight highlight-source-c++ notranslate position-relative overflow-auto\" dir=\"auto\" data-snippet-clipboard-copy-content=\"OIDNDevice oidnNewDevice(OIDNDeviceType type);\"\u003e\u003cpre\u003eOIDNDevice \u003cspan class=\"pl-en\"\u003eoidnNewDevice\u003c/span\u003e(OIDNDeviceType type);\u003c/pre\u003e\u003c/div\u003e\n\u003cp dir=\"auto\"\u003ewhere the \u003ccode\u003etype\u003c/code\u003e enumeration maps to a specific device implementation,\nwhich can be one of the following:\u003c/p\u003e\n\u003cmarkdown-accessiblity-table\u003e\u003ctable\u003e\n\u003cthead\u003e\n\u003ctr\u003e\n\u003cth align=\"left\"\u003eName\u003c/th\u003e\n\u003cth align=\"left\"\u003eDescription\u003c/th\u003e\n\u003c/tr\u003e\n\u003c/thead\u003e\n\u003ctbody\u003e\n\u003ctr\u003e\n\u003ctd align=\"left\"\u003e\u003ccode\u003eOIDN_DEVICE_TYPE_DEFAULT\u003c/code\u003e\u003c/td\u003e\n\u003ctd align=\"left\"\u003eselect the likely fastest device (same as physical device with ID 0)\u003c/td\u003e\n\u003c/tr\u003e\n\u003ctr\u003e\n\u003ctd align=\"left\"\u003e\u003ccode\u003eOIDN_DEVICE_TYPE_CPU\u003c/code\u003e\u003c/td\u003e\n\u003ctd align=\"left\"\u003eCPU device\u003c/td\u003e\n\u003c/tr\u003e\n\u003ctr\u003e\n\u003ctd align=\"left\"\u003e\u003ccode\u003eOIDN_DEVICE_TYPE_SYCL\u003c/code\u003e\u003c/td\u003e\n\u003ctd align=\"left\"\u003eSYCL device (requires a supported Intel GPU)\u003c/td\u003e\n\u003c/tr\u003e\n\u003ctr\u003e\n\u003ctd align=\"left\"\u003e\u003ccode\u003eOIDN_DEVICE_TYPE_CUDA\u003c/code\u003e\u003c/td\u003e\n\u003ctd align=\"left\"\u003eCUDA device (requires a supported NVIDIA GPU)\u003c/td\u003e\n\u003c/tr\u003e\n\u003ctr\u003e\n\u003ctd align=\"left\"\u003e\u003ccode\u003eOIDN_DEVICE_TYPE_HIP\u003c/code\u003e\u003c/td\u003e\n\u003ctd align=\"left\"\u003eHIP device (requires a supported AMD GPU)\u003c/td\u003e\n\u003c/tr\u003e\n\u003ctr\u003e\n\u003ctd align=\"left\"\u003e\u003ccode\u003eOIDN_DEVICE_TYPE_METAL\u003c/code\u003e\u003c/td\u003e\n\u003ctd align=\"left\"\u003eMetal device (requires a supported Apple GPU)\u003c/td\u003e\n\u003c/tr\u003e\n\u003c/tbody\u003e\n\u003c/table\u003e\u003c/markdown-accessiblity-table\u003e\n\u003cp dir=\"auto\"\u003eSupported device types, i.e., valid constants of type \u003ccode\u003eOIDNDeviceType\u003c/code\u003e.\u003c/p\u003e\n\u003cp dir=\"auto\"\u003eIf there are multiple supported devices of the specified type, an\nimplementation-dependent default will be selected.\u003c/p\u003e\n\u003cp dir=\"auto\"\u003eA device can be created by specifying a physical device ID as well using\u003c/p\u003e\n\u003cdiv class=\"highlight highlight-source-c++ notranslate position-relative overflow-auto\" dir=\"auto\" data-snippet-clipboard-copy-content=\"OIDNDevice oidnNewDeviceByID(int physicalDeviceID);\"\u003e\u003cpre\u003eOIDNDevice \u003cspan class=\"pl-en\"\u003eoidnNewDeviceByID\u003c/span\u003e(\u003cspan class=\"pl-k\"\u003eint\u003c/span\u003e physicalDeviceID);\u003c/pre\u003e\u003c/div\u003e\n\u003cp dir=\"auto\"\u003eApplications can manually iterate over the list of physical devices and\nselect from them based on their properties but there are also some\nbuilt-in helper functions as well, which make creating a device by a\nparticular physical device property easier:\u003c/p\u003e\n\u003cdiv class=\"highlight highlight-source-c++ notranslate position-relative overflow-auto\" dir=\"auto\" data-snippet-clipboard-copy-content=\"OIDNDevice oidnNewDeviceByUUID(const void* uuid);\nOIDNDevice oidnNewDeviceByLUID(const void* luid);\nOIDNDevice oidnNewDeviceByPCIAddress(int pciDomain, int pciBus, int pciDevice,\n int pciFunction);\"\u003e\u003cpre\u003eOIDNDevice \u003cspan class=\"pl-en\"\u003eoidnNewDeviceByUUID\u003c/span\u003e(\u003cspan class=\"pl-k\"\u003econst\u003c/span\u003e \u003cspan class=\"pl-k\"\u003evoid\u003c/span\u003e* uuid);\nOIDNDevice \u003cspan class=\"pl-en\"\u003eoidnNewDeviceByLUID\u003c/span\u003e(\u003cspan class=\"pl-k\"\u003econst\u003c/span\u003e \u003cspan class=\"pl-k\"\u003evoid\u003c/span\u003e* luid);\nOIDNDevice \u003cspan class=\"pl-en\"\u003eoidnNewDeviceByPCIAddress\u003c/span\u003e(\u003cspan class=\"pl-k\"\u003eint\u003c/span\u003e pciDomain, \u003cspan class=\"pl-k\"\u003eint\u003c/span\u003e pciBus, \u003cspan class=\"pl-k\"\u003eint\u003c/span\u003e pciDevice,\n \u003cspan class=\"pl-k\"\u003eint\u003c/span\u003e pciFunction);\u003c/pre\u003e\u003c/div\u003e\n\u003cp dir=\"auto\"\u003eThese functions are particularly useful when the application needs\ninteroperability with a graphics API (e.g. DX12, Vulkan). However, not\nall of these properties may be supported by the intended physical device\n(or drivers might even report inconsistent identifiers), so it is\nrecommended to select by more than one property, if possible.\u003c/p\u003e\n\u003cp dir=\"auto\"\u003eIf the application requires interoperability with a particular compute\nor graphics API (SYCL, CUDA, HIP, Metal), it is recommended to use one\nof the following dedicated functions instead:\u003c/p\u003e\n\u003cdiv class=\"highlight highlight-source-c++ notranslate position-relative overflow-auto\" dir=\"auto\" data-snippet-clipboard-copy-content=\"OIDNDevice oidnNewSYCLDevice(const sycl::queue* queues, int numQueues);\nOIDNDevice oidnNewCUDADevice(const int* deviceIDs, const cudaStream_t* streams,\n int numPairs);\nOIDNDevice oidnNewHIPDevice(const int* deviceIDs, const hipStream_t* streams,\n int numPairs);\nOIDNDevice oidnNewMetalDevice(const MTLCommandQueue_id* commandQueues,\n int numQueues);\"\u003e\u003cpre\u003eOIDNDevice \u003cspan class=\"pl-en\"\u003eoidnNewSYCLDevice\u003c/span\u003e(\u003cspan class=\"pl-k\"\u003econst\u003c/span\u003e sycl::queue* queues, \u003cspan class=\"pl-k\"\u003eint\u003c/span\u003e numQueues);\nOIDNDevice \u003cspan class=\"pl-en\"\u003eoidnNewCUDADevice\u003c/span\u003e(\u003cspan class=\"pl-k\"\u003econst\u003c/span\u003e \u003cspan class=\"pl-k\"\u003eint\u003c/span\u003e* deviceIDs, \u003cspan class=\"pl-k\"\u003econst\u003c/span\u003e cudaStream_t* streams,\n \u003cspan class=\"pl-k\"\u003eint\u003c/span\u003e numPairs);\nOIDNDevice \u003cspan class=\"pl-en\"\u003eoidnNewHIPDevice\u003c/span\u003e(\u003cspan class=\"pl-k\"\u003econst\u003c/span\u003e \u003cspan class=\"pl-k\"\u003eint\u003c/span\u003e* deviceIDs, \u003cspan class=\"pl-k\"\u003econst\u003c/span\u003e hipStream_t* streams,\n \u003cspan class=\"pl-k\"\u003eint\u003c/span\u003e numPairs);\nOIDNDevice \u003cspan class=\"pl-en\"\u003eoidnNewMetalDevice\u003c/span\u003e(\u003cspan class=\"pl-k\"\u003econst\u003c/span\u003e MTLCommandQueue_id* commandQueues,\n \u003cspan class=\"pl-k\"\u003eint\u003c/span\u003e numQueues);\u003c/pre\u003e\u003c/div\u003e\n\u003cp dir=\"auto\"\u003eFor SYCL, it is possible to pass one or more SYCL queues which will be\nused by Open Image Denoise for all device operations. This is useful\nwhen the application wants to use the same queues for both denoising and\nits own operations (e.g. rendering). Passing multiple queues is not\nintended to be used for different physical devices but just for a single\nSYCL root-device which consists of multiple sub-devices (e.g. Intel®\nData Center GPU Max Series having multiple Xe-Stacks/tiles). The only\nsupported SYCL backend is oneAPI Level Zero.\u003c/p\u003e\n\u003cp dir=\"auto\"\u003eFor CUDA and HIP, pairs of CUDA/HIP device IDs and corresponding streams\ncan be specified but the current implementation supports only one pair.\nA \u003ccode\u003eNULL\u003c/code\u003e stream corresponds to the default stream on the corresponding\ndevice. Open Image Denoise automatically sets and restores the current\nCUDA/HIP device/context on the calling thread when necessary, thus the\ncurrent device does not have to be changed manually by the application.\u003c/p\u003e\n\u003cp dir=\"auto\"\u003eFor Metal, a single command queue is supported.\u003c/p\u003e\n\u003cp dir=\"auto\"\u003eOnce a device is created, you can call\u003c/p\u003e\n\u003cdiv class=\"highlight highlight-source-c++ notranslate position-relative overflow-auto\" dir=\"auto\" data-snippet-clipboard-copy-content=\"bool oidnGetDeviceBool(OIDNDevice device, const char* name);\nvoid oidnSetDeviceBool(OIDNDevice device, const char* name, bool value);\nint oidnGetDeviceInt (OIDNDevice device, const char* name);\nvoid oidnSetDeviceInt (OIDNDevice device, const char* name, int value);\nint oidnGetDeviceUInt(OIDNDevice device, const char* name);\nvoid oidnSetDeviceUInt(OIDNDevice device, const char* name, unsigned int value);\"\u003e\u003cpre\u003e\u003cspan class=\"pl-k\"\u003ebool\u003c/span\u003e \u003cspan class=\"pl-en\"\u003eoidnGetDeviceBool\u003c/span\u003e(OIDNDevice device, \u003cspan class=\"pl-k\"\u003econst\u003c/span\u003e \u003cspan class=\"pl-k\"\u003echar\u003c/span\u003e* name);\n\u003cspan class=\"pl-k\"\u003evoid\u003c/span\u003e \u003cspan class=\"pl-en\"\u003eoidnSetDeviceBool\u003c/span\u003e(OIDNDevice device, \u003cspan class=\"pl-k\"\u003econst\u003c/span\u003e \u003cspan class=\"pl-k\"\u003echar\u003c/span\u003e* name, \u003cspan class=\"pl-k\"\u003ebool\u003c/span\u003e value);\n\u003cspan class=\"pl-k\"\u003eint\u003c/span\u003e \u003cspan class=\"pl-en\"\u003eoidnGetDeviceInt\u003c/span\u003e (OIDNDevice device, \u003cspan class=\"pl-k\"\u003econst\u003c/span\u003e \u003cspan class=\"pl-k\"\u003echar\u003c/span\u003e* name);\n\u003cspan class=\"pl-k\"\u003evoid\u003c/span\u003e \u003cspan class=\"pl-en\"\u003eoidnSetDeviceInt\u003c/span\u003e (OIDNDevice device, \u003cspan class=\"pl-k\"\u003econst\u003c/span\u003e \u003cspan class=\"pl-k\"\u003echar\u003c/span\u003e* name, \u003cspan class=\"pl-k\"\u003eint\u003c/span\u003e value);\n\u003cspan class=\"pl-k\"\u003eint\u003c/span\u003e \u003cspan class=\"pl-en\"\u003eoidnGetDeviceUInt\u003c/span\u003e(OIDNDevice device, \u003cspan class=\"pl-k\"\u003econst\u003c/span\u003e \u003cspan class=\"pl-k\"\u003echar\u003c/span\u003e* name);\n\u003cspan class=\"pl-k\"\u003evoid\u003c/span\u003e \u003cspan class=\"pl-en\"\u003eoidnSetDeviceUInt\u003c/span\u003e(OIDNDevice device, \u003cspan class=\"pl-k\"\u003econst\u003c/span\u003e \u003cspan class=\"pl-k\"\u003echar\u003c/span\u003e* name, \u003cspan class=\"pl-k\"\u003eunsigned\u003c/span\u003e \u003cspan class=\"pl-k\"\u003eint\u003c/span\u003e value);\u003c/pre\u003e\u003c/div\u003e\n\u003cp dir=\"auto\"\u003eto set and get parameter values on the device. Note that some parameters\nare constants, thus trying to set them is an error. See the tables below\nfor the parameters supported by devices.\u003c/p\u003e\n\u003cmarkdown-accessiblity-table\u003e\u003ctable\u003e\n\u003cthead\u003e\n\u003ctr\u003e\n\u003cth align=\"left\"\u003eType\u003c/th\u003e\n\u003cth align=\"left\"\u003eName\u003c/th\u003e\n\u003cth align=\"right\"\u003eDefault\u003c/th\u003e\n\u003cth align=\"left\"\u003eDescription\u003c/th\u003e\n\u003c/tr\u003e\n\u003c/thead\u003e\n\u003ctbody\u003e\n\u003ctr\u003e\n\u003ctd align=\"left\"\u003e\u003ccode\u003eInt\u003c/code\u003e\u003c/td\u003e\n\u003ctd align=\"left\"\u003e\u003ccode\u003etype\u003c/code\u003e\u003c/td\u003e\n\u003ctd align=\"right\"\u003e\u003cem\u003econstant\u003c/em\u003e\u003c/td\u003e\n\u003ctd align=\"left\"\u003edevice type as an \u003ccode\u003eOIDNDeviceType\u003c/code\u003e value\u003c/td\u003e\n\u003c/tr\u003e\n\u003ctr\u003e\n\u003ctd align=\"left\"\u003e\u003ccode\u003eInt\u003c/code\u003e\u003c/td\u003e\n\u003ctd align=\"left\"\u003e\u003ccode\u003eversion\u003c/code\u003e\u003c/td\u003e\n\u003ctd align=\"right\"\u003e\u003cem\u003econstant\u003c/em\u003e\u003c/td\u003e\n\u003ctd align=\"left\"\u003ecombined version number (major.minor.patch) with two decimal digits per component\u003c/td\u003e\n\u003c/tr\u003e\n\u003ctr\u003e\n\u003ctd align=\"left\"\u003e\u003ccode\u003eInt\u003c/code\u003e\u003c/td\u003e\n\u003ctd align=\"left\"\u003e\u003ccode\u003eversionMajor\u003c/code\u003e\u003c/td\u003e\n\u003ctd align=\"right\"\u003e\u003cem\u003econstant\u003c/em\u003e\u003c/td\u003e\n\u003ctd align=\"left\"\u003emajor version number\u003c/td\u003e\n\u003c/tr\u003e\n\u003ctr\u003e\n\u003ctd align=\"left\"\u003e\u003ccode\u003eInt\u003c/code\u003e\u003c/td\u003e\n\u003ctd align=\"left\"\u003e\u003ccode\u003eversionMinor\u003c/code\u003e\u003c/td\u003e\n\u003ctd align=\"right\"\u003e\u003cem\u003econstant\u003c/em\u003e\u003c/td\u003e\n\u003ctd align=\"left\"\u003eminor version number\u003c/td\u003e\n\u003c/tr\u003e\n\u003ctr\u003e\n\u003ctd align=\"left\"\u003e\u003ccode\u003eInt\u003c/code\u003e\u003c/td\u003e\n\u003ctd align=\"left\"\u003e\u003ccode\u003eversionPatch\u003c/code\u003e\u003c/td\u003e\n\u003ctd align=\"right\"\u003e\u003cem\u003econstant\u003c/em\u003e\u003c/td\u003e\n\u003ctd align=\"left\"\u003epatch version number\u003c/td\u003e\n\u003c/tr\u003e\n\u003ctr\u003e\n\u003ctd align=\"left\"\u003e\u003ccode\u003eBool\u003c/code\u003e\u003c/td\u003e\n\u003ctd align=\"left\"\u003e\u003ccode\u003esystemMemorySupported\u003c/code\u003e\u003c/td\u003e\n\u003ctd align=\"right\"\u003e\u003cem\u003econstant\u003c/em\u003e\u003c/td\u003e\n\u003ctd align=\"left\"\u003edevice can directly access memory allocated with the system allocator (e.g. \u003ccode\u003emalloc\u003c/code\u003e)\u003c/td\u003e\n\u003c/tr\u003e\n\u003ctr\u003e\n\u003ctd align=\"left\"\u003e\u003ccode\u003eBool\u003c/code\u003e\u003c/td\u003e\n\u003ctd align=\"left\"\u003e\u003ccode\u003emanagedMemorySupported\u003c/code\u003e\u003c/td\u003e\n\u003ctd align=\"right\"\u003e\u003cem\u003econstant\u003c/em\u003e\u003c/td\u003e\n\u003ctd align=\"left\"\u003edevice supports buffers created with managed storage (\u003ccode\u003eOIDN_STORAGE_MANAGED\u003c/code\u003e)\u003c/td\u003e\n\u003c/tr\u003e\n\u003ctr\u003e\n\u003ctd align=\"left\"\u003e\u003ccode\u003eInt\u003c/code\u003e\u003c/td\u003e\n\u003ctd align=\"left\"\u003e\u003ccode\u003eexternalMemoryTypes\u003c/code\u003e\u003c/td\u003e\n\u003ctd align=\"right\"\u003e\u003cem\u003econstant\u003c/em\u003e\u003c/td\u003e\n\u003ctd align=\"left\"\u003ebitfield of \u003ccode\u003eOIDNExternalMemoryTypeFlag\u003c/code\u003e values representing the external memory types supported by the device\u003c/td\u003e\n\u003c/tr\u003e\n\u003ctr\u003e\n\u003ctd align=\"left\"\u003e\u003ccode\u003eInt\u003c/code\u003e\u003c/td\u003e\n\u003ctd align=\"left\"\u003e\u003ccode\u003everbose\u003c/code\u003e\u003c/td\u003e\n\u003ctd align=\"right\"\u003e0\u003c/td\u003e\n\u003ctd align=\"left\"\u003everbosity level of the console output between 0–4; when set to 0, no output is printed, when set to a higher level more output is printed\u003c/td\u003e\n\u003c/tr\u003e\n\u003c/tbody\u003e\n\u003c/table\u003e\u003c/markdown-accessiblity-table\u003e\n\u003cp dir=\"auto\"\u003eParameters supported by all devices.\u003c/p\u003e\n\u003cmarkdown-accessiblity-table\u003e\u003ctable\u003e\n\u003cthead\u003e\n\u003ctr\u003e\n\u003cth align=\"left\"\u003eType\u003c/th\u003e\n\u003cth align=\"left\"\u003eName\u003c/th\u003e\n\u003cth align=\"right\"\u003eDefault\u003c/th\u003e\n\u003cth align=\"left\"\u003eDescription\u003c/th\u003e\n\u003c/tr\u003e\n\u003c/thead\u003e\n\u003ctbody\u003e\n\u003ctr\u003e\n\u003ctd align=\"left\"\u003e\u003ccode\u003eInt\u003c/code\u003e\u003c/td\u003e\n\u003ctd align=\"left\"\u003e\u003ccode\u003enumThreads\u003c/code\u003e\u003c/td\u003e\n\u003ctd align=\"right\"\u003e0\u003c/td\u003e\n\u003ctd align=\"left\"\u003emaximum number of threads which the library should use; 0 will set it automatically to get the best performance\u003c/td\u003e\n\u003c/tr\u003e\n\u003ctr\u003e\n\u003ctd align=\"left\"\u003e\u003ccode\u003eBool\u003c/code\u003e\u003c/td\u003e\n\u003ctd align=\"left\"\u003e\u003ccode\u003esetAffinity\u003c/code\u003e\u003c/td\u003e\n\u003ctd align=\"right\"\u003e\u003ccode\u003etrue\u003c/code\u003e\u003c/td\u003e\n\u003ctd align=\"left\"\u003eenables thread affinitization (pinning software threads to hardware threads) if it is necessary for achieving optimal performance\u003c/td\u003e\n\u003c/tr\u003e\n\u003c/tbody\u003e\n\u003c/table\u003e\u003c/markdown-accessiblity-table\u003e\n\u003cp dir=\"auto\"\u003eAdditional parameters supported only by CPU devices.\u003c/p\u003e\n\u003cp dir=\"auto\"\u003eNote that the CPU device heavily relies on setting the thread affinities\nto achieve optimal performance, so it is highly recommended to leave\nthis option enabled. However, this may interfere with the application if\nthat also sets the thread affinities, potentially causing performance\ndegradation. In such cases, the recommended solution is to either\ndisable setting the affinities in the application or in Open Image\nDenoise, or to always set/reset the affinities before/after each\nparallel region in the application (e.g., if using TBB, with\n\u003ccode\u003etbb::task_arena\u003c/code\u003e and \u003ccode\u003etbb::task_scheduler_observer\u003c/code\u003e).\u003c/p\u003e\n\u003cp dir=\"auto\"\u003eOnce parameters are set on the created device, the device must be\ncommitted with\u003c/p\u003e\n\u003cdiv class=\"highlight highlight-source-c++ notranslate position-relative overflow-auto\" dir=\"auto\" data-snippet-clipboard-copy-content=\"void oidnCommitDevice(OIDNDevice device);\"\u003e\u003cpre\u003e\u003cspan class=\"pl-k\"\u003evoid\u003c/span\u003e \u003cspan class=\"pl-en\"\u003eoidnCommitDevice\u003c/span\u003e(OIDNDevice device);\u003c/pre\u003e\u003c/div\u003e\n\u003cp dir=\"auto\"\u003eThis device can then be used to construct further objects, such as\nbuffers and filters. Note that a device can be committed only once\nduring its lifetime.\u003c/p\u003e\n\u003cp dir=\"auto\"\u003eSome functions may execute asynchronously with respect to the host. The\nnames of these functions are suffixed with \u003ccode\u003eAsync\u003c/code\u003e. Asynchronous\noperations are executed \u003cem\u003ein order\u003c/em\u003e on the device but may not block on\nthe host. Eventually, it is necessary to wait for all asynchronous\noperations to complete, which can be done by calling\u003c/p\u003e\n\u003cdiv class=\"highlight highlight-source-c++ notranslate position-relative overflow-auto\" dir=\"auto\" data-snippet-clipboard-copy-content=\"void oidnSyncDevice(OIDNDevice device);\"\u003e\u003cpre\u003e\u003cspan class=\"pl-k\"\u003evoid\u003c/span\u003e \u003cspan class=\"pl-en\"\u003eoidnSyncDevice\u003c/span\u003e(OIDNDevice device);\u003c/pre\u003e\u003c/div\u003e\n\u003cp dir=\"auto\"\u003eIf any errors have occurred during asynchronous operations (e.g.,\ncancellation through a progress monitor callback), those will be\nreported only when synchronization is triggered explicitly with\n\u003ccode\u003eoidnSyncDevice\u003c/code\u003e or implicitly with some other API call (e.g.,\n\u003ccode\u003eoidnExecuteFilter\u003c/code\u003e, \u003ccode\u003eoidnCommitFilter\u003c/code\u003e).\u003c/p\u003e\n\u003cp dir=\"auto\"\u003eBefore the application exits, it should release all devices by invoking\u003c/p\u003e\n\u003cdiv class=\"highlight highlight-source-c++ notranslate position-relative overflow-auto\" dir=\"auto\" data-snippet-clipboard-copy-content=\"void oidnReleaseDevice(OIDNDevice device);\"\u003e\u003cpre\u003e\u003cspan class=\"pl-k\"\u003evoid\u003c/span\u003e \u003cspan class=\"pl-en\"\u003eoidnReleaseDevice\u003c/span\u003e(OIDNDevice device);\u003c/pre\u003e\u003c/div\u003e\n\u003cp dir=\"auto\"\u003eNote that Open Image Denoise uses reference counting for all object\ntypes, so this function decreases the reference count of the device, and\nif the count reaches 0 the device will automatically get deleted. It is\nalso possible to increase the reference count by calling\u003c/p\u003e\n\u003cdiv class=\"highlight highlight-source-c++ notranslate position-relative overflow-auto\" dir=\"auto\" data-snippet-clipboard-copy-content=\"void oidnRetainDevice(OIDNDevice device);\"\u003e\u003cpre\u003e\u003cspan class=\"pl-k\"\u003evoid\u003c/span\u003e \u003cspan class=\"pl-en\"\u003eoidnRetainDevice\u003c/span\u003e(OIDNDevice device);\u003c/pre\u003e\u003c/div\u003e\n\u003cp dir=\"auto\"\u003eAn application should typically create only a single device object per\nphysical device (one for \u003cem\u003eall\u003c/em\u003e CPUs or one per GPU) as creation can be\nvery expensive and additional device objects may incur a significant\nmemory overhead. If required differently, it should only use a small\nnumber of device objects at any given time.\u003c/p\u003e\n\u003cdiv class=\"markdown-heading\" dir=\"auto\"\u003e\u003ch3 tabindex=\"-1\" class=\"heading-element\" dir=\"auto\"\u003eError Handling\u003c/h3\u003e\u003ca id=\"user-content-error-handling\" class=\"anchor\" aria-label=\"Permalink: Error Handling\" href=\"#error-handling\"\u003e\u003csvg class=\"octicon octicon-link\" viewBox=\"0 0 16 16\" version=\"1.1\" width=\"16\" height=\"16\" aria-hidden=\"true\"\u003e\u003cpath d=\"m7.775 3.275 1.25-1.25a3.5 3.5 0 1 1 4.95 4.95l-2.5 2.5a3.5 3.5 0 0 1-4.95 0 .751.751 0 0 1 .018-1.042.751.751 0 0 1 1.042-.018 1.998 1.998 0 0 0 2.83 0l2.5-2.5a2.002 2.002 0 0 0-2.83-2.83l-1.25 1.25a.751.751 0 0 1-1.042-.018.751.751 0 0 1-.018-1.042Zm-4.69 9.64a1.998 1.998 0 0 0 2.83 0l1.25-1.25a.751.751 0 0 1 1.042.018.751.751 0 0 1 .018 1.042l-1.25 1.25a3.5 3.5 0 1 1-4.95-4.95l2.5-2.5a3.5 3.5 0 0 1 4.95 0 .751.751 0 0 1-.018 1.042.751.751 0 0 1-1.042.018 1.998 1.998 0 0 0-2.83 0l-2.5 2.5a1.998 1.998 0 0 0 0 2.83Z\"\u003e\u003c/path\u003e\u003c/svg\u003e\u003c/a\u003e\u003c/div\u003e\n\u003cp dir=\"auto\"\u003eEach user thread has its own error code per device. If an error occurs\nwhen calling an API function, this error code is set to the occurred\nerror if it stores no previous error. The currently stored error can be\nqueried by the application via\u003c/p\u003e\n\u003cdiv class=\"highlight highlight-source-c++ notranslate position-relative overflow-auto\" dir=\"auto\" data-snippet-clipboard-copy-content=\"OIDNError oidnGetDeviceError(OIDNDevice device, const char** outMessage);\"\u003e\u003cpre\u003eOIDNError \u003cspan class=\"pl-en\"\u003eoidnGetDeviceError\u003c/span\u003e(OIDNDevice device, \u003cspan class=\"pl-k\"\u003econst\u003c/span\u003e \u003cspan class=\"pl-k\"\u003echar\u003c/span\u003e** outMessage);\u003c/pre\u003e\u003c/div\u003e\n\u003cp dir=\"auto\"\u003ewhere \u003ccode\u003eoutMessage\u003c/code\u003e can be a pointer to a C string which will be set to a\nmore descriptive error message, or it can be \u003ccode\u003eNULL\u003c/code\u003e. This function also\nclears the error code, which assures that the returned error code is\nalways the first error occurred since the last invocation of\n\u003ccode\u003eoidnGetDeviceError\u003c/code\u003e on the current thread. Note that the optionally\nreturned error message string is valid only until the next invocation of\nthe function.\u003c/p\u003e\n\u003cp dir=\"auto\"\u003eAlternatively, the application can also register a callback function of\ntype\u003c/p\u003e\n\u003cdiv class=\"highlight highlight-source-c++ notranslate position-relative overflow-auto\" dir=\"auto\" data-snippet-clipboard-copy-content=\"typedef void (*OIDNErrorFunction)(void* userPtr, OIDNError code, const char* message);\"\u003e\u003cpre\u003e\u003cspan class=\"pl-k\"\u003etypedef\u003c/span\u003e \u003cspan class=\"pl-en\"\u003evoid\u003c/span\u003e (*OIDNErrorFunction)(\u003cspan class=\"pl-k\"\u003evoid\u003c/span\u003e* userPtr, OIDNError code, \u003cspan class=\"pl-k\"\u003econst\u003c/span\u003e \u003cspan class=\"pl-k\"\u003echar\u003c/span\u003e* message);\u003c/pre\u003e\u003c/div\u003e\n\u003cp dir=\"auto\"\u003evia\u003c/p\u003e\n\u003cdiv class=\"highlight highlight-source-c++ notranslate position-relative overflow-auto\" dir=\"auto\" data-snippet-clipboard-copy-content=\"void oidnSetDeviceErrorFunction(OIDNDevice device, OIDNErrorFunction func, void* userPtr);\"\u003e\u003cpre\u003e\u003cspan class=\"pl-k\"\u003evoid\u003c/span\u003e \u003cspan class=\"pl-en\"\u003eoidnSetDeviceErrorFunction\u003c/span\u003e(OIDNDevice device, OIDNErrorFunction func, \u003cspan class=\"pl-k\"\u003evoid\u003c/span\u003e* userPtr);\u003c/pre\u003e\u003c/div\u003e\n\u003cp dir=\"auto\"\u003eto get notified when errors occur. Only a single callback function can\nbe registered per device, and further invocations overwrite the\npreviously set callback function, which do \u003cem\u003enot\u003c/em\u003e require also calling\nthe \u003ccode\u003eoidnCommitDevice\u003c/code\u003e function. Passing \u003ccode\u003eNULL\u003c/code\u003e as function pointer\ndisables the registered callback function. When the registered callback\nfunction is invoked, it gets passed the user-defined payload (\u003ccode\u003euserPtr\u003c/code\u003e\nargument as specified at registration time), the error code (\u003ccode\u003ecode\u003c/code\u003e\nargument) of the occurred error, as well as a string (\u003ccode\u003emessage\u003c/code\u003e\nargument) that further describes the error. The error code is always set\neven if an error callback function is registered. It is recommended to\nalways set a error callback function, to detect all errors.\u003c/p\u003e\n\u003cp dir=\"auto\"\u003eWhen the device construction fails, \u003ccode\u003eoidnNewDevice\u003c/code\u003e returns \u003ccode\u003eNULL\u003c/code\u003e as\ndevice. To detect the error code of a such failed device construction,\npass \u003ccode\u003eNULL\u003c/code\u003e as device to the \u003ccode\u003eoidnGetDeviceError\u003c/code\u003e function. For all\nother invocations of \u003ccode\u003eoidnGetDeviceError\u003c/code\u003e, a proper device handle must\nbe specified.\u003c/p\u003e\n\u003cp dir=\"auto\"\u003eThe following errors are currently used by Open Image Denoise:\u003c/p\u003e\n\u003cmarkdown-accessiblity-table\u003e\u003ctable\u003e\n\u003cthead\u003e\n\u003ctr\u003e\n\u003cth align=\"left\"\u003eName\u003c/th\u003e\n\u003cth align=\"left\"\u003eDescription\u003c/th\u003e\n\u003c/tr\u003e\n\u003c/thead\u003e\n\u003ctbody\u003e\n\u003ctr\u003e\n\u003ctd align=\"left\"\u003e\u003ccode\u003eOIDN_ERROR_NONE\u003c/code\u003e\u003c/td\u003e\n\u003ctd align=\"left\"\u003eno error occurred\u003c/td\u003e\n\u003c/tr\u003e\n\u003ctr\u003e\n\u003ctd align=\"left\"\u003e\u003ccode\u003eOIDN_ERROR_UNKNOWN\u003c/code\u003e\u003c/td\u003e\n\u003ctd align=\"left\"\u003ean unknown error occurred\u003c/td\u003e\n\u003c/tr\u003e\n\u003ctr\u003e\n\u003ctd align=\"left\"\u003e\u003ccode\u003eOIDN_ERROR_INVALID_ARGUMENT\u003c/code\u003e\u003c/td\u003e\n\u003ctd align=\"left\"\u003ean invalid argument was specified\u003c/td\u003e\n\u003c/tr\u003e\n\u003ctr\u003e\n\u003ctd align=\"left\"\u003e\u003ccode\u003eOIDN_ERROR_INVALID_OPERATION\u003c/code\u003e\u003c/td\u003e\n\u003ctd align=\"left\"\u003ethe operation is not allowed\u003c/td\u003e\n\u003c/tr\u003e\n\u003ctr\u003e\n\u003ctd align=\"left\"\u003e\u003ccode\u003eOIDN_ERROR_OUT_OF_MEMORY\u003c/code\u003e\u003c/td\u003e\n\u003ctd align=\"left\"\u003enot enough memory to execute the operation\u003c/td\u003e\n\u003c/tr\u003e\n\u003ctr\u003e\n\u003ctd align=\"left\"\u003e\u003ccode\u003eOIDN_ERROR_UNSUPPORTED_HARDWARE\u003c/code\u003e\u003c/td\u003e\n\u003ctd align=\"left\"\u003ethe hardware (CPU/GPU) is not supported\u003c/td\u003e\n\u003c/tr\u003e\n\u003ctr\u003e\n\u003ctd align=\"left\"\u003e\u003ccode\u003eOIDN_ERROR_CANCELLED\u003c/code\u003e\u003c/td\u003e\n\u003ctd align=\"left\"\u003ethe operation was cancelled by the user\u003c/td\u003e\n\u003c/tr\u003e\n\u003c/tbody\u003e\n\u003c/table\u003e\u003c/markdown-accessiblity-table\u003e\n\u003cp dir=\"auto\"\u003ePossible error codes, i.e., valid constants of type \u003ccode\u003eOIDNError\u003c/code\u003e.\u003c/p\u003e\n\u003cdiv class=\"markdown-heading\" dir=\"auto\"\u003e\u003ch3 tabindex=\"-1\" class=\"heading-element\" dir=\"auto\"\u003eEnvironment Variables\u003c/h3\u003e\u003ca id=\"user-content-environment-variables\" class=\"anchor\" aria-label=\"Permalink: Environment Variables\" href=\"#environment-variables\"\u003e\u003csvg class=\"octicon octicon-link\" viewBox=\"0 0 16 16\" version=\"1.1\" width=\"16\" height=\"16\" aria-hidden=\"true\"\u003e\u003cpath d=\"m7.775 3.275 1.25-1.25a3.5 3.5 0 1 1 4.95 4.95l-2.5 2.5a3.5 3.5 0 0 1-4.95 0 .751.751 0 0 1 .018-1.042.751.751 0 0 1 1.042-.018 1.998 1.998 0 0 0 2.83 0l2.5-2.5a2.002 2.002 0 0 0-2.83-2.83l-1.25 1.25a.751.751 0 0 1-1.042-.018.751.751 0 0 1-.018-1.042Zm-4.69 9.64a1.998 1.998 0 0 0 2.83 0l1.25-1.25a.751.751 0 0 1 1.042.018.751.751 0 0 1 .018 1.042l-1.25 1.25a3.5 3.5 0 1 1-4.95-4.95l2.5-2.5a3.5 3.5 0 0 1 4.95 0 .751.751 0 0 1-.018 1.042.751.751 0 0 1-1.042.018 1.998 1.998 0 0 0-2.83 0l-2.5 2.5a1.998 1.998 0 0 0 0 2.83Z\"\u003e\u003c/path\u003e\u003c/svg\u003e\u003c/a\u003e\u003c/div\u003e\n\u003cp dir=\"auto\"\u003eOpen Image Denoise supports environment variables for overriding certain\nsettings at runtime, which can be useful for debugging and development:\u003c/p\u003e\n\u003cmarkdown-accessiblity-table\u003e\u003ctable\u003e\n\u003cthead\u003e\n\u003ctr\u003e\n\u003cth align=\"left\"\u003eName\u003c/th\u003e\n\u003cth align=\"left\"\u003eDescription\u003c/th\u003e\n\u003c/tr\u003e\n\u003c/thead\u003e\n\u003ctbody\u003e\n\u003ctr\u003e\n\u003ctd align=\"left\"\u003e\u003ccode\u003eOIDN_DEFAULT_DEVICE\u003c/code\u003e\u003c/td\u003e\n\u003ctd align=\"left\"\u003eoverrides what physical device to use with \u003ccode\u003eOIDN_DEVICE_TYPE_DEFAULT\u003c/code\u003e; can be \u003ccode\u003ecpu\u003c/code\u003e, \u003ccode\u003esycl\u003c/code\u003e, \u003ccode\u003ecuda\u003c/code\u003e, \u003ccode\u003ehip\u003c/code\u003e, or a physical device ID\u003c/td\u003e\n\u003c/tr\u003e\n\u003ctr\u003e\n\u003ctd align=\"left\"\u003e\u003ccode\u003eOIDN_DEVICE_CPU\u003c/code\u003e\u003c/td\u003e\n\u003ctd align=\"left\"\u003evalue of 0 disables CPU device support\u003c/td\u003e\n\u003c/tr\u003e\n\u003ctr\u003e\n\u003ctd align=\"left\"\u003e\u003ccode\u003eOIDN_DEVICE_SYCL\u003c/code\u003e\u003c/td\u003e\n\u003ctd align=\"left\"\u003evalue of 0 disables SYCL device support\u003c/td\u003e\n\u003c/tr\u003e\n\u003ctr\u003e\n\u003ctd align=\"left\"\u003e\u003ccode\u003eOIDN_DEVICE_CUDA\u003c/code\u003e\u003c/td\u003e\n\u003ctd align=\"left\"\u003evalue of 0 disables CUDA device support\u003c/td\u003e\n\u003c/tr\u003e\n\u003ctr\u003e\n\u003ctd align=\"left\"\u003e\u003ccode\u003eOIDN_DEVICE_HIP\u003c/code\u003e\u003c/td\u003e\n\u003ctd align=\"left\"\u003evalue of 0 disables HIP device support\u003c/td\u003e\n\u003c/tr\u003e\n\u003ctr\u003e\n\u003ctd align=\"left\"\u003e\u003ccode\u003eOIDN_DEVICE_METAL\u003c/code\u003e\u003c/td\u003e\n\u003ctd align=\"left\"\u003evalue of 0 disables Metal device support\u003c/td\u003e\n\u003c/tr\u003e\n\u003ctr\u003e\n\u003ctd align=\"left\"\u003e\u003ccode\u003eOIDN_NUM_THREADS\u003c/code\u003e\u003c/td\u003e\n\u003ctd align=\"left\"\u003eoverrides \u003ccode\u003enumThreads\u003c/code\u003e device parameter\u003c/td\u003e\n\u003c/tr\u003e\n\u003ctr\u003e\n\u003ctd align=\"left\"\u003e\u003ccode\u003eOIDN_SET_AFFINITY\u003c/code\u003e\u003c/td\u003e\n\u003ctd align=\"left\"\u003eoverrides \u003ccode\u003esetAffinity\u003c/code\u003e device parameter\u003c/td\u003e\n\u003c/tr\u003e\n\u003ctr\u003e\n\u003ctd align=\"left\"\u003e\u003ccode\u003eOIDN_NUM_SUBDEVICES\u003c/code\u003e\u003c/td\u003e\n\u003ctd align=\"left\"\u003eoverrides number of SYCL sub-devices to use (e.g. for Intel® Data Center GPU Max Series)\u003c/td\u003e\n\u003c/tr\u003e\n\u003ctr\u003e\n\u003ctd align=\"left\"\u003e\u003ccode\u003eOIDN_VERBOSE\u003c/code\u003e\u003c/td\u003e\n\u003ctd align=\"left\"\u003eoverrides \u003ccode\u003everbose\u003c/code\u003e device parameter\u003c/td\u003e\n\u003c/tr\u003e\n\u003c/tbody\u003e\n\u003c/table\u003e\u003c/markdown-accessiblity-table\u003e\n\u003cp dir=\"auto\"\u003eEnvironment variables supported by Open Image Denoise.\u003c/p\u003e\n\u003cdiv class=\"markdown-heading\" dir=\"auto\"\u003e\u003ch2 tabindex=\"-1\" class=\"heading-element\" dir=\"auto\"\u003eBuffers\u003c/h2\u003e\u003ca id=\"user-content-buffers-1\" class=\"anchor\" aria-label=\"Permalink: Buffers\" href=\"#buffers-1\"\u003e\u003csvg class=\"octicon octicon-link\" viewBox=\"0 0 16 16\" version=\"1.1\" width=\"16\" height=\"16\" aria-hidden=\"true\"\u003e\u003cpath d=\"m7.775 3.275 1.25-1.25a3.5 3.5 0 1 1 4.95 4.95l-2.5 2.5a3.5 3.5 0 0 1-4.95 0 .751.751 0 0 1 .018-1.042.751.751 0 0 1 1.042-.018 1.998 1.998 0 0 0 2.83 0l2.5-2.5a2.002 2.002 0 0 0-2.83-2.83l-1.25 1.25a.751.751 0 0 1-1.042-.018.751.751 0 0 1-.018-1.042Zm-4.69 9.64a1.998 1.998 0 0 0 2.83 0l1.25-1.25a.751.751 0 0 1 1.042.018.751.751 0 0 1 .018 1.042l-1.25 1.25a3.5 3.5 0 1 1-4.95-4.95l2.5-2.5a3.5 3.5 0 0 1 4.95 0 .751.751 0 0 1-.018 1.042.751.751 0 0 1-1.042.018 1.998 1.998 0 0 0-2.83 0l-2.5 2.5a1.998 1.998 0 0 0 0 2.83Z\"\u003e\u003c/path\u003e\u003c/svg\u003e\u003c/a\u003e\u003c/div\u003e\n\u003cp dir=\"auto\"\u003eImage data can be passed to Open Image Denoise either via pointers to\nmemory allocated and managed by the user or by creating buffer objects.\nRegardless of which method is used, the data must be allocated in a way\nthat it is accessible by the device (either CPU or GPU). Using buffers\nis typically the preferred approach because this ensures that the\nallocation requirements are fulfilled regardless of device type. To\ncreate a new data buffer with memory allocated and owned by the device,\nuse\u003c/p\u003e\n\u003cdiv class=\"highlight highlight-source-c++ notranslate position-relative overflow-auto\" dir=\"auto\" data-snippet-clipboard-copy-content=\"OIDNBuffer oidnNewBuffer(OIDNDevice device, size_t byteSize);\"\u003e\u003cpre\u003eOIDNBuffer \u003cspan class=\"pl-en\"\u003eoidnNewBuffer\u003c/span\u003e(OIDNDevice device, \u003cspan class=\"pl-c1\"\u003esize_t\u003c/span\u003e byteSize);\u003c/pre\u003e\u003c/div\u003e\n\u003cp dir=\"auto\"\u003eThe created buffer is bound to the specified device (\u003ccode\u003edevice\u003c/code\u003e argument).\nThe specified number of bytes (\u003ccode\u003ebyteSize\u003c/code\u003e) are allocated at buffer\nconstruction time and deallocated when the buffer is destroyed. The\nmemory is by default allocated as managed memory automatically migrated\nbetween host and device, if supported, or as pinned host memory\notherwise.\u003c/p\u003e\n\u003cp dir=\"auto\"\u003eIf this default buffer allocation is not suitable, a buffer can be\ncreated with a manually specified storage mode as well:\u003c/p\u003e\n\u003cdiv class=\"highlight highlight-source-c++ notranslate position-relative overflow-auto\" dir=\"auto\" data-snippet-clipboard-copy-content=\"OIDNBuffer oidnNewBufferWithStorage(OIDNDevice device, size_t byteSize, OIDNStorage storage);\"\u003e\u003cpre\u003eOIDNBuffer \u003cspan class=\"pl-en\"\u003eoidnNewBufferWithStorage\u003c/span\u003e(OIDNDevice device, \u003cspan class=\"pl-c1\"\u003esize_t\u003c/span\u003e byteSize, OIDNStorage storage);\u003c/pre\u003e\u003c/div\u003e\n\u003cp dir=\"auto\"\u003eThe supported storage modes are the following:\u003c/p\u003e\n\u003cmarkdown-accessiblity-table\u003e\u003ctable\u003e\n\u003cthead\u003e\n\u003ctr\u003e\n\u003cth align=\"left\"\u003eName\u003c/th\u003e\n\u003cth align=\"left\"\u003eDescription\u003c/th\u003e\n\u003c/tr\u003e\n\u003c/thead\u003e\n\u003ctbody\u003e\n\u003ctr\u003e\n\u003ctd align=\"left\"\u003e\u003ccode\u003eOIDN_STORAGE_UNDEFINED\u003c/code\u003e\u003c/td\u003e\n\u003ctd align=\"left\"\u003eundefined storage mode\u003c/td\u003e\n\u003c/tr\u003e\n\u003ctr\u003e\n\u003ctd align=\"left\"\u003e\u003ccode\u003eOIDN_STORAGE_HOST\u003c/code\u003e\u003c/td\u003e\n\u003ctd align=\"left\"\u003epinned host memory, accessible by both host and device\u003c/td\u003e\n\u003c/tr\u003e\n\u003ctr\u003e\n\u003ctd align=\"left\"\u003e\u003ccode\u003eOIDN_STORAGE_DEVICE\u003c/code\u003e\u003c/td\u003e\n\u003ctd align=\"left\"\u003edevice memory, \u003cem\u003enot\u003c/em\u003e accessible by the host\u003c/td\u003e\n\u003c/tr\u003e\n\u003ctr\u003e\n\u003ctd align=\"left\"\u003e\u003ccode\u003eOIDN_STORAGE_MANAGED\u003c/code\u003e\u003c/td\u003e\n\u003ctd align=\"left\"\u003eautomatically migrated between host and device, accessible by both (\u003cem\u003enot\u003c/em\u003e supported by all devices, \u003ccode\u003emanagedMemorySupported\u003c/code\u003e device parameter must be checked before use)\u003c/td\u003e\n\u003c/tr\u003e\n\u003c/tbody\u003e\n\u003c/table\u003e\u003c/markdown-accessiblity-table\u003e\n\u003cp dir=\"auto\"\u003eSupported storage modes for buffers, i.e., valid constants of type\n\u003ccode\u003eOIDNStorage\u003c/code\u003e.\u003c/p\u003e\n\u003cp dir=\"auto\"\u003eNote that the host and device storage modes are supported by all devices\nbut managed storage is an optional feature. Before using managed\nstorage, the \u003ccode\u003emanagedMemorySupported\u003c/code\u003e device parameter should be\nqueried.\u003c/p\u003e\n\u003cp dir=\"auto\"\u003eIt is also possible to create a “shared” data buffer with memory\nallocated and managed by the user with\u003c/p\u003e\n\u003cdiv class=\"highlight highlight-source-c++ notranslate position-relative overflow-auto\" dir=\"auto\" data-snippet-clipboard-copy-content=\"OIDNBuffer oidnNewSharedBuffer(OIDNDevice device, void* devPtr, size_t byteSize);\"\u003e\u003cpre\u003eOIDNBuffer \u003cspan class=\"pl-en\"\u003eoidnNewSharedBuffer\u003c/span\u003e(OIDNDevice device, \u003cspan class=\"pl-k\"\u003evoid\u003c/span\u003e* devPtr, \u003cspan class=\"pl-c1\"\u003esize_t\u003c/span\u003e byteSize);\u003c/pre\u003e\u003c/div\u003e\n\u003cp dir=\"auto\"\u003ewhere \u003ccode\u003edevPtr\u003c/code\u003e points to user-managed device-accessible memory and\n\u003ccode\u003ebyteSize\u003c/code\u003e is its size in bytes. At buffer construction time no buffer\ndata is allocated, but the buffer data provided by the user is used. The\nbuffer data must remain valid for as long as the buffer may be used, and\nthe user is responsible to free the buffer data when no longer required.\nThe user must also ensure that the memory is accessible to the device by\nusing a supported allocation function (e.g., \u003ccode\u003esycl::malloc_device\u003c/code\u003e,\n\u003ccode\u003ecudaMalloc\u003c/code\u003e, \u003ccode\u003ehipMalloc\u003c/code\u003e) and alignment (e.g., Metal requires the\nallocation to be page-aligned).\u003c/p\u003e\n\u003cp dir=\"auto\"\u003eBuffers can be also imported from graphics APIs as external memory, to\navoid expensive copying of data through host memory. Different types of\nexternal memory can be imported from either POSIX file descriptors or\nWin32 handles using\u003c/p\u003e\n\u003cdiv class=\"highlight highlight-source-c++ notranslate position-relative overflow-auto\" dir=\"auto\" data-snippet-clipboard-copy-content=\"OIDNBuffer oidnNewSharedBufferFromFD(OIDNDevice device,\n OIDNExternalMemoryTypeFlag fdType,\n int fd, size_t byteSize);\n\nOIDNBuffer oidnNewSharedBufferFromWin32Handle(OIDNDevice device,\n OIDNExternalMemoryTypeFlag handleType,\n void* handle, const void* name, size_t byteSize);\"\u003e\u003cpre\u003eOIDNBuffer \u003cspan class=\"pl-en\"\u003eoidnNewSharedBufferFromFD\u003c/span\u003e(OIDNDevice device,\n OIDNExternalMemoryTypeFlag fdType,\n \u003cspan class=\"pl-k\"\u003eint\u003c/span\u003e fd, \u003cspan class=\"pl-c1\"\u003esize_t\u003c/span\u003e byteSize);\n\nOIDNBuffer \u003cspan class=\"pl-en\"\u003eoidnNewSharedBufferFromWin32Handle\u003c/span\u003e(OIDNDevice device,\n OIDNExternalMemoryTypeFlag handleType,\n \u003cspan class=\"pl-k\"\u003evoid\u003c/span\u003e* handle, \u003cspan class=\"pl-k\"\u003econst\u003c/span\u003e \u003cspan class=\"pl-k\"\u003evoid\u003c/span\u003e* name, \u003cspan class=\"pl-c1\"\u003esize_t\u003c/span\u003e byteSize);\u003c/pre\u003e\u003c/div\u003e\n\u003cp dir=\"auto\"\u003eBefore exporting memory from the graphics API, the application should\nfind a handle type which is supported by both the Open Image Denoise\ndevice (see \u003ccode\u003eexternalMemoryTypes\u003c/code\u003e device parameter) and the graphics\nAPI. Note that different GPU vendors may support different handle types.\nTo ensure compatibility with all device types, applications should\nsupport at least \u003ccode\u003eOIDN_EXTERNAL_MEMORY_TYPE_FLAG_OPAQUE_FD\u003c/code\u003e on Windows\nand both \u003ccode\u003eOIDN_EXTERNAL_MEMORY_TYPE_FLAG_OPAQUE_FD\u003c/code\u003e and\n\u003ccode\u003eOIDN_EXTERNAL_MEMORY_TYPE_FLAG_DMA_BUF\u003c/code\u003e on Linux. All possible external\nmemory types are listed in the table below.\u003c/p\u003e\n\u003cmarkdown-accessiblity-table\u003e\u003ctable\u003e\n\u003cthead\u003e\n\u003ctr\u003e\n\u003cth align=\"left\"\u003eName\u003c/th\u003e\n\u003cth align=\"left\"\u003eDescription\u003c/th\u003e\n\u003c/tr\u003e\n\u003c/thead\u003e\n\u003ctbody\u003e\n\u003ctr\u003e\n\u003ctd align=\"left\"\u003e\u003ccode\u003eOIDN_EXTERNAL_MEMORY_TYPE_FLAG_NONE\u003c/code\u003e\u003c/td\u003e\n\u003ctd align=\"left\"\u003e\u003c/td\u003e\n\u003c/tr\u003e\n\u003ctr\u003e\n\u003ctd align=\"left\"\u003e\u003ccode\u003eOIDN_EXTERNAL_MEMORY_TYPE_FLAG_OPAQUE_FD\u003c/code\u003e\u003c/td\u003e\n\u003ctd align=\"left\"\u003eopaque POSIX file descriptor handle (recommended on Linux)\u003c/td\u003e\n\u003c/tr\u003e\n\u003ctr\u003e\n\u003ctd align=\"left\"\u003e\u003ccode\u003eOIDN_EXTERNAL_MEMORY_TYPE_FLAG_DMA_BUF\u003c/code\u003e\u003c/td\u003e\n\u003ctd align=\"left\"\u003efile descriptor handle for a Linux dma_buf (recommended on Linux)\u003c/td\u003e\n\u003c/tr\u003e\n\u003ctr\u003e\n\u003ctd align=\"left\"\u003e\u003ccode\u003eOIDN_EXTERNAL_MEMORY_TYPE_FLAG_OPAQUE_WIN32\u003c/code\u003e\u003c/td\u003e\n\u003ctd align=\"left\"\u003eNT handle (recommended on Windows)\u003c/td\u003e\n\u003c/tr\u003e\n\u003ctr\u003e\n\u003ctd align=\"left\"\u003e\u003ccode\u003eOIDN_EXTERNAL_MEMORY_TYPE_FLAG_OPAQUE_WIN32_KMT\u003c/code\u003e\u003c/td\u003e\n\u003ctd align=\"left\"\u003eglobal share (KMT) handle\u003c/td\u003e\n\u003c/tr\u003e\n\u003ctr\u003e\n\u003ctd align=\"left\"\u003e\u003ccode\u003eOIDN_EXTERNAL_MEMORY_TYPE_FLAG_D3D11_TEXTURE\u003c/code\u003e\u003c/td\u003e\n\u003ctd align=\"left\"\u003eNT handle returned by \u003ccode\u003eIDXGIResource1::CreateSharedHandle\u003c/code\u003e referring to a Direct3D 11 texture resource\u003c/td\u003e\n\u003c/tr\u003e\n\u003ctr\u003e\n\u003ctd align=\"left\"\u003e\u003ccode\u003eOIDN_EXTERNAL_MEMORY_TYPE_FLAG_D3D11_TEXTURE_KMT\u003c/code\u003e\u003c/td\u003e\n\u003ctd align=\"left\"\u003eglobal share (KMT) handle returned by \u003ccode\u003eIDXGIResource::GetSharedHandle\u003c/code\u003e referring to a Direct3D 11 texture resource\u003c/td\u003e\n\u003c/tr\u003e\n\u003ctr\u003e\n\u003ctd align=\"left\"\u003e\u003ccode\u003eOIDN_EXTERNAL_MEMORY_TYPE_FLAG_D3D11_RESOURCE\u003c/code\u003e\u003c/td\u003e\n\u003ctd align=\"left\"\u003eNT handle returned by \u003ccode\u003eIDXGIResource1::CreateSharedHandle\u003c/code\u003e referring to a Direct3D 11 resource\u003c/td\u003e\n\u003c/tr\u003e\n\u003ctr\u003e\n\u003ctd align=\"left\"\u003e\u003ccode\u003eOIDN_EXTERNAL_MEMORY_TYPE_FLAG_D3D11_RESOURCE_KMT\u003c/code\u003e\u003c/td\u003e\n\u003ctd align=\"left\"\u003eglobal share (KMT) handle returned by \u003ccode\u003eIDXGIResource::GetSharedHandle\u003c/code\u003e referring to a Direct3D 11 resource\u003c/td\u003e\n\u003c/tr\u003e\n\u003ctr\u003e\n\u003ctd align=\"left\"\u003e\u003ccode\u003eOIDN_EXTERNAL_MEMORY_TYPE_FLAG_D3D12_HEAP\u003c/code\u003e\u003c/td\u003e\n\u003ctd align=\"left\"\u003eNT handle returned by \u003ccode\u003eID3D12Device::CreateSharedHandle\u003c/code\u003e referring to a Direct3D 12 heap resource\u003c/td\u003e\n\u003c/tr\u003e\n\u003ctr\u003e\n\u003ctd align=\"left\"\u003e\u003ccode\u003eOIDN_EXTERNAL_MEMORY_TYPE_FLAG_D3D12_RESOURCE\u003c/code\u003e\u003c/td\u003e\n\u003ctd align=\"left\"\u003eNT handle returned by \u003ccode\u003eID3D12Device::CreateSharedHandle\u003c/code\u003e referring to a Direct3D 12 committed resource\u003c/td\u003e\n\u003c/tr\u003e\n\u003c/tbody\u003e\n\u003c/table\u003e\u003c/markdown-accessiblity-table\u003e\n\u003cp dir=\"auto\"\u003eSupported external memory type flags, i.e., valid constants of type\n\u003ccode\u003eOIDNExternalMemoryTypeFlag\u003c/code\u003e.\u003c/p\u003e\n\u003cp dir=\"auto\"\u003eMetal buffers can be imported directly with\u003c/p\u003e\n\u003cdiv class=\"highlight highlight-source-c++ notranslate position-relative overflow-auto\" dir=\"auto\" data-snippet-clipboard-copy-content=\"OIDNBuffer oidnNewSharedBufferFromMetal(OIDNDevice device, MTLBuffer_id buffer);\"\u003e\u003cpre\u003eOIDNBuffer \u003cspan class=\"pl-en\"\u003eoidnNewSharedBufferFromMetal\u003c/span\u003e(OIDNDevice device, MTLBuffer_id buffer);\u003c/pre\u003e\u003c/div\u003e\n\u003cp dir=\"auto\"\u003eNote that if a buffer with an \u003ccode\u003eMTLStorageModeManaged\u003c/code\u003e storage mode is\nimported, it is the responsibility of the user to synchronize the\ncontents of the buffer between the host and the device.\u003c/p\u003e\n\u003cp dir=\"auto\"\u003eSimilar to device objects, buffer objects are also reference-counted and\ncan be retained and released by calling the following functions:\u003c/p\u003e\n\u003cdiv class=\"highlight highlight-source-c++ notranslate position-relative overflow-auto\" dir=\"auto\" data-snippet-clipboard-copy-content=\"void oidnRetainBuffer (OIDNBuffer buffer);\nvoid oidnReleaseBuffer(OIDNBuffer buffer);\"\u003e\u003cpre\u003e\u003cspan class=\"pl-k\"\u003evoid\u003c/span\u003e \u003cspan class=\"pl-en\"\u003eoidnRetainBuffer\u003c/span\u003e (OIDNBuffer buffer);\n\u003cspan class=\"pl-k\"\u003evoid\u003c/span\u003e \u003cspan class=\"pl-en\"\u003eoidnReleaseBuffer\u003c/span\u003e(OIDNBuffer buffer);\u003c/pre\u003e\u003c/div\u003e\n\u003cp dir=\"auto\"\u003eThe size of in bytes and storage mode of the buffer can be queried using\u003c/p\u003e\n\u003cdiv class=\"highlight highlight-source-c++ notranslate position-relative overflow-auto\" dir=\"auto\" data-snippet-clipboard-copy-content=\"size_t oidnGetBufferSize (OIDNBuffer buffer);\nOIDNStorage oidnGetBufferStorage(OIDNBuffer buffer);\"\u003e\u003cpre\u003e\u003cspan class=\"pl-c1\"\u003esize_t\u003c/span\u003e \u003cspan class=\"pl-en\"\u003eoidnGetBufferSize\u003c/span\u003e (OIDNBuffer buffer);\nOIDNStorage \u003cspan class=\"pl-en\"\u003eoidnGetBufferStorage\u003c/span\u003e(OIDNBuffer buffer);\u003c/pre\u003e\u003c/div\u003e\n\u003cp dir=\"auto\"\u003eIt is possible to get a pointer directly to the buffer data, which is\nusually the preferred way to access the data stored in the buffer:\u003c/p\u003e\n\u003cdiv class=\"highlight highlight-source-c++ notranslate position-relative overflow-auto\" dir=\"auto\" data-snippet-clipboard-copy-content=\"void* oidnGetBufferData(OIDNBuffer buffer);\"\u003e\u003cpre\u003e\u003cspan class=\"pl-k\"\u003evoid\u003c/span\u003e* \u003cspan class=\"pl-en\"\u003eoidnGetBufferData\u003c/span\u003e(OIDNBuffer buffer);\u003c/pre\u003e\u003c/div\u003e\n\u003cp dir=\"auto\"\u003eAccessing the data on the host through this pointer is possible \u003cem\u003eonly\u003c/em\u003e\nif the buffer was created with \u003ccode\u003eOIDN_STORAGE_HOST\u003c/code\u003e or\n\u003ccode\u003eOIDN_STORAGE_MANAGED\u003c/code\u003e. Note that a \u003ccode\u003eNULL\u003c/code\u003e pointer may be returned if\nthe buffer is empty.\u003c/p\u003e\n\u003cp dir=\"auto\"\u003eIn some cases better performance can be achieved by using device storage\nfor buffers. Such data can be accessed on the host by copying to/from\nhost memory (including pageable system memory) using the following\nfunctions:\u003c/p\u003e\n\u003cdiv class=\"highlight highlight-source-c++ notranslate position-relative overflow-auto\" dir=\"auto\" data-snippet-clipboard-copy-content=\"void oidnReadBuffer(OIDNBuffer buffer,\n size_t byteOffset, size_t byteSize, void* dstHostPtr);\n\nvoid oidnWriteBuffer(OIDNBuffer buffer,\n size_t byteOffset, size_t byteSize, const void* srcHostPtr);\"\u003e\u003cpre\u003e\u003cspan class=\"pl-k\"\u003evoid\u003c/span\u003e \u003cspan class=\"pl-en\"\u003eoidnReadBuffer\u003c/span\u003e(OIDNBuffer buffer,\n \u003cspan class=\"pl-c1\"\u003esize_t\u003c/span\u003e byteOffset, \u003cspan class=\"pl-c1\"\u003esize_t\u003c/span\u003e byteSize, \u003cspan class=\"pl-k\"\u003evoid\u003c/span\u003e* dstHostPtr);\n\n\u003cspan class=\"pl-k\"\u003evoid\u003c/span\u003e \u003cspan class=\"pl-en\"\u003eoidnWriteBuffer\u003c/span\u003e(OIDNBuffer buffer,\n \u003cspan class=\"pl-c1\"\u003esize_t\u003c/span\u003e byteOffset, \u003cspan class=\"pl-c1\"\u003esize_t\u003c/span\u003e byteSize, \u003cspan class=\"pl-k\"\u003econst\u003c/span\u003e \u003cspan class=\"pl-k\"\u003evoid\u003c/span\u003e* srcHostPtr);\u003c/pre\u003e\u003c/div\u003e\n\u003cp dir=\"auto\"\u003eThese functions will always block until the read/write operation has\nbeen completed, which is often suboptimal. The following functions\nexecute these operations asynchronously:\u003c/p\u003e\n\u003cdiv class=\"highlight highlight-source-c++ notranslate position-relative overflow-auto\" dir=\"auto\" data-snippet-clipboard-copy-content=\"void oidnReadBufferAsync(OIDNBuffer buffer,\n size_t byteOffset, size_t byteSize, void* dstHostPtr);\n\nvoid oidnWriteBufferAsync(OIDNBuffer buffer,\n size_t byteOffset, size_t byteSize, const void* srcHostPtr);\"\u003e\u003cpre\u003e\u003cspan class=\"pl-k\"\u003evoid\u003c/span\u003e \u003cspan class=\"pl-en\"\u003eoidnReadBufferAsync\u003c/span\u003e(OIDNBuffer buffer,\n \u003cspan class=\"pl-c1\"\u003esize_t\u003c/span\u003e byteOffset, \u003cspan class=\"pl-c1\"\u003esize_t\u003c/span\u003e byteSize, \u003cspan class=\"pl-k\"\u003evoid\u003c/span\u003e* dstHostPtr);\n\n\u003cspan class=\"pl-k\"\u003evoid\u003c/span\u003e \u003cspan class=\"pl-en\"\u003eoidnWriteBufferAsync\u003c/span\u003e(OIDNBuffer buffer,\n \u003cspan class=\"pl-c1\"\u003esize_t\u003c/span\u003e byteOffset, \u003cspan class=\"pl-c1\"\u003esize_t\u003c/span\u003e byteSize, \u003cspan class=\"pl-k\"\u003econst\u003c/span\u003e \u003cspan class=\"pl-k\"\u003evoid\u003c/span\u003e* srcHostPtr);\u003c/pre\u003e\u003c/div\u003e\n\u003cp dir=\"auto\"\u003eWhen copying asynchronously, the user must ensure correct\nsynchronization with the device by calling \u003ccode\u003eoidnSyncDevice\u003c/code\u003e before\naccessing the copied data or releasing the buffer. Failure to do so will\nresult in undefined behavior.\u003c/p\u003e\n\u003cdiv class=\"markdown-heading\" dir=\"auto\"\u003e\u003ch3 tabindex=\"-1\" class=\"heading-element\" dir=\"auto\"\u003eData Format\u003c/h3\u003e\u003ca id=\"user-content-data-format\" class=\"anchor\" aria-label=\"Permalink: Data Format\" href=\"#data-format\"\u003e\u003csvg class=\"octicon octicon-link\" viewBox=\"0 0 16 16\" version=\"1.1\" width=\"16\" height=\"16\" aria-hidden=\"true\"\u003e\u003cpath d=\"m7.775 3.275 1.25-1.25a3.5 3.5 0 1 1 4.95 4.95l-2.5 2.5a3.5 3.5 0 0 1-4.95 0 .751.751 0 0 1 .018-1.042.751.751 0 0 1 1.042-.018 1.998 1.998 0 0 0 2.83 0l2.5-2.5a2.002 2.002 0 0 0-2.83-2.83l-1.25 1.25a.751.751 0 0 1-1.042-.018.751.751 0 0 1-.018-1.042Zm-4.69 9.64a1.998 1.998 0 0 0 2.83 0l1.25-1.25a.751.751 0 0 1 1.042.018.751.751 0 0 1 .018 1.042l-1.25 1.25a3.5 3.5 0 1 1-4.95-4.95l2.5-2.5a3.5 3.5 0 0 1 4.95 0 .751.751 0 0 1-.018 1.042.751.751 0 0 1-1.042.018 1.998 1.998 0 0 0-2.83 0l-2.5 2.5a1.998 1.998 0 0 0 0 2.83Z\"\u003e\u003c/path\u003e\u003c/svg\u003e\u003c/a\u003e\u003c/div\u003e\n\u003cp dir=\"auto\"\u003eBuffers store opaque data and thus have no information about the type\nand format of the data. Other objects, e.g. filters, typically require\nspecifying the format of the data stored in buffers or shared via\npointers. This can be done using the \u003ccode\u003eOIDNFormat\u003c/code\u003e enumeration type:\u003c/p\u003e\n\u003cmarkdown-accessiblity-table\u003e\u003ctable\u003e\n\u003cthead\u003e\n\u003ctr\u003e\n\u003cth align=\"left\"\u003eName\u003c/th\u003e\n\u003cth align=\"left\"\u003eDescription\u003c/th\u003e\n\u003c/tr\u003e\n\u003c/thead\u003e\n\u003ctbody\u003e\n\u003ctr\u003e\n\u003ctd align=\"left\"\u003e\u003ccode\u003eOIDN_FORMAT_UNDEFINED\u003c/code\u003e\u003c/td\u003e\n\u003ctd align=\"left\"\u003eundefined format\u003c/td\u003e\n\u003c/tr\u003e\n\u003ctr\u003e\n\u003ctd align=\"left\"\u003e\u003ccode\u003eOIDN_FORMAT_FLOAT\u003c/code\u003e\u003c/td\u003e\n\u003ctd align=\"left\"\u003e32-bit floating-point scalar\u003c/td\u003e\n\u003c/tr\u003e\n\u003ctr\u003e\n\u003ctd align=\"left\"\u003e\u003ccode\u003eOIDN_FORMAT_FLOAT[234]\u003c/code\u003e\u003c/td\u003e\n\u003ctd align=\"left\"\u003e32-bit floating-point [234]-element vector\u003c/td\u003e\n\u003c/tr\u003e\n\u003ctr\u003e\n\u003ctd align=\"left\"\u003e\u003ccode\u003eOIDN_FORMAT_HALF\u003c/code\u003e\u003c/td\u003e\n\u003ctd align=\"left\"\u003e16-bit floating-point scalar\u003c/td\u003e\n\u003c/tr\u003e\n\u003ctr\u003e\n\u003ctd align=\"left\"\u003e\u003ccode\u003eOIDN_FORMAT_HALF[234]\u003c/code\u003e\u003c/td\u003e\n\u003ctd align=\"left\"\u003e16-bit floating-point [234]-element vector\u003c/td\u003e\n\u003c/tr\u003e\n\u003c/tbody\u003e\n\u003c/table\u003e\u003c/markdown-accessiblity-table\u003e\n\u003cp dir=\"auto\"\u003eSupported data formats, i.e., valid constants of type \u003ccode\u003eOIDNFormat\u003c/code\u003e.\u003c/p\u003e\n\u003cdiv class=\"markdown-heading\" dir=\"auto\"\u003e\u003ch2 tabindex=\"-1\" class=\"heading-element\" dir=\"auto\"\u003eFilters\u003c/h2\u003e\u003ca id=\"user-content-filters\" class=\"anchor\" aria-label=\"Permalink: Filters\" href=\"#filters\"\u003e\u003csvg class=\"octicon octicon-link\" viewBox=\"0 0 16 16\" version=\"1.1\" width=\"16\" height=\"16\" aria-hidden=\"true\"\u003e\u003cpath d=\"m7.775 3.275 1.25-1.25a3.5 3.5 0 1 1 4.95 4.95l-2.5 2.5a3.5 3.5 0 0 1-4.95 0 .751.751 0 0 1 .018-1.042.751.751 0 0 1 1.042-.018 1.998 1.998 0 0 0 2.83 0l2.5-2.5a2.002 2.002 0 0 0-2.83-2.83l-1.25 1.25a.751.751 0 0 1-1.042-.018.751.751 0 0 1-.018-1.042Zm-4.69 9.64a1.998 1.998 0 0 0 2.83 0l1.25-1.25a.751.751 0 0 1 1.042.018.751.751 0 0 1 .018 1.042l-1.25 1.25a3.5 3.5 0 1 1-4.95-4.95l2.5-2.5a3.5 3.5 0 0 1 4.95 0 .751.751 0 0 1-.018 1.042.751.751 0 0 1-1.042.018 1.998 1.998 0 0 0-2.83 0l-2.5 2.5a1.998 1.998 0 0 0 0 2.83Z\"\u003e\u003c/path\u003e\u003c/svg\u003e\u003c/a\u003e\u003c/div\u003e\n\u003cp dir=\"auto\"\u003eFilters are the main objects in Open Image Denoise that are responsible\nfor the actual denoising. The library ships with a collection of filters\nwhich are optimized for different types of images and use cases. To\ncreate a filter object, call\u003c/p\u003e\n\u003cdiv class=\"highlight highlight-source-c++ notranslate position-relative overflow-auto\" dir=\"auto\" data-snippet-clipboard-copy-content=\"OIDNFilter oidnNewFilter(OIDNDevice device, const char* type);\"\u003e\u003cpre\u003eOIDNFilter \u003cspan class=\"pl-en\"\u003eoidnNewFilter\u003c/span\u003e(OIDNDevice device, \u003cspan class=\"pl-k\"\u003econst\u003c/span\u003e \u003cspan class=\"pl-k\"\u003echar\u003c/span\u003e* type);\u003c/pre\u003e\u003c/div\u003e\n\u003cp dir=\"auto\"\u003ewhere \u003ccode\u003etype\u003c/code\u003e is the name of the filter type to create. The supported\nfilter types are documented later in this section.\u003c/p\u003e\n\u003cp dir=\"auto\"\u003eCreating filter objects can be very expensive, therefore it is\n\u003cem\u003estrongly\u003c/em\u003e recommended to reuse the same filter for denoising as many\nimages as possible, as long as the these images have the same same size,\nformat, and features (i.e., only the memory locations and pixel values\nmay be different). Otherwise (e.g. for images with different\nresolutions), reusing the same filter would not have any benefits.\u003c/p\u003e\n\u003cp dir=\"auto\"\u003eOnce created, filter objects can be retained and released with\u003c/p\u003e\n\u003cdiv class=\"highlight highlight-source-c++ notranslate position-relative overflow-auto\" dir=\"auto\" data-snippet-clipboard-copy-content=\"void oidnRetainFilter (OIDNFilter filter);\nvoid oidnReleaseFilter(OIDNFilter filter);\"\u003e\u003cpre\u003e\u003cspan class=\"pl-k\"\u003evoid\u003c/span\u003e \u003cspan class=\"pl-en\"\u003eoidnRetainFilter\u003c/span\u003e (OIDNFilter filter);\n\u003cspan class=\"pl-k\"\u003evoid\u003c/span\u003e \u003cspan class=\"pl-en\"\u003eoidnReleaseFilter\u003c/span\u003e(OIDNFilter filter);\u003c/pre\u003e\u003c/div\u003e\n\u003cp dir=\"auto\"\u003eAfter creating a filter, it needs to be set up by specifying the input\nand output images, and potentially setting other parameter values as\nwell.\u003c/p\u003e\n\u003cp dir=\"auto\"\u003eTo set image parameters of a filter, you can use one of the following\nfunctions:\u003c/p\u003e\n\u003cdiv class=\"highlight highlight-source-c++ notranslate position-relative overflow-auto\" dir=\"auto\" data-snippet-clipboard-copy-content=\"void oidnSetFilterImage(OIDNFilter filter, const char* name,\n OIDNBuffer buffer, OIDNFormat format,\n size_t width, size_t height,\n size_t byteOffset,\n size_t pixelByteStride, size_t rowByteStride);\n\nvoid oidnSetSharedFilterImage(OIDNFilter filter, const char* name,\n void* devPtr, OIDNFormat format,\n size_t width, size_t height,\n size_t byteOffset,\n size_t pixelByteStride, size_t rowByteStride);\"\u003e\u003cpre\u003e\u003cspan class=\"pl-k\"\u003evoid\u003c/span\u003e \u003cspan class=\"pl-en\"\u003eoidnSetFilterImage\u003c/span\u003e(OIDNFilter filter, \u003cspan class=\"pl-k\"\u003econst\u003c/span\u003e \u003cspan class=\"pl-k\"\u003echar\u003c/span\u003e* name,\n OIDNBuffer buffer, OIDNFormat format,\n \u003cspan class=\"pl-c1\"\u003esize_t\u003c/span\u003e width, \u003cspan class=\"pl-c1\"\u003esize_t\u003c/span\u003e height,\n \u003cspan class=\"pl-c1\"\u003esize_t\u003c/span\u003e byteOffset,\n \u003cspan class=\"pl-c1\"\u003esize_t\u003c/span\u003e pixelByteStride, \u003cspan class=\"pl-c1\"\u003esize_t\u003c/span\u003e rowByteStride);\n\n\u003cspan class=\"pl-k\"\u003evoid\u003c/span\u003e \u003cspan class=\"pl-en\"\u003eoidnSetSharedFilterImage\u003c/span\u003e(OIDNFilter filter, \u003cspan class=\"pl-k\"\u003econst\u003c/span\u003e \u003cspan class=\"pl-k\"\u003echar\u003c/span\u003e* name,\n \u003cspan class=\"pl-k\"\u003evoid\u003c/span\u003e* devPtr, OIDNFormat format,\n \u003cspan class=\"pl-c1\"\u003esize_t\u003c/span\u003e width, \u003cspan class=\"pl-c1\"\u003esize_t\u003c/span\u003e height,\n \u003cspan class=\"pl-c1\"\u003esize_t\u003c/span\u003e byteOffset,\n \u003cspan class=\"pl-c1\"\u003esize_t\u003c/span\u003e pixelByteStride, \u003cspan class=\"pl-c1\"\u003esize_t\u003c/span\u003e rowByteStride);\u003c/pre\u003e\u003c/div\u003e\n\u003cp dir=\"auto\"\u003eIt is possible to specify either a data buffer object (\u003ccode\u003ebuffer\u003c/code\u003e\nargument) with the \u003ccode\u003eoidnSetFilterImage\u003c/code\u003e function, or directly a pointer\nto user-managed device-accessible data (\u003ccode\u003edevPtr\u003c/code\u003e argument) with the\n\u003ccode\u003eoidnSetSharedFilterImage\u003c/code\u003e function. Regardless of whether a buffer or a\npointer is specified, the data \u003cem\u003emust\u003c/em\u003e be accessible to the device. The\neasiest way to guarantee this regardless of the device type (CPU or GPU)\nis using buffer objects.\u003c/p\u003e\n\u003cp dir=\"auto\"\u003eIn both cases, you must also specify the name of the image parameter to\nset (\u003ccode\u003ename\u003c/code\u003e argument, e.g. \u003ccode\u003e\"color\"\u003c/code\u003e, \u003ccode\u003e\"output\"\u003c/code\u003e), the pixel format\n(\u003ccode\u003eformat\u003c/code\u003e argument), the width and height of the image in number of\npixels (\u003ccode\u003ewidth\u003c/code\u003e and \u003ccode\u003eheight\u003c/code\u003e arguments), the starting offset of the\nimage data (\u003ccode\u003ebyteOffset\u003c/code\u003e argument), the pixel stride (\u003ccode\u003epixelByteStride\u003c/code\u003e\nargument) and the row stride (\u003ccode\u003erowByteStride\u003c/code\u003e argument), in number of\nbytes.\u003c/p\u003e\n\u003cp dir=\"auto\"\u003eIf the pixels and/or rows are stored contiguously (tightly packed\nwithout any gaps), you can set \u003ccode\u003epixelByteStride\u003c/code\u003e and/or \u003ccode\u003erowByteStride\u003c/code\u003e\nto 0 to let the library compute the actual strides automatically, as a\nconvenience.\u003c/p\u003e\n\u003cp dir=\"auto\"\u003eImages support only \u003ccode\u003eFLOAT\u003c/code\u003e and \u003ccode\u003eHALF\u003c/code\u003e pixel formats with up to 3\nchannels. Custom image layouts with extra channels (e.g. alpha channel)\nor other data are supported as well by specifying a non-zero pixel\nstride. This way, expensive image layout conversion and copying can be\navoided but the extra channels will be ignored by the filter. If these\nchannels also need to be denoised, separate filters can be used.\u003c/p\u003e\n\u003cp dir=\"auto\"\u003eTo unset a previously set image parameter, returning it to a state as if\nit had not been set, call\u003c/p\u003e\n\u003cdiv class=\"highlight highlight-source-c++ notranslate position-relative overflow-auto\" dir=\"auto\" data-snippet-clipboard-copy-content=\"void oidnRemoveFilterImage(OIDNFilter filter, const char* name);\"\u003e\u003cpre\u003e\u003cspan class=\"pl-k\"\u003evoid\u003c/span\u003e \u003cspan class=\"pl-en\"\u003eoidnRemoveFilterImage\u003c/span\u003e(OIDNFilter filter, \u003cspan class=\"pl-k\"\u003econst\u003c/span\u003e \u003cspan class=\"pl-k\"\u003echar\u003c/span\u003e* name);\u003c/pre\u003e\u003c/div\u003e\n\u003cp dir=\"auto\"\u003eSome special data used by filters are opaque/untyped (e.g. trained model\nweights blobs), which can be specified with the\n\u003ccode\u003eoidnSetSharedFilterData\u003c/code\u003e function:\u003c/p\u003e\n\u003cdiv class=\"highlight highlight-source-c++ notranslate position-relative overflow-auto\" dir=\"auto\" data-snippet-clipboard-copy-content=\"void oidnSetSharedFilterData(OIDNFilter filter, const char* name,\n void* hostPtr, size_t byteSize);\"\u003e\u003cpre\u003e\u003cspan class=\"pl-k\"\u003evoid\u003c/span\u003e \u003cspan class=\"pl-en\"\u003eoidnSetSharedFilterData\u003c/span\u003e(OIDNFilter filter, \u003cspan class=\"pl-k\"\u003econst\u003c/span\u003e \u003cspan class=\"pl-k\"\u003echar\u003c/span\u003e* name,\n \u003cspan class=\"pl-k\"\u003evoid\u003c/span\u003e* hostPtr, \u003cspan class=\"pl-c1\"\u003esize_t\u003c/span\u003e byteSize);\u003c/pre\u003e\u003c/div\u003e\n\u003cp dir=\"auto\"\u003eThis data (\u003ccode\u003ehostPtr\u003c/code\u003e) must be accessible to the \u003cem\u003ehost\u003c/em\u003e, therefore system\nmemory allocation is suitable (i.e., there is no reason to use buffer\nobjects for allocation).\u003c/p\u003e\n\u003cp dir=\"auto\"\u003eModifying the contents of an opaque data parameter after setting it as a\nfilter parameter is allowed but the filter needs to be notified that the\ndata has been updated by calling\u003c/p\u003e\n\u003cdiv class=\"highlight highlight-source-c++ notranslate position-relative overflow-auto\" dir=\"auto\" data-snippet-clipboard-copy-content=\"void oidnUpdateFilterData(OIDNFilter filter, const char* name);\"\u003e\u003cpre\u003e\u003cspan class=\"pl-k\"\u003evoid\u003c/span\u003e \u003cspan class=\"pl-en\"\u003eoidnUpdateFilterData\u003c/span\u003e(OIDNFilter filter, \u003cspan class=\"pl-k\"\u003econst\u003c/span\u003e \u003cspan class=\"pl-k\"\u003echar\u003c/span\u003e* name);\u003c/pre\u003e\u003c/div\u003e\n\u003cp dir=\"auto\"\u003eUnsetting an opaque data parameter can be performed with\u003c/p\u003e\n\u003cdiv class=\"highlight highlight-source-c++ notranslate position-relative overflow-auto\" dir=\"auto\" data-snippet-clipboard-copy-content=\"void oidnRemoveFilterData(OIDNFilter filter, const char* name);\"\u003e\u003cpre\u003e\u003cspan class=\"pl-k\"\u003evoid\u003c/span\u003e \u003cspan class=\"pl-en\"\u003eoidnRemoveFilterData\u003c/span\u003e(OIDNFilter filter, \u003cspan class=\"pl-k\"\u003econst\u003c/span\u003e \u003cspan class=\"pl-k\"\u003echar\u003c/span\u003e* name);\u003c/pre\u003e\u003c/div\u003e\n\u003cp dir=\"auto\"\u003eFilters may have parameters other than buffers as well, which you can\nset and get using the following functions:\u003c/p\u003e\n\u003cdiv class=\"highlight highlight-source-c++ notranslate position-relative overflow-auto\" dir=\"auto\" data-snippet-clipboard-copy-content=\"bool oidnGetFilterBool (OIDNFilter filter, const char* name);\nvoid oidnSetFilterBool (OIDNFilter filter, const char* name, bool value);\nint oidnGetFilterInt (OIDNFilter filter, const char* name);\nvoid oidnSetFilterInt (OIDNFilter filter, const char* name, int value);\nfloat oidnGetFilterFloat(OIDNFilter filter, const char* name);\nvoid oidnSetFilterFloat(OIDNFilter filter, const char* name, float value);\"\u003e\u003cpre\u003e\u003cspan class=\"pl-k\"\u003ebool\u003c/span\u003e \u003cspan class=\"pl-en\"\u003eoidnGetFilterBool\u003c/span\u003e (OIDNFilter filter, \u003cspan class=\"pl-k\"\u003econst\u003c/span\u003e \u003cspan class=\"pl-k\"\u003echar\u003c/span\u003e* name);\n\u003cspan class=\"pl-k\"\u003evoid\u003c/span\u003e \u003cspan class=\"pl-en\"\u003eoidnSetFilterBool\u003c/span\u003e (OIDNFilter filter, \u003cspan class=\"pl-k\"\u003econst\u003c/span\u003e \u003cspan class=\"pl-k\"\u003echar\u003c/span\u003e* name, \u003cspan class=\"pl-k\"\u003ebool\u003c/span\u003e value);\n\u003cspan class=\"pl-k\"\u003eint\u003c/span\u003e \u003cspan class=\"pl-en\"\u003eoidnGetFilterInt\u003c/span\u003e (OIDNFilter filter, \u003cspan class=\"pl-k\"\u003econst\u003c/span\u003e \u003cspan class=\"pl-k\"\u003echar\u003c/span\u003e* name);\n\u003cspan class=\"pl-k\"\u003evoid\u003c/span\u003e \u003cspan class=\"pl-en\"\u003eoidnSetFilterInt\u003c/span\u003e (OIDNFilter filter, \u003cspan class=\"pl-k\"\u003econst\u003c/span\u003e \u003cspan class=\"pl-k\"\u003echar\u003c/span\u003e* name, \u003cspan class=\"pl-k\"\u003eint\u003c/span\u003e value);\n\u003cspan class=\"pl-k\"\u003efloat\u003c/span\u003e \u003cspan class=\"pl-en\"\u003eoidnGetFilterFloat\u003c/span\u003e(OIDNFilter filter, \u003cspan class=\"pl-k\"\u003econst\u003c/span\u003e \u003cspan class=\"pl-k\"\u003echar\u003c/span\u003e* name);\n\u003cspan class=\"pl-k\"\u003evoid\u003c/span\u003e \u003cspan class=\"pl-en\"\u003eoidnSetFilterFloat\u003c/span\u003e(OIDNFilter filter, \u003cspan class=\"pl-k\"\u003econst\u003c/span\u003e \u003cspan class=\"pl-k\"\u003echar\u003c/span\u003e* name, \u003cspan class=\"pl-k\"\u003efloat\u003c/span\u003e value);\u003c/pre\u003e\u003c/div\u003e\n\u003cp dir=\"auto\"\u003eFilters support a progress monitor callback mechanism that can be used\nto report progress of filter operations and to cancel them as well.\nCalling \u003ccode\u003eoidnSetFilterProgressMonitorFunction\u003c/code\u003e registers a progress\nmonitor callback function (\u003ccode\u003efunc\u003c/code\u003e argument) with payload (\u003ccode\u003euserPtr\u003c/code\u003e\nargument) for the specified filter (\u003ccode\u003efilter\u003c/code\u003e argument):\u003c/p\u003e\n\u003cdiv class=\"highlight highlight-source-c++ notranslate position-relative overflow-auto\" dir=\"auto\" data-snippet-clipboard-copy-content=\"typedef bool (*OIDNProgressMonitorFunction)(void* userPtr, double n);\n\nvoid oidnSetFilterProgressMonitorFunction(OIDNFilter filter,\n OIDNProgressMonitorFunction func,\n void* userPtr);\"\u003e\u003cpre\u003e\u003cspan class=\"pl-k\"\u003etypedef\u003c/span\u003e \u003cspan class=\"pl-en\"\u003ebool\u003c/span\u003e (*OIDNProgressMonitorFunction)(\u003cspan class=\"pl-k\"\u003evoid\u003c/span\u003e* userPtr, \u003cspan class=\"pl-k\"\u003edouble\u003c/span\u003e n);\n\n\u003cspan class=\"pl-k\"\u003evoid\u003c/span\u003e \u003cspan class=\"pl-en\"\u003eoidnSetFilterProgressMonitorFunction\u003c/span\u003e(OIDNFilter filter,\n OIDNProgressMonitorFunction func,\n \u003cspan class=\"pl-k\"\u003evoid\u003c/span\u003e* userPtr);\u003c/pre\u003e\u003c/div\u003e\n\u003cp dir=\"auto\"\u003eOnly a single callback function can be registered per filter, and\nfurther invocations overwrite the previously set callback function.\nPassing \u003ccode\u003eNULL\u003c/code\u003e as function pointer disables the registered callback\nfunction. Once registered, Open Image Denoise will invoke the callback\nfunction multiple times during filter operations, by passing the payload\nas set at registration time (\u003ccode\u003euserPtr\u003c/code\u003e argument), and a \u003ccode\u003edouble\u003c/code\u003e in the\nrange [0, 1] which estimates the progress of the operation (\u003ccode\u003en\u003c/code\u003e\nargument). When returning \u003ccode\u003etrue\u003c/code\u003e from the callback function, Open Image\nDenoise will continue the filter operation normally. When returning\n\u003ccode\u003efalse\u003c/code\u003e, the library will attempt to cancel the filter operation as soon\nas possible, and if that is fulfilled, it will raise an\n\u003ccode\u003eOIDN_ERROR_CANCELLED\u003c/code\u003e error. Note that cancellation is not guaranteed.\u003c/p\u003e\n\u003cp dir=\"auto\"\u003eUsing a progress monitor callback function introduces some overhead,\nwhich may be significant on GPU devices, hurting performance. Therefore\nwe strongly recommend progress monitoring only for offline denoising,\nwhen denoising an image is expected to take several seconds.\u003c/p\u003e\n\u003cp dir=\"auto\"\u003eAfter setting all necessary parameters for the filter, the changes must\nbe committed by calling\u003c/p\u003e\n\u003cdiv class=\"highlight highlight-source-c++ notranslate position-relative overflow-auto\" dir=\"auto\" data-snippet-clipboard-copy-content=\"void oidnCommitFilter(OIDNFilter filter);\"\u003e\u003cpre\u003e\u003cspan class=\"pl-k\"\u003evoid\u003c/span\u003e \u003cspan class=\"pl-en\"\u003eoidnCommitFilter\u003c/span\u003e(OIDNFilter filter);\u003c/pre\u003e\u003c/div\u003e\n\u003cp dir=\"auto\"\u003eThe parameters can be updated after committing the filter, but it must\nbe re-committed for any new changes to take effect. Committing major\nchanges to the filter (e.g. setting new image parameters, changing the\nimage resolution) can be expensive, and thus should not be done\nfrequently (e.g. per frame).\u003c/p\u003e\n\u003cp dir=\"auto\"\u003eFinally, an image can be filtered by executing the filter with\u003c/p\u003e\n\u003cdiv class=\"highlight highlight-source-c++ notranslate position-relative overflow-auto\" dir=\"auto\" data-snippet-clipboard-copy-content=\"void oidnExecuteFilter(OIDNFilter filter);\"\u003e\u003cpre\u003e\u003cspan class=\"pl-k\"\u003evoid\u003c/span\u003e \u003cspan class=\"pl-en\"\u003eoidnExecuteFilter\u003c/span\u003e(OIDNFilter filter);\u003c/pre\u003e\u003c/div\u003e\n\u003cp dir=\"auto\"\u003ewhich will read the input image data from the specified buffers and\nproduce the denoised output image.\u003c/p\u003e\n\u003cp dir=\"auto\"\u003eThis function will always block until the filtering operation has been\ncompleted. The following function executes the operation asynchronously:\u003c/p\u003e\n\u003cdiv class=\"highlight highlight-source-c++ notranslate position-relative overflow-auto\" dir=\"auto\" data-snippet-clipboard-copy-content=\"void oidnExecuteFilterAsync(OIDNFilter filter);\"\u003e\u003cpre\u003e\u003cspan class=\"pl-k\"\u003evoid\u003c/span\u003e \u003cspan class=\"pl-en\"\u003eoidnExecuteFilterAsync\u003c/span\u003e(OIDNFilter filter);\u003c/pre\u003e\u003c/div\u003e\n\u003cp dir=\"auto\"\u003eFor filters created on a SYCL device it is also possible to specify\ndependent SYCL events (\u003ccode\u003edepEvents\u003c/code\u003e and \u003ccode\u003enumDepEvents\u003c/code\u003e arguments, may be\n\u003ccode\u003eNULL\u003c/code\u003e/0) and get a completion event as well (\u003ccode\u003edoneEvent\u003c/code\u003e argument, may\nbe \u003ccode\u003eNULL\u003c/code\u003e):\u003c/p\u003e\n\u003cdiv class=\"highlight highlight-source-c++ notranslate position-relative overflow-auto\" dir=\"auto\" data-snippet-clipboard-copy-content=\"void oidnExecuteSYCLFilterAsync(OIDNFilter filter,\n const sycl::event* depEvents, int numDepEvents,\n sycl::event* doneEvent);\"\u003e\u003cpre\u003e\u003cspan class=\"pl-k\"\u003evoid\u003c/span\u003e \u003cspan class=\"pl-en\"\u003eoidnExecuteSYCLFilterAsync\u003c/span\u003e(OIDNFilter filter,\n \u003cspan class=\"pl-k\"\u003econst\u003c/span\u003e sycl::event* depEvents, \u003cspan class=\"pl-k\"\u003eint\u003c/span\u003e numDepEvents,\n sycl::event* doneEvent);\u003c/pre\u003e\u003c/div\u003e\n\u003cp dir=\"auto\"\u003eWhen filtering asynchronously, the user must ensure correct\nsynchronization with the device by calling \u003ccode\u003eoidnSyncDevice\u003c/code\u003e before\naccessing the output image data or releasing the filter. Failure to do\nso will result in undefined behavior.\u003c/p\u003e\n\u003cp dir=\"auto\"\u003eIn the following we describe the different filters that are currently\nimplemented in Open Image Denoise.\u003c/p\u003e\n\u003cdiv class=\"markdown-heading\" dir=\"auto\"\u003e\u003ch3 tabindex=\"-1\" class=\"heading-element\" dir=\"auto\"\u003eRT\u003c/h3\u003e\u003ca id=\"user-content-rt\" class=\"anchor\" aria-label=\"Permalink: RT\" href=\"#rt\"\u003e\u003csvg class=\"octicon octicon-link\" viewBox=\"0 0 16 16\" version=\"1.1\" width=\"16\" height=\"16\" aria-hidden=\"true\"\u003e\u003cpath d=\"m7.775 3.275 1.25-1.25a3.5 3.5 0 1 1 4.95 4.95l-2.5 2.5a3.5 3.5 0 0 1-4.95 0 .751.751 0 0 1 .018-1.042.751.751 0 0 1 1.042-.018 1.998 1.998 0 0 0 2.83 0l2.5-2.5a2.002 2.002 0 0 0-2.83-2.83l-1.25 1.25a.751.751 0 0 1-1.042-.018.751.751 0 0 1-.018-1.042Zm-4.69 9.64a1.998 1.998 0 0 0 2.83 0l1.25-1.25a.751.751 0 0 1 1.042.018.751.751 0 0 1 .018 1.042l-1.25 1.25a3.5 3.5 0 1 1-4.95-4.95l2.5-2.5a3.5 3.5 0 0 1 4.95 0 .751.751 0 0 1-.018 1.042.751.751 0 0 1-1.042.018 1.998 1.998 0 0 0-2.83 0l-2.5 2.5a1.998 1.998 0 0 0 0 2.83Z\"\u003e\u003c/path\u003e\u003c/svg\u003e\u003c/a\u003e\u003c/div\u003e\n\u003cp dir=\"auto\"\u003eThe \u003ccode\u003eRT\u003c/code\u003e (\u003cstrong\u003er\u003c/strong\u003eay \u003cstrong\u003et\u003c/strong\u003eracing) filter is a generic ray tracing denoising\nfilter which is suitable for denoising images rendered with Monte Carlo\nray tracing methods like unidirectional and bidirectional path tracing.\nIt supports depth of field and motion blur as well, but it is \u003cem\u003enot\u003c/em\u003e\ntemporally stable. The filter is based on a convolutional neural network\n(CNN) and comes with a set of pre-trained models that work well with a\nwide range of ray tracing based renderers and noise levels.\u003c/p\u003e\n\u003cp dir=\"auto\"\u003e\u003ca target=\"_blank\" rel=\"noopener noreferrer nofollow\" href=\"https://camo.githubusercontent.com/ec5113117dca1ec160636955052f4bb9c6173d75bdd4b9280740d1b3d21f223a/68747470733a2f2f6f70656e696d61676564656e6f6973652e6769746875622e696f2f696d616765732f6d617a64615f347370705f696e7075742e6a7067\"\u003e\u003cimg src=\"https://camo.githubusercontent.com/ec5113117dca1ec160636955052f4bb9c6173d75bdd4b9280740d1b3d21f223a/68747470733a2f2f6f70656e696d61676564656e6f6973652e6769746875622e696f2f696d616765732f6d617a64615f347370705f696e7075742e6a7067\" alt=\"\" data-canonical-src=\"https://openimagedenoise.github.io/images/mazda_4spp_input.jpg\" style=\"max-width: 100%;\"\u003e\u003c/a\u003e\nExample noisy beauty image rendered using unidirectional path tracing\n(4 samples per pixel). \u003cem\u003eScene by\nEvermotion.\u003c/em\u003e\u003c/p\u003e\n\u003cp dir=\"auto\"\u003e\u003ca target=\"_blank\" rel=\"noopener noreferrer nofollow\" href=\"https://camo.githubusercontent.com/c9438a5ea9212119de2784f1b32d75da72c15246a52883c99a10580f2f4dd23e/68747470733a2f2f6f70656e696d61676564656e6f6973652e6769746875622e696f2f696d616765732f6d617a64615f347370705f6f69646e2e6a7067\"\u003e\u003cimg src=\"https://camo.githubusercontent.com/c9438a5ea9212119de2784f1b32d75da72c15246a52883c99a10580f2f4dd23e/68747470733a2f2f6f70656e696d61676564656e6f6973652e6769746875622e696f2f696d616765732f6d617a64615f347370705f6f69646e2e6a7067\" alt=\"\" data-canonical-src=\"https://openimagedenoise.github.io/images/mazda_4spp_oidn.jpg\" style=\"max-width: 100%;\"\u003e\u003c/a\u003e\nExample output beauty image denoised using prefiltered auxiliary\nfeature images (albedo and normal)\ntoo.\u003c/p\u003e\n\u003cp dir=\"auto\"\u003eFor denoising \u003cem\u003ebeauty\u003c/em\u003e images, it accepts either a low dynamic range\n(LDR) or high dynamic range (HDR) image (\u003ccode\u003ecolor\u003c/code\u003e) as the main input\nimage. In addition to this, it also accepts \u003cem\u003eauxiliary feature\u003c/em\u003e images,\n\u003ccode\u003ealbedo\u003c/code\u003e and \u003ccode\u003enormal\u003c/code\u003e, which are optional inputs that usually improve\nthe denoising quality significantly, preserving more details.\u003c/p\u003e\n\u003cp dir=\"auto\"\u003eIt is possible to denoise auxiliary images as well, in which case only\nthe respective auxiliary image has to be specified as input, instead of\nthe beauty image. This can be done as a \u003cem\u003eprefiltering\u003c/em\u003e step to further\nimprove the quality of the denoised beauty image.\u003c/p\u003e\n\u003cp dir=\"auto\"\u003eThe \u003ccode\u003eRT\u003c/code\u003e filter has certain limitations regarding the supported input\nimages. Most notably, it cannot denoise images that were not rendered\nwith ray tracing. Another important limitation is related to\nanti-aliasing filters. Most renderers use a high-quality pixel\nreconstruction filter instead of a trivial box filter to minimize\naliasing artifacts (e.g. Gaussian, Blackman-Harris). The \u003ccode\u003eRT\u003c/code\u003e filter\ndoes support such pixel filters but only if implemented with importance\nsampling. Weighted pixel sampling (sometimes called \u003cem\u003esplatting\u003c/em\u003e)\nintroduces correlation between neighboring pixels, which causes the\ndenoising to fail (the noise will not be filtered), thus it is not\nsupported.\u003c/p\u003e\n\u003cp dir=\"auto\"\u003eThe filter can be created by passing \u003ccode\u003e\"RT\"\u003c/code\u003e to the \u003ccode\u003eoidnNewFilter\u003c/code\u003e\nfunction as the filter type. The filter supports the parameters listed\nin the table below. All specified images must have the same dimensions.\nThe output image can be one of the input images (i.e. in-place denoising\nis supported). See section \u003ca href=\"#examples\"\u003eExamples\u003c/a\u003e for simple code\nsnippets that demonstrate the usage of the filter.\u003c/p\u003e\n\u003cmarkdown-accessiblity-table\u003e\u003ctable\u003e\n\u003cthead\u003e\n\u003ctr\u003e\n\u003cth align=\"left\"\u003eType\u003c/th\u003e\n\u003cth align=\"left\"\u003eName\u003c/th\u003e\n\u003cth align=\"right\"\u003eDefault\u003c/th\u003e\n\u003cth align=\"left\"\u003eDescription\u003c/th\u003e\n\u003c/tr\u003e\n\u003c/thead\u003e\n\u003ctbody\u003e\n\u003ctr\u003e\n\u003ctd align=\"left\"\u003e\u003ccode\u003eImage\u003c/code\u003e\u003c/td\u003e\n\u003ctd align=\"left\"\u003e\u003ccode\u003ecolor\u003c/code\u003e\u003c/td\u003e\n\u003ctd align=\"right\"\u003e\u003cem\u003eoptional\u003c/em\u003e\u003c/td\u003e\n\u003ctd align=\"left\"\u003einput beauty image (1–3 channels, LDR values in [0, 1] or HDR values in [0, +∞), values being interpreted such that, after scaling with the \u003ccode\u003einputScale\u003c/code\u003e parameter, a value of 1 corresponds to a luminance level of 100 cd/m²)\u003c/td\u003e\n\u003c/tr\u003e\n\u003ctr\u003e\n\u003ctd align=\"left\"\u003e\u003ccode\u003eImage\u003c/code\u003e\u003c/td\u003e\n\u003ctd align=\"left\"\u003e\u003ccode\u003ealbedo\u003c/code\u003e\u003c/td\u003e\n\u003ctd align=\"right\"\u003e\u003cem\u003eoptional\u003c/em\u003e\u003c/td\u003e\n\u003ctd align=\"left\"\u003einput auxiliary image containing the albedo per pixel (1–3 channels, values in [0, 1])\u003c/td\u003e\n\u003c/tr\u003e\n\u003ctr\u003e\n\u003ctd align=\"left\"\u003e\u003ccode\u003eImage\u003c/code\u003e\u003c/td\u003e\n\u003ctd align=\"left\"\u003e\u003ccode\u003enormal\u003c/code\u003e\u003c/td\u003e\n\u003ctd align=\"right\"\u003e\u003cem\u003eoptional\u003c/em\u003e\u003c/td\u003e\n\u003ctd align=\"left\"\u003einput auxiliary image containing the shading normal per pixel (1–3 channels, world-space or view-space vectors with arbitrary length, values in [-1, 1])\u003c/td\u003e\n\u003c/tr\u003e\n\u003ctr\u003e\n\u003ctd align=\"left\"\u003e\u003ccode\u003eImage\u003c/code\u003e\u003c/td\u003e\n\u003ctd align=\"left\"\u003e\u003ccode\u003eoutput\u003c/code\u003e\u003c/td\u003e\n\u003ctd align=\"right\"\u003e\u003cem\u003erequired\u003c/em\u003e\u003c/td\u003e\n\u003ctd align=\"left\"\u003eoutput image (1–3 channels); can be one of the input images\u003c/td\u003e\n\u003c/tr\u003e\n\u003ctr\u003e\n\u003ctd align=\"left\"\u003e\u003ccode\u003eBool\u003c/code\u003e\u003c/td\u003e\n\u003ctd align=\"left\"\u003e\u003ccode\u003ehdr\u003c/code\u003e\u003c/td\u003e\n\u003ctd align=\"right\"\u003e\u003ccode\u003efalse\u003c/code\u003e\u003c/td\u003e\n\u003ctd align=\"left\"\u003ethe main input image is HDR\u003c/td\u003e\n\u003c/tr\u003e\n\u003ctr\u003e\n\u003ctd align=\"left\"\u003e\u003ccode\u003eBool\u003c/code\u003e\u003c/td\u003e\n\u003ctd align=\"left\"\u003e\u003ccode\u003esrgb\u003c/code\u003e\u003c/td\u003e\n\u003ctd align=\"right\"\u003e\u003ccode\u003efalse\u003c/code\u003e\u003c/td\u003e\n\u003ctd align=\"left\"\u003ethe main input image is encoded with the sRGB (or 2.2 gamma) curve (LDR only) or is linear; the output will be encoded with the same curve\u003c/td\u003e\n\u003c/tr\u003e\n\u003ctr\u003e\n\u003ctd align=\"left\"\u003e\u003ccode\u003eFloat\u003c/code\u003e\u003c/td\u003e\n\u003ctd align=\"left\"\u003e\u003ccode\u003einputScale\u003c/code\u003e\u003c/td\u003e\n\u003ctd align=\"right\"\u003eNaN\u003c/td\u003e\n\u003ctd align=\"left\"\u003escales values in the main input image before filtering, without scaling the output too, which can be used to map color or auxiliary feature values to the expected range, e.g. for mapping HDR values to physical units (which affects the quality of the output but \u003cem\u003enot\u003c/em\u003e the range of the output values); if set to NaN, the scale is computed implicitly for HDR images or set to 1 otherwise\u003c/td\u003e\n\u003c/tr\u003e\n\u003ctr\u003e\n\u003ctd align=\"left\"\u003e\u003ccode\u003eBool\u003c/code\u003e\u003c/td\u003e\n\u003ctd align=\"left\"\u003e\u003ccode\u003ecleanAux\u003c/code\u003e\u003c/td\u003e\n\u003ctd align=\"right\"\u003e\u003ccode\u003efalse\u003c/code\u003e\u003c/td\u003e\n\u003ctd align=\"left\"\u003ethe auxiliary feature (albedo, normal) images are noise-free; recommended for highest quality but should \u003cem\u003enot\u003c/em\u003e be enabled for noisy auxiliary images to avoid residual noise\u003c/td\u003e\n\u003c/tr\u003e\n\u003ctr\u003e\n\u003ctd align=\"left\"\u003e\u003ccode\u003eInt\u003c/code\u003e\u003c/td\u003e\n\u003ctd align=\"left\"\u003e\u003ccode\u003equality\u003c/code\u003e\u003c/td\u003e\n\u003ctd align=\"right\"\u003ehigh\u003c/td\u003e\n\u003ctd align=\"left\"\u003eimage quality mode as an \u003ccode\u003eOIDNQuality\u003c/code\u003e value\u003c/td\u003e\n\u003c/tr\u003e\n\u003ctr\u003e\n\u003ctd align=\"left\"\u003e\u003ccode\u003eData\u003c/code\u003e\u003c/td\u003e\n\u003ctd align=\"left\"\u003e\u003ccode\u003eweights\u003c/code\u003e\u003c/td\u003e\n\u003ctd align=\"right\"\u003e\u003cem\u003eoptional\u003c/em\u003e\u003c/td\u003e\n\u003ctd align=\"left\"\u003etrained model weights blob\u003c/td\u003e\n\u003c/tr\u003e\n\u003ctr\u003e\n\u003ctd align=\"left\"\u003e\u003ccode\u003eInt\u003c/code\u003e\u003c/td\u003e\n\u003ctd align=\"left\"\u003e\u003ccode\u003emaxMemoryMB\u003c/code\u003e\u003c/td\u003e\n\u003ctd align=\"right\"\u003e-1\u003c/td\u003e\n\u003ctd align=\"left\"\u003eif set to \u0026gt;= 0, a request is made to limit the memory usage below the specified amount in megabytes at the potential cost of slower performance, but actual memory usage may be higher (the target may not be achievable or there may be additional allocations beyond the control of the library); otherwise, memory usage will be limited to an unspecified device-dependent amount; in both cases, filters on the same device share almost all of their allocated memory to minimize total memory usage\u003c/td\u003e\n\u003c/tr\u003e\n\u003ctr\u003e\n\u003ctd align=\"left\"\u003e\u003ccode\u003eInt\u003c/code\u003e\u003c/td\u003e\n\u003ctd align=\"left\"\u003e\u003ccode\u003etileAlignment\u003c/code\u003e\u003c/td\u003e\n\u003ctd align=\"right\"\u003e\u003cem\u003econstant\u003c/em\u003e\u003c/td\u003e\n\u003ctd align=\"left\"\u003ewhen manually denoising in tiles, the tile size and offsets should be multiples of this amount of pixels to avoid artifacts; when denoising HDR images \u003ccode\u003einputScale\u003c/code\u003e \u003cem\u003emust\u003c/em\u003e be set by the user to avoid seam artifacts\u003c/td\u003e\n\u003c/tr\u003e\n\u003ctr\u003e\n\u003ctd align=\"left\"\u003e\u003ccode\u003eInt\u003c/code\u003e\u003c/td\u003e\n\u003ctd align=\"left\"\u003e\u003ccode\u003etileOverlap\u003c/code\u003e\u003c/td\u003e\n\u003ctd align=\"right\"\u003e\u003cem\u003econstant\u003c/em\u003e\u003c/td\u003e\n\u003ctd align=\"left\"\u003ewhen manually denoising in tiles, the tiles should overlap by this amount of pixels\u003c/td\u003e\n\u003c/tr\u003e\n\u003c/tbody\u003e\n\u003c/table\u003e\u003c/markdown-accessiblity-table\u003e\n\u003cp dir=\"auto\"\u003eParameters supported by the \u003ccode\u003eRT\u003c/code\u003e filter.\u003c/p\u003e\n\u003cp dir=\"auto\"\u003eUsing auxiliary feature images like albedo and normal helps preserving\nfine details and textures in the image thus can significantly improve\ndenoising quality. These images should typically contain feature values\nfor the first hit (i.e. the surface which is directly visible) per\npixel. This works well for most surfaces but does not provide any\nbenefits for reflections and objects visible through transparent\nsurfaces (compared to just using the color as input). However, this\nissue can be usually fixed by storing feature values for a subsequent\nhit (i.e. the reflection and/or refraction) instead of the first hit.\nFor example, it usually works well to follow perfect specular (\u003cem\u003edelta\u003c/em\u003e)\npaths and store features for the first diffuse or glossy surface hit\ninstead (e.g. for perfect specular dielectrics and mirrors). This can\ngreatly improve the quality of reflections and transmission. We will\ndescribe this approach in more detail in the following subsections.\u003c/p\u003e\n\u003cp dir=\"auto\"\u003eThe auxiliary feature images should be as noise-free as possible. It is\nnot a strict requirement but too much noise in the feature images may\ncause residual noise in the output. Ideally, these should be completely\nnoise-free. If this is the case, this should be hinted to the filter\nusing the \u003ccode\u003ecleanAux\u003c/code\u003e parameter to ensure the highest possible image\nquality. But this parameter should be used with care: if enabled, any\nnoise present in the auxiliary images will end up in the denoised image\nas well, as residual noise. Thus, \u003ccode\u003ecleanAux\u003c/code\u003e should be enabled only if\nthe auxiliary images are guaranteed to be noise-free.\u003c/p\u003e\n\u003cp dir=\"auto\"\u003eUsually it is difficult to provide clean feature images, and some\nresidual noise might be present in the output even with \u003ccode\u003ecleanAux\u003c/code\u003e being\ndisabled. To eliminate this noise and to even improve the sharpness of\ntexture details, the auxiliary images should be first denoised in a\nprefiltering step, as mentioned earlier. Then, these denoised auxiliary\nimages could be used for denoising the beauty image. Since these are now\nnoise-free, the \u003ccode\u003ecleanAux\u003c/code\u003e parameter should be enabled. See section\n\u003ca href=\"#denoising-with-prefiltering-c11-api\"\u003eDenoising with prefiltering (C++11\nAPI)\u003c/a\u003e for a simple code example.\nPrefiltering makes denoising much more expensive but if there are\nmultiple color AOVs to denoise, the prefiltered auxiliary images can be\nreused for denoising multiple AOVs, amortizing the cost of the\nprefiltering step.\u003c/p\u003e\n\u003cp dir=\"auto\"\u003eThus, for final-frame denoising, where the best possible image quality\nis required, it is recommended to prefilter the auxiliary features if\nthey are noisy and enable the \u003ccode\u003ecleanAux\u003c/code\u003e parameter. Denoising with noisy\nauxiliary features should be reserved for previews and interactive\nrendering.\u003c/p\u003e\n\u003cp dir=\"auto\"\u003eAll auxiliary images should use the same pixel reconstruction filter as\nthe beauty image. Using a properly anti-aliased beauty image but aliased\nalbedo or normal images will likely introduce artifacts around edges.\u003c/p\u003e\n\u003cdiv class=\"markdown-heading\" dir=\"auto\"\u003e\u003ch4 tabindex=\"-1\" class=\"heading-element\" dir=\"auto\"\u003eAlbedos\u003c/h4\u003e\u003ca id=\"user-content-albedos\" class=\"anchor\" aria-label=\"Permalink: Albedos\" href=\"#albedos\"\u003e\u003csvg class=\"octicon octicon-link\" viewBox=\"0 0 16 16\" version=\"1.1\" width=\"16\" height=\"16\" aria-hidden=\"true\"\u003e\u003cpath d=\"m7.775 3.275 1.25-1.25a3.5 3.5 0 1 1 4.95 4.95l-2.5 2.5a3.5 3.5 0 0 1-4.95 0 .751.751 0 0 1 .018-1.042.751.751 0 0 1 1.042-.018 1.998 1.998 0 0 0 2.83 0l2.5-2.5a2.002 2.002 0 0 0-2.83-2.83l-1.25 1.25a.751.751 0 0 1-1.042-.018.751.751 0 0 1-.018-1.042Zm-4.69 9.64a1.998 1.998 0 0 0 2.83 0l1.25-1.25a.751.751 0 0 1 1.042.018.751.751 0 0 1 .018 1.042l-1.25 1.25a3.5 3.5 0 1 1-4.95-4.95l2.5-2.5a3.5 3.5 0 0 1 4.95 0 .751.751 0 0 1-.018 1.042.751.751 0 0 1-1.042.018 1.998 1.998 0 0 0-2.83 0l-2.5 2.5a1.998 1.998 0 0 0 0 2.83Z\"\u003e\u003c/path\u003e\u003c/svg\u003e\u003c/a\u003e\u003c/div\u003e\n\u003cp dir=\"auto\"\u003eThe albedo image is the feature image that usually provides the biggest\nquality improvement. It should contain the approximate color of the\nsurfaces independent of illumination and viewing angle.\u003c/p\u003e\n\u003cp dir=\"auto\"\u003e\u003ca target=\"_blank\" rel=\"noopener noreferrer nofollow\" href=\"https://camo.githubusercontent.com/ad1ffa480911274ec2a463587ab074b3f7c25fd2d82c14adf93d43029859b623/68747470733a2f2f6f70656e696d61676564656e6f6973652e6769746875622e696f2f696d616765732f6d617a64615f66697273746869745f3531327370705f616c6265646f2e6a7067\"\u003e\u003cimg src=\"https://camo.githubusercontent.com/ad1ffa480911274ec2a463587ab074b3f7c25fd2d82c14adf93d43029859b623/68747470733a2f2f6f70656e696d61676564656e6f6973652e6769746875622e696f2f696d616765732f6d617a64615f66697273746869745f3531327370705f616c6265646f2e6a7067\" alt=\"\" data-canonical-src=\"https://openimagedenoise.github.io/images/mazda_firsthit_512spp_albedo.jpg\" style=\"max-width: 100%;\"\u003e\u003c/a\u003e\nExample albedo image obtained using the first hit. Note that the\nalbedos of all transparent surfaces are\n1.\u003c/p\u003e\n\u003cp dir=\"auto\"\u003e\u003ca target=\"_blank\" rel=\"noopener noreferrer nofollow\" href=\"https://camo.githubusercontent.com/9220e70484a2e0b91f6c7ffea2d5326781bf59a1df73cf296df1425a0e9bba38/68747470733a2f2f6f70656e696d61676564656e6f6973652e6769746875622e696f2f696d616765732f6d617a64615f6e6f6e64656c74616869745f3531327370705f616c6265646f2e6a7067\"\u003e\u003cimg src=\"https://camo.githubusercontent.com/9220e70484a2e0b91f6c7ffea2d5326781bf59a1df73cf296df1425a0e9bba38/68747470733a2f2f6f70656e696d61676564656e6f6973652e6769746875622e696f2f696d616765732f6d617a64615f6e6f6e64656c74616869745f3531327370705f616c6265646f2e6a7067\" alt=\"\" data-canonical-src=\"https://openimagedenoise.github.io/images/mazda_nondeltahit_512spp_albedo.jpg\" style=\"max-width: 100%;\"\u003e\u003c/a\u003e\nExample albedo image obtained using the first diffuse or glossy\n(non-delta) hit. Note that the albedos of perfect specular (delta)\ntransparent surfaces are computed as the Fresnel blend of the reflected\nand transmitted\nalbedos.\u003c/p\u003e\n\u003cp dir=\"auto\"\u003eFor simple matte surfaces this means using the diffuse color/texture as\nthe albedo. For other, more complex surfaces it is not always obvious\nwhat is the best way to compute the albedo, but the denoising filter is\nflexible to a certain extent and works well with differently computed\nalbedos. Thus it is not necessary to compute the strict, exact albedo\nvalues but must be always between 0 and 1.\u003c/p\u003e\n\u003cp dir=\"auto\"\u003eFor metallic surfaces the albedo should be either the reflectivity at\nnormal incidence (e.g. from the artist friendly metallic Fresnel model)\nor the average reflectivity; or if these are constant (not textured) or\nunknown, the albedo can be simply 1 as well.\u003c/p\u003e\n\u003cp dir=\"auto\"\u003eThe albedo for dielectric surfaces (e.g. glass) should be either 1 or,\nif the surface is perfect specular (i.e. has a delta BSDF), the Fresnel\nblend of the reflected and transmitted albedos. The latter usually works\nbetter but only if it does not introduce too much noise or the albedo is\nprefiltered. If noise is an issue, we recommend to split the path into a\nreflected and a transmitted path at the first hit, and perhaps fall back\nto an albedo of 1 for subsequent dielectric hits. The reflected albedo\nin itself can be used for mirror-like surfaces as well.\u003c/p\u003e\n\u003cp dir=\"auto\"\u003eThe albedo for layered surfaces can be computed as the weighted sum of\nthe albedos of the individual layers. Non-absorbing clear coat layers\ncan be simply ignored (or the albedo of the perfect specular reflection\ncan be used as well) but absorption should be taken into account.\u003c/p\u003e\n\u003cdiv class=\"markdown-heading\" dir=\"auto\"\u003e\u003ch4 tabindex=\"-1\" class=\"heading-element\" dir=\"auto\"\u003eNormals\u003c/h4\u003e\u003ca id=\"user-content-normals\" class=\"anchor\" aria-label=\"Permalink: Normals\" href=\"#normals\"\u003e\u003csvg class=\"octicon octicon-link\" viewBox=\"0 0 16 16\" version=\"1.1\" width=\"16\" height=\"16\" aria-hidden=\"true\"\u003e\u003cpath d=\"m7.775 3.275 1.25-1.25a3.5 3.5 0 1 1 4.95 4.95l-2.5 2.5a3.5 3.5 0 0 1-4.95 0 .751.751 0 0 1 .018-1.042.751.751 0 0 1 1.042-.018 1.998 1.998 0 0 0 2.83 0l2.5-2.5a2.002 2.002 0 0 0-2.83-2.83l-1.25 1.25a.751.751 0 0 1-1.042-.018.751.751 0 0 1-.018-1.042Zm-4.69 9.64a1.998 1.998 0 0 0 2.83 0l1.25-1.25a.751.751 0 0 1 1.042.018.751.751 0 0 1 .018 1.042l-1.25 1.25a3.5 3.5 0 1 1-4.95-4.95l2.5-2.5a3.5 3.5 0 0 1 4.95 0 .751.751 0 0 1-.018 1.042.751.751 0 0 1-1.042.018 1.998 1.998 0 0 0-2.83 0l-2.5 2.5a1.998 1.998 0 0 0 0 2.83Z\"\u003e\u003c/path\u003e\u003c/svg\u003e\u003c/a\u003e\u003c/div\u003e\n\u003cp dir=\"auto\"\u003eThe normal image should contain the shading normals of the surfaces\neither in world-space or view-space. It is recommended to include normal\nmaps to preserve as much detail as possible.\u003c/p\u003e\n\u003cp dir=\"auto\"\u003e\u003ca target=\"_blank\" rel=\"noopener noreferrer nofollow\" href=\"https://camo.githubusercontent.com/4b24ee03052a87fa8133a93218029f2baf78e9f6dd34c2b8713e43857a875e59/68747470733a2f2f6f70656e696d61676564656e6f6973652e6769746875622e696f2f696d616765732f6d617a64615f66697273746869745f3531327370705f6e6f726d616c2e6a7067\"\u003e\u003cimg src=\"https://camo.githubusercontent.com/4b24ee03052a87fa8133a93218029f2baf78e9f6dd34c2b8713e43857a875e59/68747470733a2f2f6f70656e696d61676564656e6f6973652e6769746875622e696f2f696d616765732f6d617a64615f66697273746869745f3531327370705f6e6f726d616c2e6a7067\" alt=\"\" data-canonical-src=\"https://openimagedenoise.github.io/images/mazda_firsthit_512spp_normal.jpg\" style=\"max-width: 100%;\"\u003e\u003c/a\u003e\nExample normal image obtained using the first hit (the values are\nactually in [−1, 1] but were mapped to [0, 1] for illustration\npurposes).\u003c/p\u003e\n\u003cp dir=\"auto\"\u003e\u003ca target=\"_blank\" rel=\"noopener noreferrer nofollow\" href=\"https://camo.githubusercontent.com/9f6ea3c920a82ff058d2f4e0065c5ac2507bb093f8a92f9bcfb9887159835850/68747470733a2f2f6f70656e696d61676564656e6f6973652e6769746875622e696f2f696d616765732f6d617a64615f6e6f6e64656c74616869745f3531327370705f6e6f726d616c2e6a7067\"\u003e\u003cimg src=\"https://camo.githubusercontent.com/9f6ea3c920a82ff058d2f4e0065c5ac2507bb093f8a92f9bcfb9887159835850/68747470733a2f2f6f70656e696d61676564656e6f6973652e6769746875622e696f2f696d616765732f6d617a64615f6e6f6e64656c74616869745f3531327370705f6e6f726d616c2e6a7067\" alt=\"\" data-canonical-src=\"https://openimagedenoise.github.io/images/mazda_nondeltahit_512spp_normal.jpg\" style=\"max-width: 100%;\"\u003e\u003c/a\u003e\nExample normal image obtained using the first diffuse or glossy\n(non-delta) hit. Note that the normals of perfect specular (delta)\ntransparent surfaces are computed as the Fresnel blend of the reflected\nand transmitted\nnormals.\u003c/p\u003e\n\u003cp dir=\"auto\"\u003eJust like any other input image, the normal image should be anti-aliased\n(i.e. by accumulating the normalized normals per pixel). The final\naccumulated normals do not have to be normalized but must be in the\n[-1, 1] range (i.e. normals mapped to [0, 1] are \u003cem\u003enot\u003c/em\u003e acceptable\nand must be remapped to [−1, 1]).\u003c/p\u003e\n\u003cp dir=\"auto\"\u003eSimilar to the albedo, the normal can be stored for either the first or\na subsequent hit (if the first hit has a perfect specular/delta BSDF).\u003c/p\u003e\n\u003cdiv class=\"markdown-heading\" dir=\"auto\"\u003e\u003ch4 tabindex=\"-1\" class=\"heading-element\" dir=\"auto\"\u003eQuality\u003c/h4\u003e\u003ca id=\"user-content-quality\" class=\"anchor\" aria-label=\"Permalink: Quality\" href=\"#quality\"\u003e\u003csvg class=\"octicon octicon-link\" viewBox=\"0 0 16 16\" version=\"1.1\" width=\"16\" height=\"16\" aria-hidden=\"true\"\u003e\u003cpath d=\"m7.775 3.275 1.25-1.25a3.5 3.5 0 1 1 4.95 4.95l-2.5 2.5a3.5 3.5 0 0 1-4.95 0 .751.751 0 0 1 .018-1.042.751.751 0 0 1 1.042-.018 1.998 1.998 0 0 0 2.83 0l2.5-2.5a2.002 2.002 0 0 0-2.83-2.83l-1.25 1.25a.751.751 0 0 1-1.042-.018.751.751 0 0 1-.018-1.042Zm-4.69 9.64a1.998 1.998 0 0 0 2.83 0l1.25-1.25a.751.751 0 0 1 1.042.018.751.751 0 0 1 .018 1.042l-1.25 1.25a3.5 3.5 0 1 1-4.95-4.95l2.5-2.5a3.5 3.5 0 0 1 4.95 0 .751.751 0 0 1-.018 1.042.751.751 0 0 1-1.042.018 1.998 1.998 0 0 0-2.83 0l-2.5 2.5a1.998 1.998 0 0 0 0 2.83Z\"\u003e\u003c/path\u003e\u003c/svg\u003e\u003c/a\u003e\u003c/div\u003e\n\u003cp dir=\"auto\"\u003eThe filter supports setting an image quality mode, which determines\nwhether to favor quality, performance, or have a balanced solution\nbetween the two. The supported quality modes are listed in the following\ntable.\u003c/p\u003e\n\u003cmarkdown-accessiblity-table\u003e\u003ctable\u003e\n\u003cthead\u003e\n\u003ctr\u003e\n\u003cth align=\"left\"\u003eName\u003c/th\u003e\n\u003cth align=\"left\"\u003eDescription\u003c/th\u003e\n\u003c/tr\u003e\n\u003c/thead\u003e\n\u003ctbody\u003e\n\u003ctr\u003e\n\u003ctd align=\"left\"\u003e\u003ccode\u003eOIDN_QUALITY_DEFAULT\u003c/code\u003e\u003c/td\u003e\n\u003ctd align=\"left\"\u003edefault quality\u003c/td\u003e\n\u003c/tr\u003e\n\u003ctr\u003e\n\u003ctd align=\"left\"\u003e\u003ccode\u003eOIDN_QUALITY_FAST\u003c/code\u003e\u003c/td\u003e\n\u003ctd align=\"left\"\u003ehigh performance (for interactive/real-time preview rendering)\u003c/td\u003e\n\u003c/tr\u003e\n\u003ctr\u003e\n\u003ctd align=\"left\"\u003e\u003ccode\u003eOIDN_QUALITY_BALANCED\u003c/code\u003e\u003c/td\u003e\n\u003ctd align=\"left\"\u003ebalanced quality/performance (for interactive/real-time rendering)\u003c/td\u003e\n\u003c/tr\u003e\n\u003ctr\u003e\n\u003ctd align=\"left\"\u003e\u003ccode\u003eOIDN_QUALITY_HIGH\u003c/code\u003e\u003c/td\u003e\n\u003ctd align=\"left\"\u003ehigh quality (for final-frame rendering); \u003cem\u003edefault\u003c/em\u003e\u003c/td\u003e\n\u003c/tr\u003e\n\u003c/tbody\u003e\n\u003c/table\u003e\u003c/markdown-accessiblity-table\u003e\n\u003cp dir=\"auto\"\u003eSupported image quality modes, i.e., valid constants of type\n\u003ccode\u003eOIDNQuality\u003c/code\u003e.\u003c/p\u003e\n\u003cp dir=\"auto\"\u003eBy default, filtering is performed in \u003cem\u003ehigh\u003c/em\u003e quality mode, which is\nrecommended for final-frame rendering. Using this setting the results\nhave the same high quality regardless of what kind of device (CPU or\nGPU) is used. However, due to significant hardware architecture\ndifferences between devices, there might be small numerical differences\nbetween the produced outputs.\u003c/p\u003e\n\u003cp dir=\"auto\"\u003eThe \u003cem\u003ebalanced\u003c/em\u003e quality mode may provide somewhat lower image quality but\nhigher performance and lower default memory usage, and is thus\nrecommended for interactive and real-time rendering. For even higher\nperformance and lower memory usage, a \u003cem\u003efast\u003c/em\u003e quality mode is also\navailable but has noticeably lower image quality, making it suitable\nmainly for fast previews. Note that in the \u003cem\u003ebalanced\u003c/em\u003e and \u003cem\u003efast\u003c/em\u003e quality\nmodes larger numerical differences should be expected across devices\ncompared to the \u003cem\u003ehigh\u003c/em\u003e quality mode.\u003c/p\u003e\n\u003cp dir=\"auto\"\u003eThe difference in quality and performance between quality modes depends\non the combination of input features, parameters (e.g. \u003ccode\u003ecleanAux\u003c/code\u003e), and\nthe device architecture. In some cases the difference may be small or\neven none.\u003c/p\u003e\n\u003cdiv class=\"markdown-heading\" dir=\"auto\"\u003e\u003ch4 tabindex=\"-1\" class=\"heading-element\" dir=\"auto\"\u003eWeights\u003c/h4\u003e\u003ca id=\"user-content-weights\" class=\"anchor\" aria-label=\"Permalink: Weights\" href=\"#weights\"\u003e\u003csvg class=\"octicon octicon-link\" viewBox=\"0 0 16 16\" version=\"1.1\" width=\"16\" height=\"16\" aria-hidden=\"true\"\u003e\u003cpath d=\"m7.775 3.275 1.25-1.25a3.5 3.5 0 1 1 4.95 4.95l-2.5 2.5a3.5 3.5 0 0 1-4.95 0 .751.751 0 0 1 .018-1.042.751.751 0 0 1 1.042-.018 1.998 1.998 0 0 0 2.83 0l2.5-2.5a2.002 2.002 0 0 0-2.83-2.83l-1.25 1.25a.751.751 0 0 1-1.042-.018.751.751 0 0 1-.018-1.042Zm-4.69 9.64a1.998 1.998 0 0 0 2.83 0l1.25-1.25a.751.751 0 0 1 1.042.018.751.751 0 0 1 .018 1.042l-1.25 1.25a3.5 3.5 0 1 1-4.95-4.95l2.5-2.5a3.5 3.5 0 0 1 4.95 0 .751.751 0 0 1-.018 1.042.751.751 0 0 1-1.042.018 1.998 1.998 0 0 0-2.83 0l-2.5 2.5a1.998 1.998 0 0 0 0 2.83Z\"\u003e\u003c/path\u003e\u003c/svg\u003e\u003c/a\u003e\u003c/div\u003e\n\u003cp dir=\"auto\"\u003eInstead of using the built-in trained models for filtering, it is also\npossible to specify user-trained models at runtime. This can be achieved\nby passing the model \u003cem\u003eweights\u003c/em\u003e blob corresponding to the specified set\nof features and other filter parameters, produced by the included\ntraining tool. See Section \u003ca href=\"#training\"\u003eTraining\u003c/a\u003e for details.\u003c/p\u003e\n\u003cdiv class=\"markdown-heading\" dir=\"auto\"\u003e\u003ch3 tabindex=\"-1\" class=\"heading-element\" dir=\"auto\"\u003eRTLightmap\u003c/h3\u003e\u003ca id=\"user-content-rtlightmap\" class=\"anchor\" aria-label=\"Permalink: RTLightmap\" href=\"#rtlightmap\"\u003e\u003csvg class=\"octicon octicon-link\" viewBox=\"0 0 16 16\" version=\"1.1\" width=\"16\" height=\"16\" aria-hidden=\"true\"\u003e\u003cpath d=\"m7.775 3.275 1.25-1.25a3.5 3.5 0 1 1 4.95 4.95l-2.5 2.5a3.5 3.5 0 0 1-4.95 0 .751.751 0 0 1 .018-1.042.751.751 0 0 1 1.042-.018 1.998 1.998 0 0 0 2.83 0l2.5-2.5a2.002 2.002 0 0 0-2.83-2.83l-1.25 1.25a.751.751 0 0 1-1.042-.018.751.751 0 0 1-.018-1.042Zm-4.69 9.64a1.998 1.998 0 0 0 2.83 0l1.25-1.25a.751.751 0 0 1 1.042.018.751.751 0 0 1 .018 1.042l-1.25 1.25a3.5 3.5 0 1 1-4.95-4.95l2.5-2.5a3.5 3.5 0 0 1 4.95 0 .751.751 0 0 1-.018 1.042.751.751 0 0 1-1.042.018 1.998 1.998 0 0 0-2.83 0l-2.5 2.5a1.998 1.998 0 0 0 0 2.83Z\"\u003e\u003c/path\u003e\u003c/svg\u003e\u003c/a\u003e\u003c/div\u003e\n\u003cp dir=\"auto\"\u003eThe \u003ccode\u003eRTLightmap\u003c/code\u003e filter is a variant of the \u003ccode\u003eRT\u003c/code\u003e filter optimized for\ndenoising HDR and normalized directional (e.g. spherical harmonics)\nlightmaps. It does not support LDR images.\u003c/p\u003e\n\u003cp dir=\"auto\"\u003eThe filter can be created by passing \u003ccode\u003e\"RTLightmap\"\u003c/code\u003e to the\n\u003ccode\u003eoidnNewFilter\u003c/code\u003e function as the filter type. The filter supports the\nfollowing parameters:\u003c/p\u003e\n\u003cmarkdown-accessiblity-table\u003e\u003ctable\u003e\n\u003cthead\u003e\n\u003ctr\u003e\n\u003cth align=\"left\"\u003eType\u003c/th\u003e\n\u003cth align=\"left\"\u003eName\u003c/th\u003e\n\u003cth align=\"right\"\u003eDefault\u003c/th\u003e\n\u003cth align=\"left\"\u003eDescription\u003c/th\u003e\n\u003c/tr\u003e\n\u003c/thead\u003e\n\u003ctbody\u003e\n\u003ctr\u003e\n\u003ctd align=\"left\"\u003e\u003ccode\u003eImage\u003c/code\u003e\u003c/td\u003e\n\u003ctd align=\"left\"\u003e\u003ccode\u003ecolor\u003c/code\u003e\u003c/td\u003e\n\u003ctd align=\"right\"\u003e\u003cem\u003erequired\u003c/em\u003e\u003c/td\u003e\n\u003ctd align=\"left\"\u003einput beauty image (1–3 channels, HDR values in [0, +∞), interpreted such that, after scaling with the \u003ccode\u003einputScale\u003c/code\u003e parameter, a value of 1 corresponds to a luminance level of 100 cd/m²; directional values in [-1, 1])\u003c/td\u003e\n\u003c/tr\u003e\n\u003ctr\u003e\n\u003ctd align=\"left\"\u003e\u003ccode\u003eImage\u003c/code\u003e\u003c/td\u003e\n\u003ctd align=\"left\"\u003e\u003ccode\u003eoutput\u003c/code\u003e\u003c/td\u003e\n\u003ctd align=\"right\"\u003e\u003cem\u003erequired\u003c/em\u003e\u003c/td\u003e\n\u003ctd align=\"left\"\u003eoutput image (1–3 channels); can be one of the input images\u003c/td\u003e\n\u003c/tr\u003e\n\u003ctr\u003e\n\u003ctd align=\"left\"\u003e\u003ccode\u003eBool\u003c/code\u003e\u003c/td\u003e\n\u003ctd align=\"left\"\u003e\u003ccode\u003edirectional\u003c/code\u003e\u003c/td\u003e\n\u003ctd align=\"right\"\u003e\u003ccode\u003efalse\u003c/code\u003e\u003c/td\u003e\n\u003ctd align=\"left\"\u003ewhether the input contains normalized coefficients (in [-1, 1]) of a directional lightmap (e.g. normalized L1 or higher spherical harmonics band with the L0 band divided out); if the range of the coefficients is different from [-1, 1], the \u003ccode\u003einputScale\u003c/code\u003e parameter can be used to adjust the range without changing the stored values\u003c/td\u003e\n\u003c/tr\u003e\n\u003ctr\u003e\n\u003ctd align=\"left\"\u003e\u003ccode\u003eFloat\u003c/code\u003e\u003c/td\u003e\n\u003ctd align=\"left\"\u003e\u003ccode\u003einputScale\u003c/code\u003e\u003c/td\u003e\n\u003ctd align=\"right\"\u003eNaN\u003c/td\u003e\n\u003ctd align=\"left\"\u003escales input color values before filtering, without scaling the output too, which can be used to map color values to the expected range, e.g. for mapping HDR values to physical units (which affects the quality of the output but \u003cem\u003enot\u003c/em\u003e the range of the output values); if set to NaN, the scale is computed implicitly for HDR images or set to 1 otherwise\u003c/td\u003e\n\u003c/tr\u003e\n\u003ctr\u003e\n\u003ctd align=\"left\"\u003e\u003ccode\u003eInt\u003c/code\u003e\u003c/td\u003e\n\u003ctd align=\"left\"\u003e\u003ccode\u003equality\u003c/code\u003e\u003c/td\u003e\n\u003ctd align=\"right\"\u003ehigh\u003c/td\u003e\n\u003ctd align=\"left\"\u003eimage quality mode as an \u003ccode\u003eOIDNQuality\u003c/code\u003e value\u003c/td\u003e\n\u003c/tr\u003e\n\u003ctr\u003e\n\u003ctd align=\"left\"\u003e\u003ccode\u003eData\u003c/code\u003e\u003c/td\u003e\n\u003ctd align=\"left\"\u003e\u003ccode\u003eweights\u003c/code\u003e\u003c/td\u003e\n\u003ctd align=\"right\"\u003e\u003cem\u003eoptional\u003c/em\u003e\u003c/td\u003e\n\u003ctd align=\"left\"\u003etrained model weights blob\u003c/td\u003e\n\u003c/tr\u003e\n\u003ctr\u003e\n\u003ctd align=\"left\"\u003e\u003ccode\u003eInt\u003c/code\u003e\u003c/td\u003e\n\u003ctd align=\"left\"\u003e\u003ccode\u003emaxMemoryMB\u003c/code\u003e\u003c/td\u003e\n\u003ctd align=\"right\"\u003e-1\u003c/td\u003e\n\u003ctd align=\"left\"\u003eif set to \u0026gt;= 0, a request is made to limit the memory usage below the specified amount in megabytes at the potential cost of slower performance, but actual memory usage may be higher (the target may not be achievable or there may be additional allocations beyond the control of the library); otherwise, memory usage will be limited to an unspecified device-dependent amount; in both cases, filters on the same device share almost all of their allocated memory to minimize total memory usage\u003c/td\u003e\n\u003c/tr\u003e\n\u003ctr\u003e\n\u003ctd align=\"left\"\u003e\u003ccode\u003eInt\u003c/code\u003e\u003c/td\u003e\n\u003ctd align=\"left\"\u003e\u003ccode\u003etileAlignment\u003c/code\u003e\u003c/td\u003e\n\u003ctd align=\"right\"\u003e\u003cem\u003econstant\u003c/em\u003e\u003c/td\u003e\n\u003ctd align=\"left\"\u003ewhen manually denoising in tiles, the tile size and offsets should be multiples of this amount of pixels to avoid artifacts; when denoising HDR images \u003ccode\u003einputScale\u003c/code\u003e \u003cem\u003emust\u003c/em\u003e be set by the user to avoid seam artifacts\u003c/td\u003e\n\u003c/tr\u003e\n\u003ctr\u003e\n\u003ctd align=\"left\"\u003e\u003ccode\u003eInt\u003c/code\u003e\u003c/td\u003e\n\u003ctd align=\"left\"\u003e\u003ccode\u003etileOverlap\u003c/code\u003e\u003c/td\u003e\n\u003ctd align=\"right\"\u003e\u003cem\u003econstant\u003c/em\u003e\u003c/td\u003e\n\u003ctd align=\"left\"\u003ewhen manually denoising in tiles, the tiles should overlap by this amount of pixels\u003c/td\u003e\n\u003c/tr\u003e\n\u003c/tbody\u003e\n\u003c/table\u003e\u003c/markdown-accessiblity-table\u003e\n\u003cp dir=\"auto\"\u003eParameters supported by the \u003ccode\u003eRTLightmap\u003c/code\u003e filter.\u003c/p\u003e\n\u003cdiv class=\"markdown-heading\" dir=\"auto\"\u003e\u003ch1 tabindex=\"-1\" class=\"heading-element\" dir=\"auto\"\u003eExamples\u003c/h1\u003e\u003ca id=\"user-content-examples-1\" class=\"anchor\" aria-label=\"Permalink: Examples\" href=\"#examples-1\"\u003e\u003csvg class=\"octicon octicon-link\" viewBox=\"0 0 16 16\" version=\"1.1\" width=\"16\" height=\"16\" aria-hidden=\"true\"\u003e\u003cpath d=\"m7.775 3.275 1.25-1.25a3.5 3.5 0 1 1 4.95 4.95l-2.5 2.5a3.5 3.5 0 0 1-4.95 0 .751.751 0 0 1 .018-1.042.751.751 0 0 1 1.042-.018 1.998 1.998 0 0 0 2.83 0l2.5-2.5a2.002 2.002 0 0 0-2.83-2.83l-1.25 1.25a.751.751 0 0 1-1.042-.018.751.751 0 0 1-.018-1.042Zm-4.69 9.64a1.998 1.998 0 0 0 2.83 0l1.25-1.25a.751.751 0 0 1 1.042.018.751.751 0 0 1 .018 1.042l-1.25 1.25a3.5 3.5 0 1 1-4.95-4.95l2.5-2.5a3.5 3.5 0 0 1 4.95 0 .751.751 0 0 1-.018 1.042.751.751 0 0 1-1.042.018 1.998 1.998 0 0 0-2.83 0l-2.5 2.5a1.998 1.998 0 0 0 0 2.83Z\"\u003e\u003c/path\u003e\u003c/svg\u003e\u003c/a\u003e\u003c/div\u003e\n\u003cp dir=\"auto\"\u003eIntel Open Image Denoise ships with a couple of simple example\napplications.\u003c/p\u003e\n\u003cdiv class=\"markdown-heading\" dir=\"auto\"\u003e\u003ch2 tabindex=\"-1\" class=\"heading-element\" dir=\"auto\"\u003eoidnDenoise\u003c/h2\u003e\u003ca id=\"user-content-oidndenoise\" class=\"anchor\" aria-label=\"Permalink: oidnDenoise\" href=\"#oidndenoise\"\u003e\u003csvg class=\"octicon octicon-link\" viewBox=\"0 0 16 16\" version=\"1.1\" width=\"16\" height=\"16\" aria-hidden=\"true\"\u003e\u003cpath d=\"m7.775 3.275 1.25-1.25a3.5 3.5 0 1 1 4.95 4.95l-2.5 2.5a3.5 3.5 0 0 1-4.95 0 .751.751 0 0 1 .018-1.042.751.751 0 0 1 1.042-.018 1.998 1.998 0 0 0 2.83 0l2.5-2.5a2.002 2.002 0 0 0-2.83-2.83l-1.25 1.25a.751.751 0 0 1-1.042-.018.751.751 0 0 1-.018-1.042Zm-4.69 9.64a1.998 1.998 0 0 0 2.83 0l1.25-1.25a.751.751 0 0 1 1.042.018.751.751 0 0 1 .018 1.042l-1.25 1.25a3.5 3.5 0 1 1-4.95-4.95l2.5-2.5a3.5 3.5 0 0 1 4.95 0 .751.751 0 0 1-.018 1.042.751.751 0 0 1-1.042.018 1.998 1.998 0 0 0-2.83 0l-2.5 2.5a1.998 1.998 0 0 0 0 2.83Z\"\u003e\u003c/path\u003e\u003c/svg\u003e\u003c/a\u003e\u003c/div\u003e\n\u003cp dir=\"auto\"\u003e\u003ccode\u003eoidnDenoise\u003c/code\u003e is a minimal working example demonstrating how to use\nIntel Open Image Denoise, which can be found at \u003ccode\u003eapps/oidnDenoise.cpp\u003c/code\u003e.\nIt uses the C++11 convenience wrappers of the C99 API.\u003c/p\u003e\n\u003cp dir=\"auto\"\u003eThis example is a simple command-line application that denoises the\nprovided image, which can optionally have auxiliary feature images as\nwell (e.g. albedo and normal). By default the images must be stored in\nthe \u003ca href=\"http://www.pauldebevec.com/Research/HDR/PFM/\" rel=\"nofollow\"\u003ePortable FloatMap\u003c/a\u003e\n(PFM) format, and the color values must be encoded in little-endian\nformat. To enable other image formats (e.g. OpenEXR, PNG) as well, the\nproject has to be rebuilt with OpenImageIO support enabled.\u003c/p\u003e\n\u003cp dir=\"auto\"\u003eRunning \u003ccode\u003eoidnDenoise\u003c/code\u003e without any arguments or the \u003ccode\u003e-h\u003c/code\u003e argument will\nbring up a list of command-line options.\u003c/p\u003e\n\u003cdiv class=\"markdown-heading\" dir=\"auto\"\u003e\u003ch2 tabindex=\"-1\" class=\"heading-element\" dir=\"auto\"\u003eoidnBenchmark\u003c/h2\u003e\u003ca id=\"user-content-oidnbenchmark\" class=\"anchor\" aria-label=\"Permalink: oidnBenchmark\" href=\"#oidnbenchmark\"\u003e\u003csvg class=\"octicon octicon-link\" viewBox=\"0 0 16 16\" version=\"1.1\" width=\"16\" height=\"16\" aria-hidden=\"true\"\u003e\u003cpath d=\"m7.775 3.275 1.25-1.25a3.5 3.5 0 1 1 4.95 4.95l-2.5 2.5a3.5 3.5 0 0 1-4.95 0 .751.751 0 0 1 .018-1.042.751.751 0 0 1 1.042-.018 1.998 1.998 0 0 0 2.83 0l2.5-2.5a2.002 2.002 0 0 0-2.83-2.83l-1.25 1.25a.751.751 0 0 1-1.042-.018.751.751 0 0 1-.018-1.042Zm-4.69 9.64a1.998 1.998 0 0 0 2.83 0l1.25-1.25a.751.751 0 0 1 1.042.018.751.751 0 0 1 .018 1.042l-1.25 1.25a3.5 3.5 0 1 1-4.95-4.95l2.5-2.5a3.5 3.5 0 0 1 4.95 0 .751.751 0 0 1-.018 1.042.751.751 0 0 1-1.042.018 1.998 1.998 0 0 0-2.83 0l-2.5 2.5a1.998 1.998 0 0 0 0 2.83Z\"\u003e\u003c/path\u003e\u003c/svg\u003e\u003c/a\u003e\u003c/div\u003e\n\u003cp dir=\"auto\"\u003e\u003ccode\u003eoidnBenchmark\u003c/code\u003e is a basic command-line benchmarking application for\nmeasuring denoising speed, which can be found at\n\u003ccode\u003eapps/oidnBenchmark.cpp\u003c/code\u003e.\u003c/p\u003e\n\u003cp dir=\"auto\"\u003eRunning \u003ccode\u003eoidnBenchmark\u003c/code\u003e with the \u003ccode\u003e-h\u003c/code\u003e argument will bring up a list of\ncommand-line options.\u003c/p\u003e\n\u003cdiv class=\"markdown-heading\" dir=\"auto\"\u003e\u003ch1 tabindex=\"-1\" class=\"heading-element\" dir=\"auto\"\u003eTraining\u003c/h1\u003e\u003ca id=\"user-content-training\" class=\"anchor\" aria-label=\"Permalink: Training\" href=\"#training\"\u003e\u003csvg class=\"octicon octicon-link\" viewBox=\"0 0 16 16\" version=\"1.1\" width=\"16\" height=\"16\" aria-hidden=\"true\"\u003e\u003cpath d=\"m7.775 3.275 1.25-1.25a3.5 3.5 0 1 1 4.95 4.95l-2.5 2.5a3.5 3.5 0 0 1-4.95 0 .751.751 0 0 1 .018-1.042.751.751 0 0 1 1.042-.018 1.998 1.998 0 0 0 2.83 0l2.5-2.5a2.002 2.002 0 0 0-2.83-2.83l-1.25 1.25a.751.751 0 0 1-1.042-.018.751.751 0 0 1-.018-1.042Zm-4.69 9.64a1.998 1.998 0 0 0 2.83 0l1.25-1.25a.751.751 0 0 1 1.042.018.751.751 0 0 1 .018 1.042l-1.25 1.25a3.5 3.5 0 1 1-4.95-4.95l2.5-2.5a3.5 3.5 0 0 1 4.95 0 .751.751 0 0 1-.018 1.042.751.751 0 0 1-1.042.018 1.998 1.998 0 0 0-2.83 0l-2.5 2.5a1.998 1.998 0 0 0 0 2.83Z\"\u003e\u003c/path\u003e\u003c/svg\u003e\u003c/a\u003e\u003c/div\u003e\n\u003cp dir=\"auto\"\u003eThe Intel Open Image Denoise source distribution includes a Python-based\nneural network training toolkit (located in the \u003ccode\u003etraining\u003c/code\u003e directory),\nwhich can be used to train the denoising filter models with image\ndatasets provided by the user. This is an advanced feature of the\nlibrary which usage requires some background knowledge of machine\nlearning and basic familiarity with deep learning frameworks and\ntoolkits (e.g. PyTorch or TensorFlow, TensorBoard).\u003c/p\u003e\n\u003cp dir=\"auto\"\u003eThe training toolkit consists of the following command-line scripts:\u003c/p\u003e\n\u003cul dir=\"auto\"\u003e\n\u003cli\u003e\n\u003cp dir=\"auto\"\u003e\u003ccode\u003epreprocess.py\u003c/code\u003e: Preprocesses training and validation datasets.\u003c/p\u003e\n\u003c/li\u003e\n\u003cli\u003e\n\u003cp dir=\"auto\"\u003e\u003ccode\u003etrain.py\u003c/code\u003e: Trains a model using preprocessed datasets.\u003c/p\u003e\n\u003c/li\u003e\n\u003cli\u003e\n\u003cp dir=\"auto\"\u003e\u003ccode\u003einfer.py\u003c/code\u003e: Performs inference on a dataset using the specified\ntraining result.\u003c/p\u003e\n\u003c/li\u003e\n\u003cli\u003e\n\u003cp dir=\"auto\"\u003e\u003ccode\u003eexport.py\u003c/code\u003e: Exports a training result to the runtime model weights\nformat.\u003c/p\u003e\n\u003c/li\u003e\n\u003cli\u003e\n\u003cp dir=\"auto\"\u003e\u003ccode\u003efind_lr.py\u003c/code\u003e: Tool for finding the optimal minimum and maximum\nlearning rates.\u003c/p\u003e\n\u003c/li\u003e\n\u003cli\u003e\n\u003cp dir=\"auto\"\u003e\u003ccode\u003evisualize.py\u003c/code\u003e: Invokes TensorBoard for visualizing statistics of a\ntraining result.\u003c/p\u003e\n\u003c/li\u003e\n\u003cli\u003e\n\u003cp dir=\"auto\"\u003e\u003ccode\u003esplit_exr.py\u003c/code\u003e: Splits a multi-channel EXR image into multiple\nfeature images.\u003c/p\u003e\n\u003c/li\u003e\n\u003cli\u003e\n\u003cp dir=\"auto\"\u003e\u003ccode\u003econvert_image.py\u003c/code\u003e: Converts a feature image to a different image\nformat.\u003c/p\u003e\n\u003c/li\u003e\n\u003cli\u003e\n\u003cp dir=\"auto\"\u003e\u003ccode\u003ecompare_image.py\u003c/code\u003e: Compares two feature images using the specified\nquality metrics.\u003c/p\u003e\n\u003c/li\u003e\n\u003c/ul\u003e\n\u003cdiv class=\"markdown-heading\" dir=\"auto\"\u003e\u003ch2 tabindex=\"-1\" class=\"heading-element\" dir=\"auto\"\u003ePrerequisites\u003c/h2\u003e\u003ca id=\"user-content-prerequisites-1\" class=\"anchor\" aria-label=\"Permalink: Prerequisites\" href=\"#prerequisites-1\"\u003e\u003csvg class=\"octicon octicon-link\" viewBox=\"0 0 16 16\" version=\"1.1\" width=\"16\" height=\"16\" aria-hidden=\"true\"\u003e\u003cpath d=\"m7.775 3.275 1.25-1.25a3.5 3.5 0 1 1 4.95 4.95l-2.5 2.5a3.5 3.5 0 0 1-4.95 0 .751.751 0 0 1 .018-1.042.751.751 0 0 1 1.042-.018 1.998 1.998 0 0 0 2.83 0l2.5-2.5a2.002 2.002 0 0 0-2.83-2.83l-1.25 1.25a.751.751 0 0 1-1.042-.018.751.751 0 0 1-.018-1.042Zm-4.69 9.64a1.998 1.998 0 0 0 2.83 0l1.25-1.25a.751.751 0 0 1 1.042.018.751.751 0 0 1 .018 1.042l-1.25 1.25a3.5 3.5 0 1 1-4.95-4.95l2.5-2.5a3.5 3.5 0 0 1 4.95 0 .751.751 0 0 1-.018 1.042.751.751 0 0 1-1.042.018 1.998 1.998 0 0 0-2.83 0l-2.5 2.5a1.998 1.998 0 0 0 0 2.83Z\"\u003e\u003c/path\u003e\u003c/svg\u003e\u003c/a\u003e\u003c/div\u003e\n\u003cp dir=\"auto\"\u003eBefore you can run the training toolkit you need the following\nprerequisites:\u003c/p\u003e\n\u003cul dir=\"auto\"\u003e\n\u003cli\u003e\n\u003cp dir=\"auto\"\u003eLinux (other operating systems are currently not supported)\u003c/p\u003e\n\u003c/li\u003e\n\u003cli\u003e\n\u003cp dir=\"auto\"\u003ePython 3.7 or later\u003c/p\u003e\n\u003c/li\u003e\n\u003cli\u003e\n\u003cp dir=\"auto\"\u003e\u003ca href=\"https://pytorch.org/\" rel=\"nofollow\"\u003ePyTorch\u003c/a\u003e 2.4 or later\u003c/p\u003e\n\u003c/li\u003e\n\u003cli\u003e\n\u003cp dir=\"auto\"\u003e\u003ca href=\"https://numpy.org/\" rel=\"nofollow\"\u003eNumPy\u003c/a\u003e 1.19 or later\u003c/p\u003e\n\u003c/li\u003e\n\u003cli\u003e\n\u003cp dir=\"auto\"\u003e\u003ca href=\"http://openimageio.org/\" rel=\"nofollow\"\u003eOpenImageIO\u003c/a\u003e 2.1 or later\u003c/p\u003e\n\u003c/li\u003e\n\u003cli\u003e\n\u003cp dir=\"auto\"\u003e\u003ca href=\"https://www.tensorflow.org/tensorboard\" rel=\"nofollow\"\u003eTensorBoard\u003c/a\u003e 2.4 or later\u003c/p\u003e\n\u003c/li\u003e\n\u003c/ul\u003e\n\u003cdiv class=\"markdown-heading\" dir=\"auto\"\u003e\u003ch2 tabindex=\"-1\" class=\"heading-element\" dir=\"auto\"\u003eDevices\u003c/h2\u003e\u003ca id=\"user-content-devices-1\" class=\"anchor\" aria-label=\"Permalink: Devices\" href=\"#devices-1\"\u003e\u003csvg class=\"octicon octicon-link\" viewBox=\"0 0 16 16\" version=\"1.1\" width=\"16\" height=\"16\" aria-hidden=\"true\"\u003e\u003cpath d=\"m7.775 3.275 1.25-1.25a3.5 3.5 0 1 1 4.95 4.95l-2.5 2.5a3.5 3.5 0 0 1-4.95 0 .751.751 0 0 1 .018-1.042.751.751 0 0 1 1.042-.018 1.998 1.998 0 0 0 2.83 0l2.5-2.5a2.002 2.002 0 0 0-2.83-2.83l-1.25 1.25a.751.751 0 0 1-1.042-.018.751.751 0 0 1-.018-1.042Zm-4.69 9.64a1.998 1.998 0 0 0 2.83 0l1.25-1.25a.751.751 0 0 1 1.042.018.751.751 0 0 1 .018 1.042l-1.25 1.25a3.5 3.5 0 1 1-4.95-4.95l2.5-2.5a3.5 3.5 0 0 1 4.95 0 .751.751 0 0 1-.018 1.042.751.751 0 0 1-1.042.018 1.998 1.998 0 0 0-2.83 0l-2.5 2.5a1.998 1.998 0 0 0 0 2.83Z\"\u003e\u003c/path\u003e\u003c/svg\u003e\u003c/a\u003e\u003c/div\u003e\n\u003cp dir=\"auto\"\u003eMost scripts in the training toolkit support selecting what kind of\ndevice (e.g. CPU, GPU) to use for the computations (\u003ccode\u003e--device\u003c/code\u003e or \u003ccode\u003e-d\u003c/code\u003e\noption). If multiple devices of the same kind are available\n(e.g. multiple GPUs), the user can specify which one of these to use\n(\u003ccode\u003e--device_id\u003c/code\u003e or \u003ccode\u003e-k\u003c/code\u003e option). Additionally, some scripts, like\n\u003ccode\u003etrain.py\u003c/code\u003e, support data-parallel execution on multiple devices for\nfaster performance (\u003ccode\u003e--num_devices\u003c/code\u003e or \u003ccode\u003e-n\u003c/code\u003e option).\u003c/p\u003e\n\u003cdiv class=\"markdown-heading\" dir=\"auto\"\u003e\u003ch2 tabindex=\"-1\" class=\"heading-element\" dir=\"auto\"\u003eDatasets\u003c/h2\u003e\u003ca id=\"user-content-datasets\" class=\"anchor\" aria-label=\"Permalink: Datasets\" href=\"#datasets\"\u003e\u003csvg class=\"octicon octicon-link\" viewBox=\"0 0 16 16\" version=\"1.1\" width=\"16\" height=\"16\" aria-hidden=\"true\"\u003e\u003cpath d=\"m7.775 3.275 1.25-1.25a3.5 3.5 0 1 1 4.95 4.95l-2.5 2.5a3.5 3.5 0 0 1-4.95 0 .751.751 0 0 1 .018-1.042.751.751 0 0 1 1.042-.018 1.998 1.998 0 0 0 2.83 0l2.5-2.5a2.002 2.002 0 0 0-2.83-2.83l-1.25 1.25a.751.751 0 0 1-1.042-.018.751.751 0 0 1-.018-1.042Zm-4.69 9.64a1.998 1.998 0 0 0 2.83 0l1.25-1.25a.751.751 0 0 1 1.042.018.751.751 0 0 1 .018 1.042l-1.25 1.25a3.5 3.5 0 1 1-4.95-4.95l2.5-2.5a3.5 3.5 0 0 1 4.95 0 .751.751 0 0 1-.018 1.042.751.751 0 0 1-1.042.018 1.998 1.998 0 0 0-2.83 0l-2.5 2.5a1.998 1.998 0 0 0 0 2.83Z\"\u003e\u003c/path\u003e\u003c/svg\u003e\u003c/a\u003e\u003c/div\u003e\n\u003cp dir=\"auto\"\u003eA dataset should consist of a collection of noisy and corresponding\nnoise-free reference images. It is possible to have more than one noisy\nversion of the same image in the dataset, e.g. rendered at different\nsamples per pixel and/or using different seeds.\u003c/p\u003e\n\u003cp dir=\"auto\"\u003eThe training toolkit expects to have all datasets (e.g. training,\nvalidation) in the same parent directory (e.g. \u003ccode\u003edata\u003c/code\u003e). Each dataset is\nstored in its own subdirectory (e.g. \u003ccode\u003etrain\u003c/code\u003e, \u003ccode\u003evalid\u003c/code\u003e), which can have\nan arbitrary name.\u003c/p\u003e\n\u003cp dir=\"auto\"\u003eThe images must be stored in \u003ca href=\"https://www.openexr.com/\" rel=\"nofollow\"\u003eOpenEXR\u003c/a\u003e format\n(\u003ccode\u003e.exr\u003c/code\u003e files), and the filenames must have a specific format but the\nfiles can be stored in an arbitrary directory structure inside the\ndataset directory. The only restriction is that all versions of an image\n(noisy images and the reference image) must be located in the same\nsubdirectory. Each feature of an image (e.g. color, albedo) must be\nstored in a separate image file, i.e. multi-channel EXR image files are\nnot supported. If you have multi-channel EXRs, you can split them into\nseparate images per feature using the included \u003ccode\u003esplit_exr.py\u003c/code\u003e tool.\u003c/p\u003e\n\u003cp dir=\"auto\"\u003eAn image filename must consist of a base name, a suffix with the number\nof samples per pixel or whether it is the reference image\n(e.g. \u003ccode\u003e_0128spp\u003c/code\u003e, \u003ccode\u003e_ref\u003c/code\u003e), the feature type extension (e.g. \u003ccode\u003e.hdr\u003c/code\u003e,\n\u003ccode\u003e.alb\u003c/code\u003e), and the image format extension (\u003ccode\u003e.exr\u003c/code\u003e). The exact filename\nformat as a regular expression is the following:\u003c/p\u003e\n\u003cdiv class=\"highlight highlight-source-regexp notranslate position-relative overflow-auto\" dir=\"auto\" data-snippet-clipboard-copy-content=\".+_([0-9]+(spp)?|ref|reference|gt|target)\\.(hdr|ldr|sh1[xyz]|alb|nrm)\\.exr\"\u003e\u003cpre\u003e.\u003cspan class=\"pl-c1\"\u003e+\u003c/span\u003e\u003cspan class=\"pl-s\"\u003e_\u003c/span\u003e\u003cspan class=\"pl-kos\"\u003e(\u003c/span\u003e\u003cspan class=\"pl-kos\"\u003e[\u003c/span\u003e\u003cspan class=\"pl-c1\"\u003e0\u003c/span\u003e\u003cspan class=\"pl-c1\"\u003e-\u003c/span\u003e\u003cspan class=\"pl-c1\"\u003e9\u003c/span\u003e\u003cspan class=\"pl-kos\"\u003e]\u003c/span\u003e\u003cspan class=\"pl-c1\"\u003e+\u003c/span\u003e\u003cspan class=\"pl-kos\"\u003e(\u003c/span\u003e\u003cspan class=\"pl-s\"\u003es\u003c/span\u003e\u003cspan class=\"pl-s\"\u003ep\u003c/span\u003e\u003cspan class=\"pl-s\"\u003ep\u003c/span\u003e\u003cspan class=\"pl-kos\"\u003e)\u003c/span\u003e\u003cspan class=\"pl-c1\"\u003e?\u003c/span\u003e\u003cspan class=\"pl-c1\"\u003e|\u003c/span\u003e\u003cspan class=\"pl-s\"\u003er\u003c/span\u003e\u003cspan class=\"pl-s\"\u003ee\u003c/span\u003e\u003cspan class=\"pl-s\"\u003ef\u003c/span\u003e\u003cspan class=\"pl-c1\"\u003e|\u003c/span\u003e\u003cspan class=\"pl-s\"\u003er\u003c/span\u003e\u003cspan class=\"pl-s\"\u003ee\u003c/span\u003e\u003cspan class=\"pl-s\"\u003ef\u003c/span\u003e\u003cspan class=\"pl-s\"\u003ee\u003c/span\u003e\u003cspan class=\"pl-s\"\u003er\u003c/span\u003e\u003cspan class=\"pl-s\"\u003ee\u003c/span\u003e\u003cspan class=\"pl-s\"\u003en\u003c/span\u003e\u003cspan class=\"pl-s\"\u003ec\u003c/span\u003e\u003cspan class=\"pl-s\"\u003ee\u003c/span\u003e\u003cspan class=\"pl-c1\"\u003e|\u003c/span\u003e\u003cspan class=\"pl-s\"\u003eg\u003c/span\u003e\u003cspan class=\"pl-s\"\u003et\u003c/span\u003e\u003cspan class=\"pl-c1\"\u003e|\u003c/span\u003e\u003cspan class=\"pl-s\"\u003et\u003c/span\u003e\u003cspan class=\"pl-s\"\u003ea\u003c/span\u003e\u003cspan class=\"pl-s\"\u003er\u003c/span\u003e\u003cspan class=\"pl-s\"\u003eg\u003c/span\u003e\u003cspan class=\"pl-s\"\u003ee\u003c/span\u003e\u003cspan class=\"pl-s\"\u003et\u003c/span\u003e\u003cspan class=\"pl-kos\"\u003e)\u003c/span\u003e\u003cspan class=\"pl-cce\"\u003e\\.\u003c/span\u003e\u003cspan class=\"pl-kos\"\u003e(\u003c/span\u003e\u003cspan class=\"pl-s\"\u003eh\u003c/span\u003e\u003cspan class=\"pl-s\"\u003ed\u003c/span\u003e\u003cspan class=\"pl-s\"\u003er\u003c/span\u003e\u003cspan class=\"pl-c1\"\u003e|\u003c/span\u003e\u003cspan class=\"pl-s\"\u003el\u003c/span\u003e\u003cspan class=\"pl-s\"\u003ed\u003c/span\u003e\u003cspan class=\"pl-s\"\u003er\u003c/span\u003e\u003cspan class=\"pl-c1\"\u003e|\u003c/span\u003e\u003cspan class=\"pl-s\"\u003es\u003c/span\u003e\u003cspan class=\"pl-s\"\u003eh\u003c/span\u003e\u003cspan class=\"pl-s\"\u003e1\u003c/span\u003e\u003cspan class=\"pl-kos\"\u003e[\u003c/span\u003e\u003cspan class=\"pl-c1\"\u003ex\u003c/span\u003e\u003cspan class=\"pl-c1\"\u003ey\u003c/span\u003e\u003cspan class=\"pl-c1\"\u003ez\u003c/span\u003e\u003cspan class=\"pl-kos\"\u003e]\u003c/span\u003e\u003cspan class=\"pl-c1\"\u003e|\u003c/span\u003e\u003cspan class=\"pl-s\"\u003ea\u003c/span\u003e\u003cspan class=\"pl-s\"\u003el\u003c/span\u003e\u003cspan class=\"pl-s\"\u003eb\u003c/span\u003e\u003cspan class=\"pl-c1\"\u003e|\u003c/span\u003e\u003cspan class=\"pl-s\"\u003en\u003c/span\u003e\u003cspan class=\"pl-s\"\u003er\u003c/span\u003e\u003cspan class=\"pl-s\"\u003em\u003c/span\u003e\u003cspan class=\"pl-kos\"\u003e)\u003c/span\u003e\u003cspan class=\"pl-cce\"\u003e\\.\u003c/span\u003e\u003cspan class=\"pl-s\"\u003ee\u003c/span\u003e\u003cspan class=\"pl-s\"\u003ex\u003c/span\u003e\u003cspan class=\"pl-s\"\u003er\u003c/span\u003e\u003c/pre\u003e\u003c/div\u003e\n\u003cp dir=\"auto\"\u003eThe number of samples per pixel should be padded with leading zeros to\nhave a fixed number of digits. If the reference image is not explicitly\nnamed as such (i.e. has the number of samples instead), the image with\nthe most samples per pixel will be considered the reference.\u003c/p\u003e\n\u003cp dir=\"auto\"\u003eThe following image features are supported:\u003c/p\u003e\n\u003cmarkdown-accessiblity-table\u003e\u003ctable\u003e\n\u003cthead\u003e\n\u003ctr\u003e\n\u003cth\u003eFeature\u003c/th\u003e\n\u003cth align=\"left\"\u003eDescription\u003c/th\u003e\n\u003cth align=\"left\"\u003eChannels\u003c/th\u003e\n\u003cth align=\"left\"\u003eFile extension\u003c/th\u003e\n\u003c/tr\u003e\n\u003c/thead\u003e\n\u003ctbody\u003e\n\u003ctr\u003e\n\u003ctd\u003e\u003ccode\u003ehdr\u003c/code\u003e\u003c/td\u003e\n\u003ctd align=\"left\"\u003ecolor (HDR)\u003c/td\u003e\n\u003ctd align=\"left\"\u003e3\u003c/td\u003e\n\u003ctd align=\"left\"\u003e\u003ccode\u003e.hdr.exr\u003c/code\u003e\u003c/td\u003e\n\u003c/tr\u003e\n\u003ctr\u003e\n\u003ctd\u003e\u003ccode\u003eldr\u003c/code\u003e\u003c/td\u003e\n\u003ctd align=\"left\"\u003ecolor (LDR)\u003c/td\u003e\n\u003ctd align=\"left\"\u003e3\u003c/td\u003e\n\u003ctd align=\"left\"\u003e\u003ccode\u003e.ldr.exr\u003c/code\u003e\u003c/td\u003e\n\u003c/tr\u003e\n\u003ctr\u003e\n\u003ctd\u003e\u003ccode\u003esh1\u003c/code\u003e\u003c/td\u003e\n\u003ctd align=\"left\"\u003ecolor (normalized L1 spherical harmonics)\u003c/td\u003e\n\u003ctd align=\"left\"\u003e3 × 3 images\u003c/td\u003e\n\u003ctd align=\"left\"\u003e\u003ccode\u003e.sh1x.exr\u003c/code\u003e, \u003ccode\u003e.sh1y.exr\u003c/code\u003e, \u003ccode\u003e.sh1z.exr\u003c/code\u003e\u003c/td\u003e\n\u003c/tr\u003e\n\u003ctr\u003e\n\u003ctd\u003e\u003ccode\u003ealb\u003c/code\u003e\u003c/td\u003e\n\u003ctd align=\"left\"\u003ealbedo\u003c/td\u003e\n\u003ctd align=\"left\"\u003e3\u003c/td\u003e\n\u003ctd align=\"left\"\u003e\u003ccode\u003e.alb.exr\u003c/code\u003e\u003c/td\u003e\n\u003c/tr\u003e\n\u003ctr\u003e\n\u003ctd\u003e\u003ccode\u003enrm\u003c/code\u003e\u003c/td\u003e\n\u003ctd align=\"left\"\u003enormal\u003c/td\u003e\n\u003ctd align=\"left\"\u003e3\u003c/td\u003e\n\u003ctd align=\"left\"\u003e\u003ccode\u003e.nrm.exr\u003c/code\u003e\u003c/td\u003e\n\u003c/tr\u003e\n\u003c/tbody\u003e\n\u003c/table\u003e\u003c/markdown-accessiblity-table\u003e\n\u003cp dir=\"auto\"\u003eImage features supported by the training toolkit.\u003c/p\u003e\n\u003cp dir=\"auto\"\u003eThe following directory tree demonstrates an example root dataset\ndirectory (\u003ccode\u003edata\u003c/code\u003e) containing one dataset (\u003ccode\u003ert_train\u003c/code\u003e) with HDR color\nand albedo feature images:\u003c/p\u003e\n\u003cdiv class=\"snippet-clipboard-content notranslate position-relative overflow-auto\" data-snippet-clipboard-copy-content=\"data\n`-- rt_train\n |-- scene1\n | |-- view1_0001.alb.exr\n | |-- view1_0001.hdr.exr\n | |-- view1_0004.alb.exr\n | |-- view1_0004.hdr.exr\n | |-- view1_8192.alb.exr\n | |-- view1_8192.hdr.exr\n | |-- view2_0001.alb.exr\n | |-- view2_0001.hdr.exr\n | |-- view2_8192.alb.exr\n | `-- view2_8192.hdr.exr\n |-- scene2_000008spp.alb.exr\n |-- scene2_000008spp.hdr.exr\n |-- scene2_000064spp.alb.exr\n |-- scene2_000064spp.hdr.exr\n |-- scene2_reference.alb.exr\n `-- scene2_reference.hdr.exr\"\u003e\u003cpre class=\"notranslate\"\u003e\u003ccode\u003edata\n`-- rt_train\n |-- scene1\n | |-- view1_0001.alb.exr\n | |-- view1_0001.hdr.exr\n | |-- view1_0004.alb.exr\n | |-- view1_0004.hdr.exr\n | |-- view1_8192.alb.exr\n | |-- view1_8192.hdr.exr\n | |-- view2_0001.alb.exr\n | |-- view2_0001.hdr.exr\n | |-- view2_8192.alb.exr\n | `-- view2_8192.hdr.exr\n |-- scene2_000008spp.alb.exr\n |-- scene2_000008spp.hdr.exr\n |-- scene2_000064spp.alb.exr\n |-- scene2_000064spp.hdr.exr\n |-- scene2_reference.alb.exr\n `-- scene2_reference.hdr.exr\n\u003c/code\u003e\u003c/pre\u003e\u003c/div\u003e\n\u003cdiv class=\"markdown-heading\" dir=\"auto\"\u003e\u003ch2 tabindex=\"-1\" class=\"heading-element\" dir=\"auto\"\u003ePreprocessing (preprocess.py)\u003c/h2\u003e\u003ca id=\"user-content-preprocessing-preprocesspy\" class=\"anchor\" aria-label=\"Permalink: Preprocessing (preprocess.py)\" href=\"#preprocessing-preprocesspy\"\u003e\u003csvg class=\"octicon octicon-link\" viewBox=\"0 0 16 16\" version=\"1.1\" width=\"16\" height=\"16\" aria-hidden=\"true\"\u003e\u003cpath d=\"m7.775 3.275 1.25-1.25a3.5 3.5 0 1 1 4.95 4.95l-2.5 2.5a3.5 3.5 0 0 1-4.95 0 .751.751 0 0 1 .018-1.042.751.751 0 0 1 1.042-.018 1.998 1.998 0 0 0 2.83 0l2.5-2.5a2.002 2.002 0 0 0-2.83-2.83l-1.25 1.25a.751.751 0 0 1-1.042-.018.751.751 0 0 1-.018-1.042Zm-4.69 9.64a1.998 1.998 0 0 0 2.83 0l1.25-1.25a.751.751 0 0 1 1.042.018.751.751 0 0 1 .018 1.042l-1.25 1.25a3.5 3.5 0 1 1-4.95-4.95l2.5-2.5a3.5 3.5 0 0 1 4.95 0 .751.751 0 0 1-.018 1.042.751.751 0 0 1-1.042.018 1.998 1.998 0 0 0-2.83 0l-2.5 2.5a1.998 1.998 0 0 0 0 2.83Z\"\u003e\u003c/path\u003e\u003c/svg\u003e\u003c/a\u003e\u003c/div\u003e\n\u003cp dir=\"auto\"\u003eTraining and validation datasets can be used only after preprocessing\nthem using the \u003ccode\u003epreprocess.py\u003c/code\u003e script. This will convert the specified\ntraining (\u003ccode\u003e--train_data\u003c/code\u003e or \u003ccode\u003e-t\u003c/code\u003e option) and validation datasets\n(\u003ccode\u003e--valid_data\u003c/code\u003e or \u003ccode\u003e-v\u003c/code\u003e option) located in the root dataset directory\n(\u003ccode\u003e--data_dir\u003c/code\u003e or \u003ccode\u003e-D\u003c/code\u003e option) to a format that can be loaded more\nefficiently during training. All preprocessed datasets will be stored in\na root preprocessed dataset directory (\u003ccode\u003e--preproc_dir\u003c/code\u003e or \u003ccode\u003e-P\u003c/code\u003e option).\u003c/p\u003e\n\u003cp dir=\"auto\"\u003eThe preprocessing script requires the set of image features to include\nin the preprocessed dataset as command-line arguments. Only these\nspecified features will be available for training but it is not required\nto use all of them at the same time. Thus, a single preprocessed dataset\ncan be reused for training multiple models with different combinations\nof the preprocessed features.\u003c/p\u003e\n\u003cp dir=\"auto\"\u003eBy default, all input features are assumed to be noisy, including the\nauxiliary features (e.g. albedo, normal), each having versions at\ndifferent samples per pixel. It is also possible to train with\nnoise-free auxiliary features, in which case the reference auxiliary\nfeatures are used instead of the various noisy ones (\u003ccode\u003e--clean_aux\u003c/code\u003e\noption). This improves quality significantly if the auxiliary features\nused for inference will be either originally noise-free or prefiltered\nwith separately trained auxiliary feature denoising models. If inference\nwill be done only with prefiltered features, even higher quality can be\nachieved by training with prefiltered features instead of the reference\nonces. This can be achieved by first training the auxiliary feature\nmodels and then specifying the list of these results when preprocessing\nthe dataset for the main feature (\u003ccode\u003e--aux_results\u003c/code\u003e or \u003ccode\u003e-a\u003c/code\u003e option).\u003c/p\u003e\n\u003cp dir=\"auto\"\u003ePreprocessing also depends on the filter that will be trained\n(e.g. determines which HDR/LDR transfer function has to be used), which\nshould be also specified (\u003ccode\u003e--filter\u003c/code\u003e or \u003ccode\u003e-f\u003c/code\u003e option). The alternative is\nto manually specify the transfer function (\u003ccode\u003e--transfer\u003c/code\u003e or \u003ccode\u003e-x\u003c/code\u003e option)\nand other filter-specific parameters, which could be useful for training\ncustom filters.\u003c/p\u003e\n\u003cp dir=\"auto\"\u003eFor example, to preprocess the training and validation datasets\n(\u003ccode\u003ert_train\u003c/code\u003e and \u003ccode\u003ert_valid\u003c/code\u003e) with HDR color, albedo, and normal image\nfeatures, for training the \u003ccode\u003eRT\u003c/code\u003e filter, the following command can be\nused:\u003c/p\u003e\n\u003cdiv class=\"snippet-clipboard-content notranslate position-relative overflow-auto\" data-snippet-clipboard-copy-content=\"./preprocess.py hdr alb nrm --filter RT --train_data rt_train --valid_data rt_valid\"\u003e\u003cpre class=\"notranslate\"\u003e\u003ccode\u003e./preprocess.py hdr alb nrm --filter RT --train_data rt_train --valid_data rt_valid\n\u003c/code\u003e\u003c/pre\u003e\u003c/div\u003e\n\u003cp dir=\"auto\"\u003eIt is possible to preprocess the same dataset multiple times, with\npossibly different combinations of features and options. The training\nscript will use the most suitable and most recent preprocessed version\ndepending on the training parameters.\u003c/p\u003e\n\u003cp dir=\"auto\"\u003eFor more details about using the preprocessing script, including other\noptions, please have a look at the help message:\u003c/p\u003e\n\u003cdiv class=\"snippet-clipboard-content notranslate position-relative overflow-auto\" data-snippet-clipboard-copy-content=\"./preprocess.py -h\"\u003e\u003cpre class=\"notranslate\"\u003e\u003ccode\u003e./preprocess.py -h\n\u003c/code\u003e\u003c/pre\u003e\u003c/div\u003e\n\u003cdiv class=\"markdown-heading\" dir=\"auto\"\u003e\u003ch2 tabindex=\"-1\" class=\"heading-element\" dir=\"auto\"\u003eTraining (train.py)\u003c/h2\u003e\u003ca id=\"user-content-training-trainpy\" class=\"anchor\" aria-label=\"Permalink: Training (train.py)\" href=\"#training-trainpy\"\u003e\u003csvg class=\"octicon octicon-link\" viewBox=\"0 0 16 16\" version=\"1.1\" width=\"16\" height=\"16\" aria-hidden=\"true\"\u003e\u003cpath d=\"m7.775 3.275 1.25-1.25a3.5 3.5 0 1 1 4.95 4.95l-2.5 2.5a3.5 3.5 0 0 1-4.95 0 .751.751 0 0 1 .018-1.042.751.751 0 0 1 1.042-.018 1.998 1.998 0 0 0 2.83 0l2.5-2.5a2.002 2.002 0 0 0-2.83-2.83l-1.25 1.25a.751.751 0 0 1-1.042-.018.751.751 0 0 1-.018-1.042Zm-4.69 9.64a1.998 1.998 0 0 0 2.83 0l1.25-1.25a.751.751 0 0 1 1.042.018.751.751 0 0 1 .018 1.042l-1.25 1.25a3.5 3.5 0 1 1-4.95-4.95l2.5-2.5a3.5 3.5 0 0 1 4.95 0 .751.751 0 0 1-.018 1.042.751.751 0 0 1-1.042.018 1.998 1.998 0 0 0-2.83 0l-2.5 2.5a1.998 1.998 0 0 0 0 2.83Z\"\u003e\u003c/path\u003e\u003c/svg\u003e\u003c/a\u003e\u003c/div\u003e\n\u003cp dir=\"auto\"\u003eThe filters require separate trained models for each supported\ncombination of input features. Thus, depending on which combinations of\nfeatures the user wants to support for a particular filter, one or more\nmodels have to be trained.\u003c/p\u003e\n\u003cp dir=\"auto\"\u003eAfter preprocessing the datasets, it is possible to start training a\nmodel using the \u003ccode\u003etrain.py\u003c/code\u003e script. Similar to the preprocessing script,\nthe input features must be specified (could be a subset of the\npreprocessed features), and the dataset names, directory paths, and the\nfilter can be also passed. If the \u003ccode\u003e--clean_aux\u003c/code\u003e or \u003ccode\u003e--aux_results\u003c/code\u003e\noptions were specified for preprocessing, these must be passed\nidentically to the training script as well.\u003c/p\u003e\n\u003cp dir=\"auto\"\u003eOpen Image Denoise uses models of different sizes for different quality\nmodes (high, balanced, fast). Specifying the quality mode (\u003ccode\u003e--quality\u003c/code\u003e\nor \u003ccode\u003e-q\u003c/code\u003e option) will cause the model to be implicitly selected, or the\nmodel can be specified explicitly as well (\u003ccode\u003e--model\u003c/code\u003e or \u003ccode\u003e-m\u003c/code\u003e option).\u003c/p\u003e\n\u003cp dir=\"auto\"\u003eThe tool will produce a training \u003cem\u003eresult\u003c/em\u003e, the name of which can be\neither specified (\u003ccode\u003e--result\u003c/code\u003e or \u003ccode\u003e-r\u003c/code\u003e option) or automatically generated\n(by default). Each result is stored in its own subdirectory, and these\nare located in a common parent directory (\u003ccode\u003e--results_dir\u003c/code\u003e or \u003ccode\u003e-R\u003c/code\u003e\noption). If a training result already exists, the tool will resume\ntraining that result from the latest checkpoint.\u003c/p\u003e\n\u003cp dir=\"auto\"\u003eThe default training hyperparameters should work reasonably well in\ngeneral, but some adjustments might be necessary for certain datasets to\nattain optimal performance, most importantly: the number of epochs\n(\u003ccode\u003e--num_epochs\u003c/code\u003e or \u003ccode\u003e-e\u003c/code\u003e option), the global mini-batch size\n(\u003ccode\u003e--batch_size\u003c/code\u003e or \u003ccode\u003e-b\u003c/code\u003e option), and the learning rate. The training\ntool uses a one-cycle learning rate schedule with cosine annealing,\nwhich can be configured by setting the base learning rate\n(\u003ccode\u003e--learning_rate\u003c/code\u003e or \u003ccode\u003e--lr\u003c/code\u003e option), the maximum learning rate\n(\u003ccode\u003e--max_learning_rate\u003c/code\u003e or \u003ccode\u003e--max_lr\u003c/code\u003e option), and the percentage of the\ncycle spent increasing the learning rate (\u003ccode\u003e--learning_rate_warmup\u003c/code\u003e or\n\u003ccode\u003e--lr_warmup\u003c/code\u003e option).\u003c/p\u003e\n\u003cp dir=\"auto\"\u003eExample usage:\u003c/p\u003e\n\u003cdiv class=\"snippet-clipboard-content notranslate position-relative overflow-auto\" data-snippet-clipboard-copy-content=\"./train.py hdr alb --filter RT --train_data rt_train --valid_data rt_valid --result rt_hdr_alb\"\u003e\u003cpre class=\"notranslate\"\u003e\u003ccode\u003e./train.py hdr alb --filter RT --train_data rt_train --valid_data rt_valid --result rt_hdr_alb\n\u003c/code\u003e\u003c/pre\u003e\u003c/div\u003e\n\u003cp dir=\"auto\"\u003eFor finding the optimal learning rate range, we recommend using the\nincluded \u003ccode\u003efind_lr.py\u003c/code\u003e script, which trains one epoch using an increasing\nlearning rate and logs the resulting losses in a comma-separated values\n(CSV) file. Plotting the loss curve can show when the model starts to\nlearn (the base learning rate) and when it starts to diverge (the\nmaximum learning rate).\u003c/p\u003e\n\u003cp dir=\"auto\"\u003eThe model is evaluated with the validation dataset at regular intervals\n(\u003ccode\u003e--num_valid_epochs\u003c/code\u003e option), and checkpoints are also regularly\ncreated (\u003ccode\u003e--num_save_epochs\u003c/code\u003e option) to save training progress. Also,\nsome statistics are logged (e.g. training and validation losses,\nlearning rate) per epoch, which can be later visualized with TensorBoard\nby running the \u003ccode\u003evisualize.py\u003c/code\u003e script, e.g.:\u003c/p\u003e\n\u003cdiv class=\"snippet-clipboard-content notranslate position-relative overflow-auto\" data-snippet-clipboard-copy-content=\"./visualize.py --result rt_hdr_alb\"\u003e\u003cpre class=\"notranslate\"\u003e\u003ccode\u003e./visualize.py --result rt_hdr_alb\n\u003c/code\u003e\u003c/pre\u003e\u003c/div\u003e\n\u003cp dir=\"auto\"\u003eTraining is performed with mixed precision (FP16 and FP32) by default,\nif it supported by the hardware, which makes training faster and use\nless memory. However, in some rare cases this might cause some\nconvergence issues. The training precision can be manually set to FP32\nif necessary (\u003ccode\u003e--precision\u003c/code\u003e or \u003ccode\u003e-p\u003c/code\u003e option).\u003c/p\u003e\n\u003cdiv class=\"markdown-heading\" dir=\"auto\"\u003e\u003ch2 tabindex=\"-1\" class=\"heading-element\" dir=\"auto\"\u003eInference (infer.py)\u003c/h2\u003e\u003ca id=\"user-content-inference-inferpy\" class=\"anchor\" aria-label=\"Permalink: Inference (infer.py)\" href=\"#inference-inferpy\"\u003e\u003csvg class=\"octicon octicon-link\" viewBox=\"0 0 16 16\" version=\"1.1\" width=\"16\" height=\"16\" aria-hidden=\"true\"\u003e\u003cpath d=\"m7.775 3.275 1.25-1.25a3.5 3.5 0 1 1 4.95 4.95l-2.5 2.5a3.5 3.5 0 0 1-4.95 0 .751.751 0 0 1 .018-1.042.751.751 0 0 1 1.042-.018 1.998 1.998 0 0 0 2.83 0l2.5-2.5a2.002 2.002 0 0 0-2.83-2.83l-1.25 1.25a.751.751 0 0 1-1.042-.018.751.751 0 0 1-.018-1.042Zm-4.69 9.64a1.998 1.998 0 0 0 2.83 0l1.25-1.25a.751.751 0 0 1 1.042.018.751.751 0 0 1 .018 1.042l-1.25 1.25a3.5 3.5 0 1 1-4.95-4.95l2.5-2.5a3.5 3.5 0 0 1 4.95 0 .751.751 0 0 1-.018 1.042.751.751 0 0 1-1.042.018 1.998 1.998 0 0 0-2.83 0l-2.5 2.5a1.998 1.998 0 0 0 0 2.83Z\"\u003e\u003c/path\u003e\u003c/svg\u003e\u003c/a\u003e\u003c/div\u003e\n\u003cp dir=\"auto\"\u003eA training result can be tested by performing inference on an image\ndataset (\u003ccode\u003e--input_data\u003c/code\u003e or \u003ccode\u003e-i\u003c/code\u003e option) using the \u003ccode\u003einfer.py\u003c/code\u003e script. The\ndataset does \u003cem\u003enot\u003c/em\u003e have to be preprocessed. In addition to the result to\nuse, it is possible to specify which checkpoint to load as well (\u003ccode\u003e-e\u003c/code\u003e or\n\u003ccode\u003e--num_epochs\u003c/code\u003e option). By default the latest checkpoint is loaded.\u003c/p\u003e\n\u003cp dir=\"auto\"\u003eThe tool saves the output images in a separate directory (\u003ccode\u003e--output_dir\u003c/code\u003e\nor \u003ccode\u003e-O\u003c/code\u003e option) in the requested formats (\u003ccode\u003e--format\u003c/code\u003e or \u003ccode\u003e-F\u003c/code\u003e option). It\nalso evaluates a set of image quality metrics (\u003ccode\u003e--metric\u003c/code\u003e or \u003ccode\u003e-M\u003c/code\u003e\noption), e.g. PSNR, SSIM, for images that have reference images\navailable. All metrics are computed in tonemapped non-linear sRGB space.\nThus, HDR images are first tonemapped (with Naughty Dog’s Filmic\nTonemapper from John Hable’s \u003cem\u003eUncharted 2: HDR Lighting\u003c/em\u003e presentation)\nand converted to sRGB before evaluating the metrics.\u003c/p\u003e\n\u003cp dir=\"auto\"\u003eExample usage:\u003c/p\u003e\n\u003cdiv class=\"snippet-clipboard-content notranslate position-relative overflow-auto\" data-snippet-clipboard-copy-content=\"./infer.py --result rt_hdr_alb --input_data rt_test --format exr png --metric ssim\"\u003e\u003cpre class=\"notranslate\"\u003e\u003ccode\u003e./infer.py --result rt_hdr_alb --input_data rt_test --format exr png --metric ssim\n\u003c/code\u003e\u003c/pre\u003e\u003c/div\u003e\n\u003cp dir=\"auto\"\u003eThe inference tool supports prefiltering of auxiliary features as well,\nwhich can be performed by specifying the list of training results for\neach feature to prefilter (\u003ccode\u003e--aux_results\u003c/code\u003e or \u003ccode\u003e-a\u003c/code\u003e option).\u003c/p\u003e\n\u003cdiv class=\"markdown-heading\" dir=\"auto\"\u003e\u003ch2 tabindex=\"-1\" class=\"heading-element\" dir=\"auto\"\u003eExporting Results (export.py)\u003c/h2\u003e\u003ca id=\"user-content-exporting-results-exportpy\" class=\"anchor\" aria-label=\"Permalink: Exporting Results (export.py)\" href=\"#exporting-results-exportpy\"\u003e\u003csvg class=\"octicon octicon-link\" viewBox=\"0 0 16 16\" version=\"1.1\" width=\"16\" height=\"16\" aria-hidden=\"true\"\u003e\u003cpath d=\"m7.775 3.275 1.25-1.25a3.5 3.5 0 1 1 4.95 4.95l-2.5 2.5a3.5 3.5 0 0 1-4.95 0 .751.751 0 0 1 .018-1.042.751.751 0 0 1 1.042-.018 1.998 1.998 0 0 0 2.83 0l2.5-2.5a2.002 2.002 0 0 0-2.83-2.83l-1.25 1.25a.751.751 0 0 1-1.042-.018.751.751 0 0 1-.018-1.042Zm-4.69 9.64a1.998 1.998 0 0 0 2.83 0l1.25-1.25a.751.751 0 0 1 1.042.018.751.751 0 0 1 .018 1.042l-1.25 1.25a3.5 3.5 0 1 1-4.95-4.95l2.5-2.5a3.5 3.5 0 0 1 4.95 0 .751.751 0 0 1-.018 1.042.751.751 0 0 1-1.042.018 1.998 1.998 0 0 0-2.83 0l-2.5 2.5a1.998 1.998 0 0 0 0 2.83Z\"\u003e\u003c/path\u003e\u003c/svg\u003e\u003c/a\u003e\u003c/div\u003e\n\u003cp dir=\"auto\"\u003eThe training result produced by the \u003ccode\u003etrain.py\u003c/code\u003e script cannot be\nimmediately used by the main library. It has to be first exported to the\nruntime model weights format, a \u003cem\u003eTensor Archive\u003c/em\u003e (TZA) file. Running the\n\u003ccode\u003eexport.py\u003c/code\u003e script for a training result (and optionally a checkpoint\nepoch) will create a binary \u003ccode\u003e.tza\u003c/code\u003e file in the directory of the result,\nwhich can be either used at runtime through the API or it can be\nincluded in the library build by replacing one of the built-in weights\nfiles.\u003c/p\u003e\n\u003cp dir=\"auto\"\u003eExample usage:\u003c/p\u003e\n\u003cdiv class=\"snippet-clipboard-content notranslate position-relative overflow-auto\" data-snippet-clipboard-copy-content=\"./export.py --result rt_hdr_alb\"\u003e\u003cpre class=\"notranslate\"\u003e\u003ccode\u003e./export.py --result rt_hdr_alb\n\u003c/code\u003e\u003c/pre\u003e\u003c/div\u003e\n\u003cdiv class=\"markdown-heading\" dir=\"auto\"\u003e\u003ch2 tabindex=\"-1\" class=\"heading-element\" dir=\"auto\"\u003eImage Conversion and Comparison\u003c/h2\u003e\u003ca id=\"user-content-image-conversion-and-comparison\" class=\"anchor\" aria-label=\"Permalink: Image Conversion and Comparison\" href=\"#image-conversion-and-comparison\"\u003e\u003csvg class=\"octicon octicon-link\" viewBox=\"0 0 16 16\" version=\"1.1\" width=\"16\" height=\"16\" aria-hidden=\"true\"\u003e\u003cpath d=\"m7.775 3.275 1.25-1.25a3.5 3.5 0 1 1 4.95 4.95l-2.5 2.5a3.5 3.5 0 0 1-4.95 0 .751.751 0 0 1 .018-1.042.751.751 0 0 1 1.042-.018 1.998 1.998 0 0 0 2.83 0l2.5-2.5a2.002 2.002 0 0 0-2.83-2.83l-1.25 1.25a.751.751 0 0 1-1.042-.018.751.751 0 0 1-.018-1.042Zm-4.69 9.64a1.998 1.998 0 0 0 2.83 0l1.25-1.25a.751.751 0 0 1 1.042.018.751.751 0 0 1 .018 1.042l-1.25 1.25a3.5 3.5 0 1 1-4.95-4.95l2.5-2.5a3.5 3.5 0 0 1 4.95 0 .751.751 0 0 1-.018 1.042.751.751 0 0 1-1.042.018 1.998 1.998 0 0 0-2.83 0l-2.5 2.5a1.998 1.998 0 0 0 0 2.83Z\"\u003e\u003c/path\u003e\u003c/svg\u003e\u003c/a\u003e\u003c/div\u003e\n\u003cp dir=\"auto\"\u003eIn addition to the already mentioned \u003ccode\u003esplit_exr.py\u003c/code\u003e script, the toolkit\ncontains a few other image utilities as well.\u003c/p\u003e\n\u003cp dir=\"auto\"\u003e\u003ccode\u003econvert_image.py\u003c/code\u003e converts a feature image to a different image format\n(and/or a different feature, e.g. HDR color to LDR), performing\ntonemapping and other transforms as well if needed. For HDR images the\nexposure can be adjusted by passing a linear exposure scale\n(\u003ccode\u003e--exposure\u003c/code\u003e or \u003ccode\u003e-E\u003c/code\u003e option). Example usage:\u003c/p\u003e\n\u003cdiv class=\"snippet-clipboard-content notranslate position-relative overflow-auto\" data-snippet-clipboard-copy-content=\"./convert_image.py view1_0004.hdr.exr view1_0004.png --exposure 2.5\"\u003e\u003cpre class=\"notranslate\"\u003e\u003ccode\u003e./convert_image.py view1_0004.hdr.exr view1_0004.png --exposure 2.5\n\u003c/code\u003e\u003c/pre\u003e\u003c/div\u003e\n\u003cp dir=\"auto\"\u003eThe \u003ccode\u003ecompare_image.py\u003c/code\u003e script compares two feature images (preferably\nhaving the dataset filename format to correctly detect the feature)\nusing the specified image quality metrics, similar to the \u003ccode\u003einfer.py\u003c/code\u003e\ntool. Example usage:\u003c/p\u003e\n\u003cdiv class=\"snippet-clipboard-content notranslate position-relative overflow-auto\" data-snippet-clipboard-copy-content=\"./compare_image.py view1_0004.hdr.exr view1_8192.hdr.exr --exposure 2.5 --metric mse ssim\"\u003e\u003cpre class=\"notranslate\"\u003e\u003ccode\u003e./compare_image.py view1_0004.hdr.exr view1_8192.hdr.exr --exposure 2.5 --metric mse ssim\n\u003c/code\u003e\u003c/pre\u003e\u003c/div\u003e\n\u003c/article\u003e","loaded":true,"timedOut":false,"errorMessage":null,"headerInfo":{"toc":[{"level":1,"text":"Intel® Open Image Denoise","anchor":"intel-open-image-denoise","htmlText":"Intel® Open Image Denoise"},{"level":1,"text":"Overview","anchor":"overview","htmlText":"Overview"},{"level":2,"text":"System Requirements","anchor":"system-requirements","htmlText":"System Requirements"},{"level":2,"text":"Support and Contact","anchor":"support-and-contact","htmlText":"Support and Contact"},{"level":2,"text":"Citation","anchor":"citation","htmlText":"Citation"},{"level":1,"text":"Compilation","anchor":"compilation","htmlText":"Compilation"},{"level":2,"text":"Prerequisites","anchor":"prerequisites","htmlText":"Prerequisites"},{"level":4,"text":"CPU device:","anchor":"cpu-device","htmlText":"CPU device:"},{"level":4,"text":"SYCL device for Intel GPUs:","anchor":"sycl-device-for-intel-gpus","htmlText":"SYCL device for Intel GPUs:"},{"level":4,"text":"CUDA device for NVIDIA GPUs:","anchor":"cuda-device-for-nvidia-gpus","htmlText":"CUDA device for NVIDIA GPUs:"},{"level":4,"text":"HIP device for AMD GPUs:","anchor":"hip-device-for-amd-gpus","htmlText":"HIP device for AMD GPUs:"},{"level":4,"text":"Metal device for Apple GPUs:","anchor":"metal-device-for-apple-gpus","htmlText":"Metal device for Apple GPUs:"},{"level":2,"text":"Compiling on Linux/macOS","anchor":"compiling-on-linuxmacos","htmlText":"Compiling on Linux/macOS"},{"level":2,"text":"Compiling on Windows","anchor":"compiling-on-windows","htmlText":"Compiling on Windows"},{"level":2,"text":"CMake Configuration","anchor":"cmake-configuration","htmlText":"CMake Configuration"},{"level":1,"text":"Documentation","anchor":"documentation","htmlText":"Documentation"},{"level":1,"text":"Open Image Denoise API","anchor":"open-image-denoise-api","htmlText":"Open Image Denoise API"},{"level":2,"text":"Examples","anchor":"examples","htmlText":"Examples"},{"level":3,"text":"Basic Denoising (C99 API)","anchor":"basic-denoising-c99-api","htmlText":"Basic Denoising (C99 API)"},{"level":3,"text":"Basic Denoising (C++11 API)","anchor":"basic-denoising-c11-api","htmlText":"Basic Denoising (C++11 API)"},{"level":3,"text":"Denoising with Prefiltering (C++11 API)","anchor":"denoising-with-prefiltering-c11-api","htmlText":"Denoising with Prefiltering (C++11 API)"},{"level":2,"text":"Upgrading from Open Image Denoise 1.x","anchor":"upgrading-from-open-image-denoise-1x","htmlText":"Upgrading from Open Image Denoise 1.x"},{"level":3,"text":"Buffers","anchor":"buffers","htmlText":"Buffers"},{"level":3,"text":"Interop with Compute (SYCL, CUDA, HIP) and Graphics (DX, Vulkan, Metal) APIs","anchor":"interop-with-compute-sycl-cuda-hip-and-graphics-dx-vulkan-metal-apis","htmlText":"Interop with Compute (SYCL, CUDA, HIP) and Graphics (DX, Vulkan, Metal) APIs"},{"level":3,"text":"Physical Devices","anchor":"physical-devices","htmlText":"Physical Devices"},{"level":3,"text":"Asynchronous Execution","anchor":"asynchronous-execution","htmlText":"Asynchronous Execution"},{"level":3,"text":"Filter Quality","anchor":"filter-quality","htmlText":"Filter Quality"},{"level":3,"text":"Small API Changes","anchor":"small-api-changes","htmlText":"Small API Changes"},{"level":3,"text":"Building as a Static Library","anchor":"building-as-a-static-library","htmlText":"Building as a Static Library"},{"level":2,"text":"Physical Devices","anchor":"physical-devices-1","htmlText":"Physical Devices"},{"level":2,"text":"Devices","anchor":"devices","htmlText":"Devices"},{"level":3,"text":"Error Handling","anchor":"error-handling","htmlText":"Error Handling"},{"level":3,"text":"Environment Variables","anchor":"environment-variables","htmlText":"Environment Variables"},{"level":2,"text":"Buffers","anchor":"buffers-1","htmlText":"Buffers"},{"level":3,"text":"Data Format","anchor":"data-format","htmlText":"Data Format"},{"level":2,"text":"Filters","anchor":"filters","htmlText":"Filters"},{"level":3,"text":"RT","anchor":"rt","htmlText":"RT"},{"level":4,"text":"Albedos","anchor":"albedos","htmlText":"Albedos"},{"level":4,"text":"Normals","anchor":"normals","htmlText":"Normals"},{"level":4,"text":"Quality","anchor":"quality","htmlText":"Quality"},{"level":4,"text":"Weights","anchor":"weights","htmlText":"Weights"},{"level":3,"text":"RTLightmap","anchor":"rtlightmap","htmlText":"RTLightmap"},{"level":1,"text":"Examples","anchor":"examples-1","htmlText":"Examples"},{"level":2,"text":"oidnDenoise","anchor":"oidndenoise","htmlText":"oidnDenoise"},{"level":2,"text":"oidnBenchmark","anchor":"oidnbenchmark","htmlText":"oidnBenchmark"},{"level":1,"text":"Training","anchor":"training","htmlText":"Training"},{"level":2,"text":"Prerequisites","anchor":"prerequisites-1","htmlText":"Prerequisites"},{"level":2,"text":"Devices","anchor":"devices-1","htmlText":"Devices"},{"level":2,"text":"Datasets","anchor":"datasets","htmlText":"Datasets"},{"level":2,"text":"Preprocessing (preprocess.py)","anchor":"preprocessing-preprocesspy","htmlText":"Preprocessing (preprocess.py)"},{"level":2,"text":"Training (train.py)","anchor":"training-trainpy","htmlText":"Training (train.py)"},{"level":2,"text":"Inference (infer.py)","anchor":"inference-inferpy","htmlText":"Inference (infer.py)"},{"level":2,"text":"Exporting Results (export.py)","anchor":"exporting-results-exportpy","htmlText":"Exporting Results (export.py)"},{"level":2,"text":"Image Conversion and Comparison","anchor":"image-conversion-and-comparison","htmlText":"Image Conversion and Comparison"}],"siteNavLoginPath":"/login?return_to=https%3A%2F%2Fgithub.com%2FRenderKit%2Foidn"}},{"displayName":"LICENSE.txt","repoName":"oidn","refName":"master","path":"LICENSE.txt","preferredFileType":"license","tabName":"Apache-2.0","richText":null,"loaded":false,"timedOut":false,"errorMessage":null,"headerInfo":{"toc":null,"siteNavLoginPath":"/login?return_to=https%3A%2F%2Fgithub.com%2FRenderKit%2Foidn"}},{"displayName":"SECURITY.md","repoName":"oidn","refName":"master","path":"SECURITY.md","preferredFileType":"security","tabName":"Security","richText":null,"loaded":false,"timedOut":false,"errorMessage":null,"headerInfo":{"toc":null,"siteNavLoginPath":"/login?return_to=https%3A%2F%2Fgithub.com%2FRenderKit%2Foidn"}}],"overviewFilesProcessingTime":0}},"appPayload":{"helpUrl":"https://docs.github.com","findFileWorkerPath":"/assets-cdn/worker/find-file-worker-1583894afd38.js","findInFileWorkerPath":"/assets-cdn/worker/find-in-file-worker-67668e8c2caa.js","githubDevUrl":null,"enabled_features":{"code_nav_ui_events":false,"overview_shared_code_dropdown_button":false,"react_blob_overlay":false,"copilot_conversational_ux_embedding_update":false,"copilot_smell_icebreaker_ux":true,"copilot_workspace":false,"accessible_code_button":true}}}}</script> <div data-target="react-partial.reactRoot"><style data-styled="true" data-styled-version="5.3.11">.iVEunk{margin-top:16px;margin-bottom:16px;}/*!sc*/ .jzuOtQ{display:-webkit-box;display:-webkit-flex;display:-ms-flexbox;display:flex;-webkit-flex-direction:column;-ms-flex-direction:column;flex-direction:column;-webkit-box-pack:justify;-webkit-justify-content:space-between;-ms-flex-pack:justify;justify-content:space-between;}/*!sc*/ .bGojzy{margin-bottom:0;display:-webkit-box;display:-webkit-flex;display:-ms-flexbox;display:flex;-webkit-flex-direction:column;-ms-flex-direction:column;flex-direction:column;row-gap:16px;}/*!sc*/ .iNSVHo{display:-webkit-box;display:-webkit-flex;display:-ms-flexbox;display:flex;-webkit-box-pack:justify;-webkit-justify-content:space-between;-ms-flex-pack:justify;justify-content:space-between;-webkit-box-flex:1;-webkit-flex-grow:1;-ms-flex-positive:1;flex-grow:1;padding-bottom:16px;padding-top:8px;}/*!sc*/ .bVgnfw{display:-webkit-box;display:-webkit-flex;display:-ms-flexbox;display:flex;-webkit-flex-direction:row;-ms-flex-direction:row;flex-direction:row;gap:8px;}/*!sc*/ @media screen and (max-width:320px){.bVgnfw{-webkit-box-flex:1;-webkit-flex-grow:1;-ms-flex-positive:1;flex-grow:1;}}/*!sc*/ .CEgMp{position:relative;}/*!sc*/ @media screen and (max-width:380px){.CEgMp .ref-selector-button-text-container{max-width:80px;}}/*!sc*/ @media screen and (max-width:320px){.CEgMp{-webkit-box-flex:1;-webkit-flex-grow:1;-ms-flex-positive:1;flex-grow:1;}.CEgMp .overview-ref-selector{width:100%;}.CEgMp .overview-ref-selector > span{display:-webkit-box;display:-webkit-flex;display:-ms-flexbox;display:flex;-webkit-box-pack:start;-webkit-justify-content:flex-start;-ms-flex-pack:start;justify-content:flex-start;}.CEgMp .overview-ref-selector > span > span[data-component="text"]{-webkit-box-flex:1;-webkit-flex-grow:1;-ms-flex-positive:1;flex-grow:1;}}/*!sc*/ .gUkoLg{-webkit-box-pack:center;-webkit-justify-content:center;-ms-flex-pack:center;justify-content:center;}/*!sc*/ .bZBlpz{display:-webkit-box;display:-webkit-flex;display:-ms-flexbox;display:flex;width:100%;}/*!sc*/ .lhTYNA{margin-right:4px;color:var(--fgColor-muted,var(--color-fg-muted,#656d76));}/*!sc*/ .ffLUq{font-size:14px;min-width:0;overflow:hidden;text-overflow:ellipsis;white-space:nowrap;}/*!sc*/ .hzSPyu{display:-webkit-box;display:-webkit-flex;display:-ms-flexbox;display:flex;pointer-events:none;}/*!sc*/ .fLXEGX{display:-webkit-box;display:-webkit-flex;display:-ms-flexbox;display:flex;}/*!sc*/ @media screen and (max-width:1079px){.fLXEGX{display:none;}}/*!sc*/ .dqfxud{display:-webkit-box;display:-webkit-flex;display:-ms-flexbox;display:flex;}/*!sc*/ @media screen and (min-width:1080px){.dqfxud{display:none;}}/*!sc*/ @media screen and (max-width:543px){.dqfxud{display:none;}}/*!sc*/ .jxTzTd{display:-webkit-box;display:-webkit-flex;display:-ms-flexbox;display:flex;padding-left:8px;gap:8px;}/*!sc*/ .gqqBXN{display:-webkit-box;display:-webkit-flex;display:-ms-flexbox;display:flex;gap:8px;}/*!sc*/ @media screen and (max-width:543px){.gqqBXN{display:none;}}/*!sc*/ .dzXgxt{display:-webkit-box;display:-webkit-flex;display:-ms-flexbox;display:flex;}/*!sc*/ @media screen and (max-width:1011px){.dzXgxt{display:none;}}/*!sc*/ .iWFGlI{margin-left:8px;margin-right:8px;margin:0;}/*!sc*/ .YUPas{display:-webkit-box;display:-webkit-flex;display:-ms-flexbox;display:flex;}/*!sc*/ @media screen and (min-width:1012px){.YUPas{display:none;}}/*!sc*/ .izFOf{display:-webkit-box;display:-webkit-flex;display:-ms-flexbox;display:flex;}/*!sc*/ @media screen and (min-width:544px){.izFOf{display:none;}}/*!sc*/ .vIPPs{display:-webkit-box;display:-webkit-flex;display:-ms-flexbox;display:flex;-webkit-flex-direction:column;-ms-flex-direction:column;flex-direction:column;gap:16px;}/*!sc*/ .fdROMU{width:100%;border-collapse:separate;border-spacing:0;border:1px solid;border-color:var(--borderColor-default,var(--color-border-default,#d0d7de));border-radius:6px;table-layout:fixed;overflow:unset;}/*!sc*/ .jGKpsv{height:0px;line-height:0px;}/*!sc*/ .jGKpsv tr{height:0px;font-size:0px;}/*!sc*/ .jdgHnn{padding:16px;color:var(--fgColor-muted,var(--color-fg-muted,#656d76));font-size:12px;text-align:left;height:40px;}/*!sc*/ .jdgHnn th{padding-left:16px;background-color:var(--bgColor-muted,var(--color-canvas-subtle,#f6f8fa));}/*!sc*/ .bQivRW{width:100%;border-top-left-radius:6px;}/*!sc*/ @media screen and (min-width:544px){.bQivRW{display:none;}}/*!sc*/ .ldkMIO{width:40%;border-top-left-radius:6px;}/*!sc*/ @media screen and (max-width:543px){.ldkMIO{display:none;}}/*!sc*/ .jMbWeI{text-align:right;padding-right:16px;width:136px;border-top-right-radius:6px;}/*!sc*/ .gpqjiB{color:var(--fgColor-muted,var(--color-fg-muted,#656d76));font-size:12px;height:40px;}/*!sc*/ .dzCJzi{display:-webkit-box;display:-webkit-flex;display:-ms-flexbox;display:flex;-webkit-flex-direction:row;-ms-flex-direction:row;flex-direction:row;-webkit-flex-wrap:wrap;-ms-flex-wrap:wrap;flex-wrap:wrap;-webkit-box-pack:justify;-webkit-justify-content:space-between;-ms-flex-pack:justify;justify-content:space-between;-webkit-align-items:center;-webkit-box-align:center;-ms-flex-align:center;align-items:center;gap:8px;min-width:273px;padding:8px;}/*!sc*/ @media screen and (min-width:544px){.dzCJzi{-webkit-flex-wrap:nowrap;-ms-flex-wrap:nowrap;flex-wrap:nowrap;}}/*!sc*/ .eNCcrz{text-align:center;vertical-align:center;height:40px;border-top:1px solid;border-color:var(--borderColor-default,var(--color-border-default,#d0d7de));}/*!sc*/ .bHTcCe{border-top:1px solid var(--borderColor-default,var(--color-border-default));cursor:pointer;}/*!sc*/ .csrIcr{display:-webkit-box;display:-webkit-flex;display:-ms-flexbox;display:flex;-webkit-box-flex:1;-webkit-flex-grow:1;-ms-flex-positive:1;flex-grow:1;gap:16px;}/*!sc*/ .bUQNHB{border:1px solid;border-color:var(--borderColor-default,var(--color-border-default,#d0d7de));border-radius:6px;display:-webkit-box;display:-webkit-flex;display:-ms-flexbox;display:flex;-webkit-flex-direction:column;-ms-flex-direction:column;flex-direction:column;-webkit-box-flex:1;-webkit-flex-grow:1;-ms-flex-positive:1;flex-grow:1;}/*!sc*/ @media screen and (max-width:543px){.bUQNHB{margin-left:-16px;margin-right:-16px;max-width:calc(100% + 32px);}}/*!sc*/ @media screen and (min-width:544px){.bUQNHB{max-width:100%;}}/*!sc*/ .jPdcfu{display:-webkit-box;display:-webkit-flex;display:-ms-flexbox;display:flex;border-bottom:1px solid;border-bottom-color:var(--borderColor-default,var(--color-border-default,#d0d7de));-webkit-align-items:center;-webkit-box-align:center;-ms-flex-align:center;align-items:center;padding-right:8px;position:-webkit-sticky;position:sticky;top:0;background-color:var(--bgColor-default,var(--color-canvas-default,#ffffff));z-index:1;border-top-left-radius:6px;border-top-right-radius:6px;}/*!sc*/ .hUCRAk{display:-webkit-box;display:-webkit-flex;display:-ms-flexbox;display:flex;-webkit-flex-direction:column;-ms-flex-direction:column;flex-direction:column;-webkit-align-items:center;-webkit-box-align:center;-ms-flex-align:center;align-items:center;}/*!sc*/ .QkQOb{padding:32px;overflow:auto;}/*!sc*/ data-styled.g1[id="Box-sc-g0xbh4-0"]{content:"iVEunk,jzuOtQ,bGojzy,iNSVHo,bVgnfw,CEgMp,gUkoLg,bZBlpz,lhTYNA,ffLUq,hzSPyu,fLXEGX,dqfxud,jxTzTd,gqqBXN,dzXgxt,iWFGlI,YUPas,izFOf,vIPPs,fdROMU,jGKpsv,jdgHnn,bQivRW,ldkMIO,jMbWeI,gpqjiB,dzCJzi,eNCcrz,bHTcCe,csrIcr,bUQNHB,jPdcfu,hUCRAk,QkQOb,"}/*!sc*/ .eMMFM{min-width:0;}/*!sc*/ .eMMFM:where([data-size='small']){font-size:var(--text-body-size-small,0.75rem);line-height:var(--text-body-lineHeight-small,1.6666);}/*!sc*/ .eMMFM:where([data-size='medium']){font-size:var(--text-body-size-medium,0.875rem);line-height:var(--text-body-lineHeight-medium,1.4285);}/*!sc*/ .eMMFM:where([data-size='large']){font-size:var(--text-body-size-large,1rem);line-height:var(--text-body-lineHeight-large,1.5);}/*!sc*/ .eMMFM:where([data-weight='light']){font-weight:var(--base-text-weight-light,300);}/*!sc*/ .eMMFM:where([data-weight='normal']){font-weight:var(--base-text-weight-normal,400);}/*!sc*/ .eMMFM:where([data-weight='medium']){font-weight:var(--base-text-weight-medium,500);}/*!sc*/ .eMMFM:where([data-weight='semibold']){font-weight:var(--base-text-weight-semibold,600);}/*!sc*/ data-styled.g3[id="Text__StyledText-sc-17v1xeu-0"]{content:"eMMFM,"}/*!sc*/ .brGdpi{position:absolute;width:1px;height:1px;padding:0;margin:-1px;overflow:hidden;-webkit-clip:rect(0,0,0,0);clip:rect(0,0,0,0);white-space:nowrap;border-width:0;}/*!sc*/ data-styled.g4[id="_VisuallyHidden__VisuallyHidden-sc-11jhm7a-0"]{content:"brGdpi,"}/*!sc*/ .gwqFqs{font-size:14px;line-height:20px;color:var(--fgColor-default,var(--color-fg-default,#1F2328));vertical-align:middle;background-color:var(--bgColor-default,var(--color-canvas-default,#ffffff));border:1px solid var(--control-borderColor-rest,var(--borderColor-default,var(--color-border-default,#d0d7de)));border-radius:6px;outline:none;box-shadow:var(--shadow-inset,var(--color-primer-shadow-inset,inset 0 1px 0 rgba(208,215,222,0.2)));display:-webkit-inline-box;display:-webkit-inline-flex;display:-ms-inline-flexbox;display:inline-flex;-webkit-align-items:stretch;-webkit-box-align:stretch;-ms-flex-align:stretch;align-items:stretch;min-height:32px;overflow:hidden;display:-webkit-box;display:-webkit-flex;display:-ms-flexbox;display:flex;min-width:160px;}/*!sc*/ .gwqFqs input,.gwqFqs textarea{cursor:text;}/*!sc*/ .gwqFqs select{cursor:pointer;}/*!sc*/ .gwqFqs input::-webkit-input-placeholder,.gwqFqs textarea::-webkit-input-placeholder,.gwqFqs select::-webkit-input-placeholder{color:var(---control-fgColor-placeholder,var(--fgColor-muted,var(--color-fg-muted,#656d76)));}/*!sc*/ .gwqFqs input::-moz-placeholder,.gwqFqs textarea::-moz-placeholder,.gwqFqs select::-moz-placeholder{color:var(---control-fgColor-placeholder,var(--fgColor-muted,var(--color-fg-muted,#656d76)));}/*!sc*/ .gwqFqs input:-ms-input-placeholder,.gwqFqs textarea:-ms-input-placeholder,.gwqFqs select:-ms-input-placeholder{color:var(---control-fgColor-placeholder,var(--fgColor-muted,var(--color-fg-muted,#656d76)));}/*!sc*/ .gwqFqs input::placeholder,.gwqFqs textarea::placeholder,.gwqFqs select::placeholder{color:var(---control-fgColor-placeholder,var(--fgColor-muted,var(--color-fg-muted,#656d76)));}/*!sc*/ .gwqFqs:focus-within{border-color:var(--fgColor-accent,var(--color-accent-fg,#0969da));outline:2px solid var(--fgColor-accent,var(--color-accent-fg,#0969da));outline-offset:-1px;}/*!sc*/ .gwqFqs > textarea{padding:12px;}/*!sc*/ @media (min-width:768px){.gwqFqs{font-size:14px;}}/*!sc*/ data-styled.g9[id="TextInputWrapper__TextInputBaseWrapper-sc-1mqhpbi-0"]{content:"gwqFqs,"}/*!sc*/ .decvaq{background-repeat:no-repeat;background-position:right 8px center;padding-left:12px;padding-right:12px;display:-webkit-box;display:-webkit-flex;display:-ms-flexbox;display:flex;min-width:160px;}/*!sc*/ .decvaq > :not(:last-child){margin-right:8px;}/*!sc*/ .decvaq .TextInput-icon,.decvaq .TextInput-action{-webkit-align-self:center;-ms-flex-item-align:center;align-self:center;color:var(--fgColor-muted,var(--color-fg-muted,#656d76));-webkit-flex-shrink:0;-ms-flex-negative:0;flex-shrink:0;}/*!sc*/ .decvaq > input,.decvaq > select{padding-left:0;padding-right:0;}/*!sc*/ data-styled.g10[id="TextInputWrapper-sc-1mqhpbi-1"]{content:"decvaq,"}/*!sc*/ .gVXRRg{border-radius:6px;border:1px solid;border-color:var(--button-default-borderColor-rest,var(--button-default-borderColor-rest,var(--color-btn-border,rgba(31,35,40,0.15))));font-family:inherit;font-weight:500;font-size:14px;cursor:pointer;-webkit-appearance:none;-moz-appearance:none;appearance:none;-webkit-user-select:none;-moz-user-select:none;-ms-user-select:none;user-select:none;-webkit-text-decoration:none;text-decoration:none;text-align:center;display:-webkit-box;display:-webkit-flex;display:-ms-flexbox;display:flex;-webkit-align-items:center;-webkit-box-align:center;-ms-flex-align:center;align-items:center;-webkit-box-pack:justify;-webkit-justify-content:space-between;-ms-flex-pack:justify;justify-content:space-between;height:32px;padding:0 12px;gap:8px;min-width:-webkit-max-content;min-width:-moz-max-content;min-width:max-content;-webkit-transition:80ms cubic-bezier(0.65,0,0.35,1);transition:80ms cubic-bezier(0.65,0,0.35,1);-webkit-transition-property:color,fill,background-color,border-color;transition-property:color,fill,background-color,border-color;color:var(--button-default-fgColor-rest,var(--color-btn-text,#24292f));background-color:var(--button-default-bgColor-rest,var(--color-btn-bg,#f6f8fa));box-shadow:var(--button-default-shadow-resting,var(--color-btn-shadow,0 1px 0 rgba(31,35,40,0.04))),var(--button-default-shadow-inset,var(--color-btn-inset-shadow,inset 0 1px 0 rgba(255,255,255,0.25)));}/*!sc*/ .gVXRRg:focus:not(:disabled){box-shadow:none;outline:2px solid var(--fgColor-accent,var(--color-accent-fg,#0969da));outline-offset:-2px;}/*!sc*/ .gVXRRg:focus:not(:disabled):not(:focus-visible){outline:solid 1px transparent;}/*!sc*/ .gVXRRg:focus-visible:not(:disabled){box-shadow:none;outline:2px solid var(--fgColor-accent,var(--color-accent-fg,#0969da));outline-offset:-2px;}/*!sc*/ .gVXRRg[href]{display:-webkit-inline-box;display:-webkit-inline-flex;display:-ms-inline-flexbox;display:inline-flex;}/*!sc*/ .gVXRRg[href]:hover{-webkit-text-decoration:none;text-decoration:none;}/*!sc*/ .gVXRRg:hover{-webkit-transition-duration:80ms;transition-duration:80ms;}/*!sc*/ .gVXRRg:active{-webkit-transition:none;transition:none;}/*!sc*/ .gVXRRg[data-inactive]{cursor:auto;}/*!sc*/ .gVXRRg:disabled{cursor:not-allowed;box-shadow:none;color:var(--fgColor-disabled,var(--color-primer-fg-disabled,#8c959f));border-color:var(--button-default-borderColor-disabled,var(--button-default-borderColor-rest,var(--color-btn-border,rgba(31,35,40,0.15))));background-color:var(--button-default-bgColor-disabled,var(--control-bgColor-disabled,var(--color-input-disabled-bg,rgba(175,184,193,0.2))));}/*!sc*/ .gVXRRg:disabled [data-component=ButtonCounter]{color:inherit;}/*!sc*/ @media (forced-colors:active){.gVXRRg:focus{outline:solid 1px transparent;}}/*!sc*/ .gVXRRg [data-component=ButtonCounter]{font-size:12px;background-color:var(--buttonCounter-default-bgColor-rest,var(--color-btn-counter-bg,rgba(31,35,40,0.08)));}/*!sc*/ .gVXRRg[data-component=IconButton]{display:inline-grid;padding:unset;place-content:center;width:32px;min-width:unset;}/*!sc*/ .gVXRRg[data-size="small"]{padding:0 8px;height:28px;gap:4px;font-size:12px;}/*!sc*/ .gVXRRg[data-size="small"] [data-component="text"]{line-height:1.6666667;}/*!sc*/ .gVXRRg[data-size="small"] [data-component=ButtonCounter]{font-size:12px;}/*!sc*/ .gVXRRg[data-size="small"] [data-component="buttonContent"] > :not(:last-child){margin-right:4px;}/*!sc*/ .gVXRRg[data-size="small"][data-component=IconButton]{width:28px;padding:unset;}/*!sc*/ .gVXRRg[data-size="large"]{padding:0 16px;height:40px;gap:8px;}/*!sc*/ .gVXRRg[data-size="large"] [data-component="buttonContent"] > :not(:last-child){margin-right:8px;}/*!sc*/ .gVXRRg[data-size="large"][data-component=IconButton]{width:40px;padding:unset;}/*!sc*/ .gVXRRg[data-block="block"]{width:100%;}/*!sc*/ .gVXRRg[data-label-wrap="true"]{min-width:-webkit-fit-content;min-width:-moz-fit-content;min-width:fit-content;height:unset;min-height:var(--control-medium-size,2rem);}/*!sc*/ .gVXRRg[data-label-wrap="true"] [data-component="buttonContent"]{-webkit-flex:1 1 auto;-ms-flex:1 1 auto;flex:1 1 auto;-webkit-align-self:stretch;-ms-flex-item-align:stretch;align-self:stretch;padding-block:calc(var(--control-medium-paddingBlock,0.375rem) - 2px);}/*!sc*/ .gVXRRg[data-label-wrap="true"] [data-component="text"]{white-space:unset;word-break:break-word;}/*!sc*/ .gVXRRg[data-label-wrap="true"][data-size="small"]{height:unset;min-height:var(--control-small-size,1.75rem);}/*!sc*/ .gVXRRg[data-label-wrap="true"][data-size="small"] [data-component="buttonContent"]{padding-block:calc(var(--control-small-paddingBlock,0.25rem) - 2px);}/*!sc*/ .gVXRRg[data-label-wrap="true"][data-size="large"]{height:unset;min-height:var(--control-large-size,2.5rem);padding-inline:var(--control-large-paddingInline-spacious,1rem);}/*!sc*/ .gVXRRg[data-label-wrap="true"][data-size="large"] [data-component="buttonContent"]{padding-block:calc(var(--control-large-paddingBlock,0.625rem) - 2px);}/*!sc*/ .gVXRRg[data-inactive]:not([disabled]){background-color:var(--button-inactive-bgColor,var(--button-inactive-bgColor-rest,var(--color-btn-inactive-bg,#eaeef2)));border-color:var(--button-inactive-bgColor,var(--button-inactive-bgColor-rest,var(--color-btn-inactive-bg,#eaeef2)));color:var(--button-inactive-fgColor,var(--button-inactive-fgColor-rest,var(--color-btn-inactive-text,#57606a)));}/*!sc*/ .gVXRRg[data-inactive]:not([disabled]):focus-visible{box-shadow:none;}/*!sc*/ .gVXRRg [data-component="leadingVisual"]{grid-area:leadingVisual;}/*!sc*/ .gVXRRg [data-component="text"]{grid-area:text;line-height:1.4285714;white-space:nowrap;}/*!sc*/ .gVXRRg [data-component="trailingVisual"]{grid-area:trailingVisual;}/*!sc*/ .gVXRRg [data-component="trailingAction"]{margin-right:-4px;}/*!sc*/ .gVXRRg [data-component="buttonContent"]{-webkit-flex:1 0 auto;-ms-flex:1 0 auto;flex:1 0 auto;display:grid;grid-template-areas:"leadingVisual text trailingVisual";grid-template-columns:min-content minmax(0,auto) min-content;-webkit-align-items:center;-webkit-box-align:center;-ms-flex-align:center;align-items:center;-webkit-align-content:center;-ms-flex-line-pack:center;align-content:center;}/*!sc*/ .gVXRRg [data-component="buttonContent"] > :not(:last-child){margin-right:8px;}/*!sc*/ .gVXRRg [data-component="loadingSpinner"]{grid-area:text;margin-right:0px !important;place-self:center;color:var(--fgColor-muted,var(--color-fg-muted,#656d76));}/*!sc*/ .gVXRRg [data-component="loadingSpinner"] + [data-component="text"]{visibility:hidden;}/*!sc*/ .gVXRRg:hover:not([disabled]):not([data-inactive]){background-color:var(--button-default-bgColor-hover,var(--color-btn-hover-bg,#f3f4f6));border-color:var(--button-default-borderColor-hover,var(--button-default-borderColor-hover,var(--color-btn-hover-border,rgba(31,35,40,0.15))));}/*!sc*/ .gVXRRg:active:not([disabled]):not([data-inactive]){background-color:var(--button-default-bgColor-active,var(--color-btn-active-bg,hsla(220,14%,93%,1)));border-color:var(--button-default-borderColor-active,var(--button-default-borderColor-active,var(--color-btn-active-border,rgba(31,35,40,0.15))));}/*!sc*/ .gVXRRg[aria-expanded=true]{background-color:var(--button-default-bgColor-active,var(--color-btn-active-bg,hsla(220,14%,93%,1)));border-color:var(--button-default-borderColor-active,var(--button-default-borderColor-active,var(--color-btn-active-border,rgba(31,35,40,0.15))));}/*!sc*/ .gVXRRg [data-component="leadingVisual"],.gVXRRg [data-component="trailingVisual"],.gVXRRg [data-component="trailingAction"]{color:var(--button-color,var(--fgColor-muted,var(--color-fg-muted,#656d76)));}/*!sc*/ .gVXRRg[data-component="IconButton"][data-no-visuals]:not(:disabled){color:var(--fgColor-muted,var(--color-fg-muted,#656d76));}/*!sc*/ .gVXRRg[data-size="medium"]{display:-webkit-box;display:-webkit-flex;display:-ms-flexbox;display:flex;min-width:0;}/*!sc*/ .gVXRRg[data-size="medium"] svg{color:var(--fgColor-muted,var(--color-fg-muted,#656d76));}/*!sc*/ .gVXRRg[data-size="medium"] > span{width:inherit;}/*!sc*/ .loAzyw{border-radius:6px;border:1px solid;border-color:transparent;font-family:inherit;font-weight:500;font-size:14px;cursor:pointer;-webkit-appearance:none;-moz-appearance:none;appearance:none;-webkit-user-select:none;-moz-user-select:none;-ms-user-select:none;user-select:none;-webkit-text-decoration:none;text-decoration:none;text-align:center;display:-webkit-box;display:-webkit-flex;display:-ms-flexbox;display:flex;-webkit-align-items:center;-webkit-box-align:center;-ms-flex-align:center;align-items:center;-webkit-box-pack:justify;-webkit-justify-content:space-between;-ms-flex-pack:justify;justify-content:space-between;height:32px;padding:0 12px;gap:8px;min-width:-webkit-max-content;min-width:-moz-max-content;min-width:max-content;-webkit-transition:80ms cubic-bezier(0.65,0,0.35,1);transition:80ms cubic-bezier(0.65,0,0.35,1);-webkit-transition-property:color,fill,background-color,border-color;transition-property:color,fill,background-color,border-color;color:var(--button-invisible-fgColor-rest,var(--button-default-fgColor-rest,var(--color-btn-text,#24292f)));background-color:transparent;box-shadow:none;}/*!sc*/ .loAzyw:focus:not(:disabled){box-shadow:none;outline:2px solid var(--fgColor-accent,var(--color-accent-fg,#0969da));outline-offset:-2px;}/*!sc*/ .loAzyw:focus:not(:disabled):not(:focus-visible){outline:solid 1px transparent;}/*!sc*/ .loAzyw:focus-visible:not(:disabled){box-shadow:none;outline:2px solid var(--fgColor-accent,var(--color-accent-fg,#0969da));outline-offset:-2px;}/*!sc*/ .loAzyw[href]{display:-webkit-inline-box;display:-webkit-inline-flex;display:-ms-inline-flexbox;display:inline-flex;}/*!sc*/ .loAzyw[href]:hover{-webkit-text-decoration:none;text-decoration:none;}/*!sc*/ .loAzyw:hover{-webkit-transition-duration:80ms;transition-duration:80ms;}/*!sc*/ .loAzyw:active{-webkit-transition:none;transition:none;}/*!sc*/ .loAzyw[data-inactive]{cursor:auto;}/*!sc*/ .loAzyw:disabled{cursor:not-allowed;box-shadow:none;color:var(--fgColor-disabled,var(--color-primer-fg-disabled,#8c959f));background-color:var(--button-invisible-bgColor-disabled,transparent);}/*!sc*/ .loAzyw:disabled [data-component=ButtonCounter],.loAzyw:disabled [data-component="leadingVisual"],.loAzyw:disabled [data-component="trailingAction"]{color:inherit;}/*!sc*/ @media (forced-colors:active){.loAzyw:focus{outline:solid 1px transparent;}}/*!sc*/ .loAzyw [data-component=ButtonCounter]{font-size:12px;}/*!sc*/ .loAzyw[data-component=IconButton]{display:inline-grid;padding:unset;place-content:center;width:32px;min-width:unset;}/*!sc*/ .loAzyw[data-size="small"]{padding:0 8px;height:28px;gap:4px;font-size:12px;}/*!sc*/ .loAzyw[data-size="small"] [data-component="text"]{line-height:1.6666667;}/*!sc*/ .loAzyw[data-size="small"] [data-component=ButtonCounter]{font-size:12px;}/*!sc*/ .loAzyw[data-size="small"] [data-component="buttonContent"] > :not(:last-child){margin-right:4px;}/*!sc*/ .loAzyw[data-size="small"][data-component=IconButton]{width:28px;padding:unset;}/*!sc*/ .loAzyw[data-size="large"]{padding:0 16px;height:40px;gap:8px;}/*!sc*/ .loAzyw[data-size="large"] [data-component="buttonContent"] > :not(:last-child){margin-right:8px;}/*!sc*/ .loAzyw[data-size="large"][data-component=IconButton]{width:40px;padding:unset;}/*!sc*/ .loAzyw[data-block="block"]{width:100%;}/*!sc*/ .loAzyw[data-label-wrap="true"]{min-width:-webkit-fit-content;min-width:-moz-fit-content;min-width:fit-content;height:unset;min-height:var(--control-medium-size,2rem);}/*!sc*/ .loAzyw[data-label-wrap="true"] [data-component="buttonContent"]{-webkit-flex:1 1 auto;-ms-flex:1 1 auto;flex:1 1 auto;-webkit-align-self:stretch;-ms-flex-item-align:stretch;align-self:stretch;padding-block:calc(var(--control-medium-paddingBlock,0.375rem) - 2px);}/*!sc*/ .loAzyw[data-label-wrap="true"] [data-component="text"]{white-space:unset;word-break:break-word;}/*!sc*/ .loAzyw[data-label-wrap="true"][data-size="small"]{height:unset;min-height:var(--control-small-size,1.75rem);}/*!sc*/ .loAzyw[data-label-wrap="true"][data-size="small"] [data-component="buttonContent"]{padding-block:calc(var(--control-small-paddingBlock,0.25rem) - 2px);}/*!sc*/ .loAzyw[data-label-wrap="true"][data-size="large"]{height:unset;min-height:var(--control-large-size,2.5rem);padding-inline:var(--control-large-paddingInline-spacious,1rem);}/*!sc*/ .loAzyw[data-label-wrap="true"][data-size="large"] [data-component="buttonContent"]{padding-block:calc(var(--control-large-paddingBlock,0.625rem) - 2px);}/*!sc*/ .loAzyw[data-inactive]:not([disabled]){background-color:var(--button-inactive-bgColor,var(--button-inactive-bgColor-rest,var(--color-btn-inactive-bg,#eaeef2)));border-color:var(--button-inactive-bgColor,var(--button-inactive-bgColor-rest,var(--color-btn-inactive-bg,#eaeef2)));color:var(--button-inactive-fgColor,var(--button-inactive-fgColor-rest,var(--color-btn-inactive-text,#57606a)));}/*!sc*/ .loAzyw[data-inactive]:not([disabled]):focus-visible{box-shadow:none;}/*!sc*/ .loAzyw [data-component="leadingVisual"]{grid-area:leadingVisual;color:var(--button-invisible-iconColor-rest,var(--fgColor-muted,var(--color-fg-muted,#656d76)));}/*!sc*/ .loAzyw [data-component="text"]{grid-area:text;line-height:1.4285714;white-space:nowrap;}/*!sc*/ .loAzyw [data-component="trailingVisual"]{grid-area:trailingVisual;color:var(--button-invisible-iconColor-rest,var(--fgColor-muted,var(--color-fg-muted,#656d76)));}/*!sc*/ .loAzyw [data-component="trailingAction"]{margin-right:-4px;color:var(--button-invisible-iconColor-rest,var(--fgColor-muted,var(--color-fg-muted,#656d76)));}/*!sc*/ .loAzyw [data-component="buttonContent"]{-webkit-flex:1 0 auto;-ms-flex:1 0 auto;flex:1 0 auto;display:grid;grid-template-areas:"leadingVisual text trailingVisual";grid-template-columns:min-content minmax(0,auto) min-content;-webkit-align-items:center;-webkit-box-align:center;-ms-flex-align:center;align-items:center;-webkit-align-content:center;-ms-flex-line-pack:center;align-content:center;}/*!sc*/ .loAzyw [data-component="buttonContent"] > :not(:last-child){margin-right:8px;}/*!sc*/ .loAzyw [data-component="loadingSpinner"]{grid-area:text;margin-right:0px !important;place-self:center;color:var(--fgColor-muted,var(--color-fg-muted,#656d76));}/*!sc*/ .loAzyw [data-component="loadingSpinner"] + [data-component="text"]{visibility:hidden;}/*!sc*/ .loAzyw:hover:not([disabled]){background-color:var(--control-transparent-bgColor-hover,var(--color-action-list-item-default-hover-bg,rgba(208,215,222,0.32)));}/*!sc*/ .loAzyw:active:not([disabled]){background-color:var(--control-transparent-bgColor-active,var(--color-action-list-item-default-active-bg,rgba(208,215,222,0.48)));}/*!sc*/ .loAzyw[aria-expanded=true]{background-color:var(--control-transparent-bgColor-selected,var(--color-action-list-item-default-selected-bg,rgba(208,215,222,0.24)));}/*!sc*/ .loAzyw[data-component="IconButton"][data-no-visuals]{color:var(--button-invisible-iconColor-rest,var(--fgColor-muted,var(--color-fg-muted,#656d76)));}/*!sc*/ .loAzyw[data-no-visuals]{color:var(--button-invisible-fgColor-rest,var(--button-default-fgColor-rest,var(--color-btn-text,#24292f)));}/*!sc*/ .loAzyw:has([data-component="ButtonCounter"]){color:var(--button-invisible-fgColor-rest,var(--button-default-fgColor-rest,var(--color-btn-text,#24292f)));}/*!sc*/ .loAzyw:disabled[data-no-visuals]{color:var(--fgColor-disabled,var(--color-primer-fg-disabled,#8c959f));}/*!sc*/ .loAzyw:disabled[data-no-visuals] [data-component=ButtonCounter]{color:inherit;}/*!sc*/ .loAzyw[data-size="medium"]{color:var(--fgColor-muted,var(--color-fg-muted,#656d76));padding-left:4px;padding-right:4px;}/*!sc*/ .loAzyw[data-size="medium"] span[data-component="leadingVisual"]{margin-right:4px !important;}/*!sc*/ .cXsOlJ{border-radius:6px;border:1px solid;border-color:transparent;font-family:inherit;font-weight:500;font-size:14px;cursor:pointer;-webkit-appearance:none;-moz-appearance:none;appearance:none;-webkit-user-select:none;-moz-user-select:none;-ms-user-select:none;user-select:none;-webkit-text-decoration:none;text-decoration:none;text-align:center;display:-webkit-box;display:-webkit-flex;display:-ms-flexbox;display:flex;-webkit-align-items:center;-webkit-box-align:center;-ms-flex-align:center;align-items:center;-webkit-box-pack:justify;-webkit-justify-content:space-between;-ms-flex-pack:justify;justify-content:space-between;height:32px;padding:0 12px;gap:8px;min-width:-webkit-max-content;min-width:-moz-max-content;min-width:max-content;-webkit-transition:80ms cubic-bezier(0.65,0,0.35,1);transition:80ms cubic-bezier(0.65,0,0.35,1);-webkit-transition-property:color,fill,background-color,border-color;transition-property:color,fill,background-color,border-color;color:var(--button-invisible-fgColor-rest,var(--button-default-fgColor-rest,var(--color-btn-text,#24292f)));background-color:transparent;box-shadow:none;}/*!sc*/ .cXsOlJ:focus:not(:disabled){box-shadow:none;outline:2px solid var(--fgColor-accent,var(--color-accent-fg,#0969da));outline-offset:-2px;}/*!sc*/ .cXsOlJ:focus:not(:disabled):not(:focus-visible){outline:solid 1px transparent;}/*!sc*/ .cXsOlJ:focus-visible:not(:disabled){box-shadow:none;outline:2px solid var(--fgColor-accent,var(--color-accent-fg,#0969da));outline-offset:-2px;}/*!sc*/ .cXsOlJ[href]{display:-webkit-inline-box;display:-webkit-inline-flex;display:-ms-inline-flexbox;display:inline-flex;}/*!sc*/ .cXsOlJ[href]:hover{-webkit-text-decoration:none;text-decoration:none;}/*!sc*/ .cXsOlJ:hover{-webkit-transition-duration:80ms;transition-duration:80ms;}/*!sc*/ .cXsOlJ:active{-webkit-transition:none;transition:none;}/*!sc*/ .cXsOlJ[data-inactive]{cursor:auto;}/*!sc*/ .cXsOlJ:disabled{cursor:not-allowed;box-shadow:none;color:var(--fgColor-disabled,var(--color-primer-fg-disabled,#8c959f));background-color:var(--button-invisible-bgColor-disabled,transparent);}/*!sc*/ .cXsOlJ:disabled [data-component=ButtonCounter],.cXsOlJ:disabled [data-component="leadingVisual"],.cXsOlJ:disabled [data-component="trailingAction"]{color:inherit;}/*!sc*/ @media (forced-colors:active){.cXsOlJ:focus{outline:solid 1px transparent;}}/*!sc*/ .cXsOlJ [data-component=ButtonCounter]{font-size:12px;}/*!sc*/ .cXsOlJ[data-component=IconButton]{display:inline-grid;padding:unset;place-content:center;width:32px;min-width:unset;}/*!sc*/ .cXsOlJ[data-size="small"]{padding:0 8px;height:28px;gap:4px;font-size:12px;}/*!sc*/ .cXsOlJ[data-size="small"] [data-component="text"]{line-height:1.6666667;}/*!sc*/ .cXsOlJ[data-size="small"] [data-component=ButtonCounter]{font-size:12px;}/*!sc*/ .cXsOlJ[data-size="small"] [data-component="buttonContent"] > :not(:last-child){margin-right:4px;}/*!sc*/ .cXsOlJ[data-size="small"][data-component=IconButton]{width:28px;padding:unset;}/*!sc*/ .cXsOlJ[data-size="large"]{padding:0 16px;height:40px;gap:8px;}/*!sc*/ .cXsOlJ[data-size="large"] [data-component="buttonContent"] > :not(:last-child){margin-right:8px;}/*!sc*/ .cXsOlJ[data-size="large"][data-component=IconButton]{width:40px;padding:unset;}/*!sc*/ .cXsOlJ[data-block="block"]{width:100%;}/*!sc*/ .cXsOlJ[data-label-wrap="true"]{min-width:-webkit-fit-content;min-width:-moz-fit-content;min-width:fit-content;height:unset;min-height:var(--control-medium-size,2rem);}/*!sc*/ .cXsOlJ[data-label-wrap="true"] [data-component="buttonContent"]{-webkit-flex:1 1 auto;-ms-flex:1 1 auto;flex:1 1 auto;-webkit-align-self:stretch;-ms-flex-item-align:stretch;align-self:stretch;padding-block:calc(var(--control-medium-paddingBlock,0.375rem) - 2px);}/*!sc*/ .cXsOlJ[data-label-wrap="true"] [data-component="text"]{white-space:unset;word-break:break-word;}/*!sc*/ .cXsOlJ[data-label-wrap="true"][data-size="small"]{height:unset;min-height:var(--control-small-size,1.75rem);}/*!sc*/ .cXsOlJ[data-label-wrap="true"][data-size="small"] [data-component="buttonContent"]{padding-block:calc(var(--control-small-paddingBlock,0.25rem) - 2px);}/*!sc*/ .cXsOlJ[data-label-wrap="true"][data-size="large"]{height:unset;min-height:var(--control-large-size,2.5rem);padding-inline:var(--control-large-paddingInline-spacious,1rem);}/*!sc*/ .cXsOlJ[data-label-wrap="true"][data-size="large"] [data-component="buttonContent"]{padding-block:calc(var(--control-large-paddingBlock,0.625rem) - 2px);}/*!sc*/ .cXsOlJ[data-inactive]:not([disabled]){background-color:var(--button-inactive-bgColor,var(--button-inactive-bgColor-rest,var(--color-btn-inactive-bg,#eaeef2)));border-color:var(--button-inactive-bgColor,var(--button-inactive-bgColor-rest,var(--color-btn-inactive-bg,#eaeef2)));color:var(--button-inactive-fgColor,var(--button-inactive-fgColor-rest,var(--color-btn-inactive-text,#57606a)));}/*!sc*/ .cXsOlJ[data-inactive]:not([disabled]):focus-visible{box-shadow:none;}/*!sc*/ .cXsOlJ [data-component="leadingVisual"]{grid-area:leadingVisual;color:var(--button-invisible-iconColor-rest,var(--fgColor-muted,var(--color-fg-muted,#656d76)));}/*!sc*/ .cXsOlJ [data-component="text"]{grid-area:text;line-height:1.4285714;white-space:nowrap;}/*!sc*/ .cXsOlJ [data-component="trailingVisual"]{grid-area:trailingVisual;color:var(--button-invisible-iconColor-rest,var(--fgColor-muted,var(--color-fg-muted,#656d76)));}/*!sc*/ .cXsOlJ [data-component="trailingAction"]{margin-right:-4px;color:var(--button-invisible-iconColor-rest,var(--fgColor-muted,var(--color-fg-muted,#656d76)));}/*!sc*/ .cXsOlJ [data-component="buttonContent"]{-webkit-flex:1 0 auto;-ms-flex:1 0 auto;flex:1 0 auto;display:grid;grid-template-areas:"leadingVisual text trailingVisual";grid-template-columns:min-content minmax(0,auto) min-content;-webkit-align-items:center;-webkit-box-align:center;-ms-flex-align:center;align-items:center;-webkit-align-content:center;-ms-flex-line-pack:center;align-content:center;}/*!sc*/ .cXsOlJ [data-component="buttonContent"] > :not(:last-child){margin-right:8px;}/*!sc*/ .cXsOlJ [data-component="loadingSpinner"]{grid-area:text;margin-right:0px !important;place-self:center;color:var(--fgColor-muted,var(--color-fg-muted,#656d76));}/*!sc*/ .cXsOlJ [data-component="loadingSpinner"] + [data-component="text"]{visibility:hidden;}/*!sc*/ .cXsOlJ:hover:not([disabled]){background-color:var(--control-transparent-bgColor-hover,var(--color-action-list-item-default-hover-bg,rgba(208,215,222,0.32)));}/*!sc*/ .cXsOlJ:active:not([disabled]){background-color:var(--control-transparent-bgColor-active,var(--color-action-list-item-default-active-bg,rgba(208,215,222,0.48)));}/*!sc*/ .cXsOlJ[aria-expanded=true]{background-color:var(--control-transparent-bgColor-selected,var(--color-action-list-item-default-selected-bg,rgba(208,215,222,0.24)));}/*!sc*/ .cXsOlJ[data-component="IconButton"][data-no-visuals]{color:var(--button-invisible-iconColor-rest,var(--fgColor-muted,var(--color-fg-muted,#656d76)));}/*!sc*/ .cXsOlJ[data-no-visuals]{color:var(--button-invisible-fgColor-rest,var(--button-default-fgColor-rest,var(--color-btn-text,#24292f)));}/*!sc*/ .cXsOlJ:has([data-component="ButtonCounter"]){color:var(--button-invisible-fgColor-rest,var(--button-default-fgColor-rest,var(--color-btn-text,#24292f)));}/*!sc*/ .cXsOlJ:disabled[data-no-visuals]{color:var(--fgColor-disabled,var(--color-primer-fg-disabled,#8c959f));}/*!sc*/ .cXsOlJ:disabled[data-no-visuals] [data-component=ButtonCounter]{color:inherit;}/*!sc*/ .cXsOlJ[data-size="medium"][data-no-visuals]{color:var(--fgColor-muted,var(--color-fg-muted,#656d76));}/*!sc*/ .gGdPyq{border-radius:6px;border:1px solid;border-color:var(--button-default-borderColor-rest,var(--button-default-borderColor-rest,var(--color-btn-border,rgba(31,35,40,0.15))));font-family:inherit;font-weight:500;font-size:14px;cursor:pointer;-webkit-appearance:none;-moz-appearance:none;appearance:none;-webkit-user-select:none;-moz-user-select:none;-ms-user-select:none;user-select:none;-webkit-text-decoration:none;text-decoration:none;text-align:center;display:-webkit-box;display:-webkit-flex;display:-ms-flexbox;display:flex;-webkit-align-items:center;-webkit-box-align:center;-ms-flex-align:center;align-items:center;-webkit-box-pack:justify;-webkit-justify-content:space-between;-ms-flex-pack:justify;justify-content:space-between;height:32px;padding:0 12px;gap:8px;min-width:-webkit-max-content;min-width:-moz-max-content;min-width:max-content;-webkit-transition:80ms cubic-bezier(0.65,0,0.35,1);transition:80ms cubic-bezier(0.65,0,0.35,1);-webkit-transition-property:color,fill,background-color,border-color;transition-property:color,fill,background-color,border-color;color:var(--button-default-fgColor-rest,var(--color-btn-text,#24292f));background-color:var(--button-default-bgColor-rest,var(--color-btn-bg,#f6f8fa));box-shadow:var(--button-default-shadow-resting,var(--color-btn-shadow,0 1px 0 rgba(31,35,40,0.04))),var(--button-default-shadow-inset,var(--color-btn-inset-shadow,inset 0 1px 0 rgba(255,255,255,0.25)));}/*!sc*/ .gGdPyq:focus:not(:disabled){box-shadow:none;outline:2px solid var(--fgColor-accent,var(--color-accent-fg,#0969da));outline-offset:-2px;}/*!sc*/ .gGdPyq:focus:not(:disabled):not(:focus-visible){outline:solid 1px transparent;}/*!sc*/ .gGdPyq:focus-visible:not(:disabled){box-shadow:none;outline:2px solid var(--fgColor-accent,var(--color-accent-fg,#0969da));outline-offset:-2px;}/*!sc*/ .gGdPyq[href]{display:-webkit-inline-box;display:-webkit-inline-flex;display:-ms-inline-flexbox;display:inline-flex;}/*!sc*/ .gGdPyq[href]:hover{-webkit-text-decoration:none;text-decoration:none;}/*!sc*/ .gGdPyq:hover{-webkit-transition-duration:80ms;transition-duration:80ms;}/*!sc*/ .gGdPyq:active{-webkit-transition:none;transition:none;}/*!sc*/ .gGdPyq[data-inactive]{cursor:auto;}/*!sc*/ .gGdPyq:disabled{cursor:not-allowed;box-shadow:none;color:var(--fgColor-disabled,var(--color-primer-fg-disabled,#8c959f));border-color:var(--button-default-borderColor-disabled,var(--button-default-borderColor-rest,var(--color-btn-border,rgba(31,35,40,0.15))));background-color:var(--button-default-bgColor-disabled,var(--control-bgColor-disabled,var(--color-input-disabled-bg,rgba(175,184,193,0.2))));}/*!sc*/ .gGdPyq:disabled [data-component=ButtonCounter]{color:inherit;}/*!sc*/ @media (forced-colors:active){.gGdPyq:focus{outline:solid 1px transparent;}}/*!sc*/ .gGdPyq [data-component=ButtonCounter]{font-size:12px;background-color:var(--buttonCounter-default-bgColor-rest,var(--color-btn-counter-bg,rgba(31,35,40,0.08)));}/*!sc*/ .gGdPyq[data-component=IconButton]{display:inline-grid;padding:unset;place-content:center;width:32px;min-width:unset;}/*!sc*/ .gGdPyq[data-size="small"]{padding:0 8px;height:28px;gap:4px;font-size:12px;}/*!sc*/ .gGdPyq[data-size="small"] [data-component="text"]{line-height:1.6666667;}/*!sc*/ .gGdPyq[data-size="small"] [data-component=ButtonCounter]{font-size:12px;}/*!sc*/ .gGdPyq[data-size="small"] [data-component="buttonContent"] > :not(:last-child){margin-right:4px;}/*!sc*/ .gGdPyq[data-size="small"][data-component=IconButton]{width:28px;padding:unset;}/*!sc*/ .gGdPyq[data-size="large"]{padding:0 16px;height:40px;gap:8px;}/*!sc*/ .gGdPyq[data-size="large"] [data-component="buttonContent"] > :not(:last-child){margin-right:8px;}/*!sc*/ .gGdPyq[data-size="large"][data-component=IconButton]{width:40px;padding:unset;}/*!sc*/ .gGdPyq[data-block="block"]{width:100%;}/*!sc*/ .gGdPyq[data-label-wrap="true"]{min-width:-webkit-fit-content;min-width:-moz-fit-content;min-width:fit-content;height:unset;min-height:var(--control-medium-size,2rem);}/*!sc*/ .gGdPyq[data-label-wrap="true"] [data-component="buttonContent"]{-webkit-flex:1 1 auto;-ms-flex:1 1 auto;flex:1 1 auto;-webkit-align-self:stretch;-ms-flex-item-align:stretch;align-self:stretch;padding-block:calc(var(--control-medium-paddingBlock,0.375rem) - 2px);}/*!sc*/ .gGdPyq[data-label-wrap="true"] [data-component="text"]{white-space:unset;word-break:break-word;}/*!sc*/ .gGdPyq[data-label-wrap="true"][data-size="small"]{height:unset;min-height:var(--control-small-size,1.75rem);}/*!sc*/ .gGdPyq[data-label-wrap="true"][data-size="small"] [data-component="buttonContent"]{padding-block:calc(var(--control-small-paddingBlock,0.25rem) - 2px);}/*!sc*/ .gGdPyq[data-label-wrap="true"][data-size="large"]{height:unset;min-height:var(--control-large-size,2.5rem);padding-inline:var(--control-large-paddingInline-spacious,1rem);}/*!sc*/ .gGdPyq[data-label-wrap="true"][data-size="large"] [data-component="buttonContent"]{padding-block:calc(var(--control-large-paddingBlock,0.625rem) - 2px);}/*!sc*/ .gGdPyq[data-inactive]:not([disabled]){background-color:var(--button-inactive-bgColor,var(--button-inactive-bgColor-rest,var(--color-btn-inactive-bg,#eaeef2)));border-color:var(--button-inactive-bgColor,var(--button-inactive-bgColor-rest,var(--color-btn-inactive-bg,#eaeef2)));color:var(--button-inactive-fgColor,var(--button-inactive-fgColor-rest,var(--color-btn-inactive-text,#57606a)));}/*!sc*/ .gGdPyq[data-inactive]:not([disabled]):focus-visible{box-shadow:none;}/*!sc*/ .gGdPyq [data-component="leadingVisual"]{grid-area:leadingVisual;}/*!sc*/ .gGdPyq [data-component="text"]{grid-area:text;line-height:1.4285714;white-space:nowrap;}/*!sc*/ .gGdPyq [data-component="trailingVisual"]{grid-area:trailingVisual;}/*!sc*/ .gGdPyq [data-component="trailingAction"]{margin-right:-4px;}/*!sc*/ .gGdPyq [data-component="buttonContent"]{-webkit-flex:1 0 auto;-ms-flex:1 0 auto;flex:1 0 auto;display:grid;grid-template-areas:"leadingVisual text trailingVisual";grid-template-columns:min-content minmax(0,auto) min-content;-webkit-align-items:center;-webkit-box-align:center;-ms-flex-align:center;align-items:center;-webkit-align-content:center;-ms-flex-line-pack:center;align-content:center;}/*!sc*/ .gGdPyq [data-component="buttonContent"] > :not(:last-child){margin-right:8px;}/*!sc*/ .gGdPyq [data-component="loadingSpinner"]{grid-area:text;margin-right:0px !important;place-self:center;color:var(--fgColor-muted,var(--color-fg-muted,#656d76));}/*!sc*/ .gGdPyq [data-component="loadingSpinner"] + [data-component="text"]{visibility:hidden;}/*!sc*/ .gGdPyq:hover:not([disabled]):not([data-inactive]){background-color:var(--button-default-bgColor-hover,var(--color-btn-hover-bg,#f3f4f6));border-color:var(--button-default-borderColor-hover,var(--button-default-borderColor-hover,var(--color-btn-hover-border,rgba(31,35,40,0.15))));}/*!sc*/ .gGdPyq:active:not([disabled]):not([data-inactive]){background-color:var(--button-default-bgColor-active,var(--color-btn-active-bg,hsla(220,14%,93%,1)));border-color:var(--button-default-borderColor-active,var(--button-default-borderColor-active,var(--color-btn-active-border,rgba(31,35,40,0.15))));}/*!sc*/ .gGdPyq[aria-expanded=true]{background-color:var(--button-default-bgColor-active,var(--color-btn-active-bg,hsla(220,14%,93%,1)));border-color:var(--button-default-borderColor-active,var(--button-default-borderColor-active,var(--color-btn-active-border,rgba(31,35,40,0.15))));}/*!sc*/ .gGdPyq [data-component="leadingVisual"],.gGdPyq [data-component="trailingVisual"],.gGdPyq [data-component="trailingAction"]{color:var(--button-color,var(--fgColor-muted,var(--color-fg-muted,#656d76)));}/*!sc*/ .gGdPyq[data-component="IconButton"][data-no-visuals]:not(:disabled){color:var(--fgColor-muted,var(--color-fg-muted,#656d76));}/*!sc*/ .bmlmSe{border-radius:6px;border:1px solid;border-color:var(--button-primary-borderColor-rest,var(--color-btn-primary-border,rgba(31,35,40,0.15)));font-family:inherit;font-weight:500;font-size:14px;cursor:pointer;-webkit-appearance:none;-moz-appearance:none;appearance:none;-webkit-user-select:none;-moz-user-select:none;-ms-user-select:none;user-select:none;-webkit-text-decoration:none;text-decoration:none;text-align:center;display:-webkit-box;display:-webkit-flex;display:-ms-flexbox;display:flex;-webkit-align-items:center;-webkit-box-align:center;-ms-flex-align:center;align-items:center;-webkit-box-pack:justify;-webkit-justify-content:space-between;-ms-flex-pack:justify;justify-content:space-between;height:32px;padding:0 12px;gap:8px;min-width:-webkit-max-content;min-width:-moz-max-content;min-width:max-content;-webkit-transition:80ms cubic-bezier(0.65,0,0.35,1);transition:80ms cubic-bezier(0.65,0,0.35,1);-webkit-transition-property:color,fill,background-color,border-color;transition-property:color,fill,background-color,border-color;color:var(--button-primary-fgColor-rest,var(--color-btn-primary-text,#ffffff));background-color:var(--button-primary-bgColor-rest,var(--color-btn-primary-bg,#1f883d));box-shadow:var(--shadow-resting-small,var(--color-btn-primary-shadow,0 1px 0 rgba(31,35,40,0.1)));}/*!sc*/ .bmlmSe:focus:not(:disabled){box-shadow:none;outline:2px solid var(--fgColor-accent,var(--color-accent-fg,#0969da));outline-offset:-2px;}/*!sc*/ .bmlmSe:focus:not(:disabled):not(:focus-visible){outline:solid 1px transparent;}/*!sc*/ .bmlmSe:focus-visible:not(:disabled){box-shadow:none;outline:2px solid var(--fgColor-accent,var(--color-accent-fg,#0969da));outline-offset:-2px;}/*!sc*/ .bmlmSe[href]{display:-webkit-inline-box;display:-webkit-inline-flex;display:-ms-inline-flexbox;display:inline-flex;}/*!sc*/ .bmlmSe[href]:hover{-webkit-text-decoration:none;text-decoration:none;}/*!sc*/ .bmlmSe:hover{-webkit-transition-duration:80ms;transition-duration:80ms;}/*!sc*/ .bmlmSe:active{-webkit-transition:none;transition:none;}/*!sc*/ .bmlmSe[data-inactive]{cursor:auto;}/*!sc*/ .bmlmSe:disabled{cursor:not-allowed;box-shadow:none;color:var(--button-primary-fgColor-disabled,var(--color-btn-primary-disabled-text,rgba(255,255,255,0.8)));background-color:var(--button-primary-bgColor-disabled,var(--color-btn-primary-disabled-bg,#94d3a2));border-color:var(--button-primary-borderColor-disabled,var(--color-btn-primary-disabled-border,rgba(31,35,40,0.15)));}/*!sc*/ .bmlmSe:disabled [data-component=ButtonCounter]{color:inherit;}/*!sc*/ @media (forced-colors:active){.bmlmSe:focus{outline:solid 1px transparent;}}/*!sc*/ .bmlmSe [data-component=ButtonCounter]{font-size:12px;background-color:var(--buttonCounter-primary-bgColor-rest,var(--color-btn-primary-counter-bg,rgba(0,45,17,0.2)));color:var(--button-primary-fgColor-rest,var(--color-btn-primary-text,#ffffff));}/*!sc*/ .bmlmSe[data-component=IconButton]{display:inline-grid;padding:unset;place-content:center;width:32px;min-width:unset;}/*!sc*/ .bmlmSe[data-size="small"]{padding:0 8px;height:28px;gap:4px;font-size:12px;}/*!sc*/ .bmlmSe[data-size="small"] [data-component="text"]{line-height:1.6666667;}/*!sc*/ .bmlmSe[data-size="small"] [data-component=ButtonCounter]{font-size:12px;}/*!sc*/ .bmlmSe[data-size="small"] [data-component="buttonContent"] > :not(:last-child){margin-right:4px;}/*!sc*/ .bmlmSe[data-size="small"][data-component=IconButton]{width:28px;padding:unset;}/*!sc*/ .bmlmSe[data-size="large"]{padding:0 16px;height:40px;gap:8px;}/*!sc*/ .bmlmSe[data-size="large"] [data-component="buttonContent"] > :not(:last-child){margin-right:8px;}/*!sc*/ .bmlmSe[data-size="large"][data-component=IconButton]{width:40px;padding:unset;}/*!sc*/ .bmlmSe[data-block="block"]{width:100%;}/*!sc*/ .bmlmSe[data-label-wrap="true"]{min-width:-webkit-fit-content;min-width:-moz-fit-content;min-width:fit-content;height:unset;min-height:var(--control-medium-size,2rem);}/*!sc*/ .bmlmSe[data-label-wrap="true"] [data-component="buttonContent"]{-webkit-flex:1 1 auto;-ms-flex:1 1 auto;flex:1 1 auto;-webkit-align-self:stretch;-ms-flex-item-align:stretch;align-self:stretch;padding-block:calc(var(--control-medium-paddingBlock,0.375rem) - 2px);}/*!sc*/ .bmlmSe[data-label-wrap="true"] [data-component="text"]{white-space:unset;word-break:break-word;}/*!sc*/ .bmlmSe[data-label-wrap="true"][data-size="small"]{height:unset;min-height:var(--control-small-size,1.75rem);}/*!sc*/ .bmlmSe[data-label-wrap="true"][data-size="small"] [data-component="buttonContent"]{padding-block:calc(var(--control-small-paddingBlock,0.25rem) - 2px);}/*!sc*/ .bmlmSe[data-label-wrap="true"][data-size="large"]{height:unset;min-height:var(--control-large-size,2.5rem);padding-inline:var(--control-large-paddingInline-spacious,1rem);}/*!sc*/ .bmlmSe[data-label-wrap="true"][data-size="large"] [data-component="buttonContent"]{padding-block:calc(var(--control-large-paddingBlock,0.625rem) - 2px);}/*!sc*/ .bmlmSe[data-inactive]:not([disabled]){background-color:var(--button-inactive-bgColor,var(--button-inactive-bgColor-rest,var(--color-btn-inactive-bg,#eaeef2)));border-color:var(--button-inactive-bgColor,var(--button-inactive-bgColor-rest,var(--color-btn-inactive-bg,#eaeef2)));color:var(--button-inactive-fgColor,var(--button-inactive-fgColor-rest,var(--color-btn-inactive-text,#57606a)));}/*!sc*/ .bmlmSe[data-inactive]:not([disabled]):focus-visible{box-shadow:none;}/*!sc*/ .bmlmSe [data-component="leadingVisual"]{grid-area:leadingVisual;}/*!sc*/ .bmlmSe [data-component="text"]{grid-area:text;line-height:1.4285714;white-space:nowrap;}/*!sc*/ .bmlmSe [data-component="trailingVisual"]{grid-area:trailingVisual;}/*!sc*/ .bmlmSe [data-component="trailingAction"]{margin-right:-4px;}/*!sc*/ .bmlmSe [data-component="buttonContent"]{-webkit-flex:1 0 auto;-ms-flex:1 0 auto;flex:1 0 auto;display:grid;grid-template-areas:"leadingVisual text trailingVisual";grid-template-columns:min-content minmax(0,auto) min-content;-webkit-align-items:center;-webkit-box-align:center;-ms-flex-align:center;align-items:center;-webkit-align-content:center;-ms-flex-line-pack:center;align-content:center;}/*!sc*/ .bmlmSe [data-component="buttonContent"] > :not(:last-child){margin-right:8px;}/*!sc*/ .bmlmSe [data-component="loadingSpinner"]{grid-area:text;margin-right:0px !important;place-self:center;color:var(--fgColor-muted,var(--color-fg-muted,#656d76));}/*!sc*/ .bmlmSe [data-component="loadingSpinner"] + [data-component="text"]{visibility:hidden;}/*!sc*/ .bmlmSe:hover:not([disabled]):not([data-inactive]){color:btn.primary.hoverText;background-color:var(--button-primary-bgColor-hover,var(--color-btn-primary-hover-bg,#1a7f37));}/*!sc*/ .bmlmSe:focus:not([disabled]){box-shadow:inset 0 0 0 3px;}/*!sc*/ .bmlmSe:focus-visible:not([disabled]){box-shadow:inset 0 0 0 3px;}/*!sc*/ .bmlmSe:active:not([disabled]):not([data-inactive]){background-color:var(--button-primary-bgColor-active,var(--color-btn-primary-selected-bg,hsla(137,66%,28%,1)));box-shadow:var(--button-primary-shadow-selected,var(--color-btn-primary-selected-shadow,inset 0 1px 0 rgba(0,45,17,0.2)));}/*!sc*/ .bmlmSe[aria-expanded=true]{background-color:var(--button-primary-bgColor-active,var(--color-btn-primary-selected-bg,hsla(137,66%,28%,1)));box-shadow:var(--button-primary-shadow-selected,var(--color-btn-primary-selected-shadow,inset 0 1px 0 rgba(0,45,17,0.2)));}/*!sc*/ .dPmZyJ{border-radius:6px;border:1px solid;border-color:transparent;font-family:inherit;font-weight:500;font-size:14px;cursor:pointer;-webkit-appearance:none;-moz-appearance:none;appearance:none;-webkit-user-select:none;-moz-user-select:none;-ms-user-select:none;user-select:none;-webkit-text-decoration:none;text-decoration:none;text-align:center;display:-webkit-box;display:-webkit-flex;display:-ms-flexbox;display:flex;-webkit-align-items:center;-webkit-box-align:center;-ms-flex-align:center;align-items:center;-webkit-box-pack:justify;-webkit-justify-content:space-between;-ms-flex-pack:justify;justify-content:space-between;height:32px;padding:0 12px;gap:8px;min-width:-webkit-max-content;min-width:-moz-max-content;min-width:max-content;-webkit-transition:80ms cubic-bezier(0.65,0,0.35,1);transition:80ms cubic-bezier(0.65,0,0.35,1);-webkit-transition-property:color,fill,background-color,border-color;transition-property:color,fill,background-color,border-color;color:var(--button-invisible-fgColor-rest,var(--button-default-fgColor-rest,var(--color-btn-text,#24292f)));background-color:transparent;box-shadow:none;}/*!sc*/ .dPmZyJ:focus:not(:disabled){box-shadow:none;outline:2px solid var(--fgColor-accent,var(--color-accent-fg,#0969da));outline-offset:-2px;}/*!sc*/ .dPmZyJ:focus:not(:disabled):not(:focus-visible){outline:solid 1px transparent;}/*!sc*/ .dPmZyJ:focus-visible:not(:disabled){box-shadow:none;outline:2px solid var(--fgColor-accent,var(--color-accent-fg,#0969da));outline-offset:-2px;}/*!sc*/ .dPmZyJ[href]{display:-webkit-inline-box;display:-webkit-inline-flex;display:-ms-inline-flexbox;display:inline-flex;}/*!sc*/ .dPmZyJ[href]:hover{-webkit-text-decoration:none;text-decoration:none;}/*!sc*/ .dPmZyJ:hover{-webkit-transition-duration:80ms;transition-duration:80ms;}/*!sc*/ .dPmZyJ:active{-webkit-transition:none;transition:none;}/*!sc*/ .dPmZyJ[data-inactive]{cursor:auto;}/*!sc*/ .dPmZyJ:disabled{cursor:not-allowed;box-shadow:none;color:var(--fgColor-disabled,var(--color-primer-fg-disabled,#8c959f));background-color:var(--button-invisible-bgColor-disabled,transparent);}/*!sc*/ .dPmZyJ:disabled [data-component=ButtonCounter],.dPmZyJ:disabled [data-component="leadingVisual"],.dPmZyJ:disabled [data-component="trailingAction"]{color:inherit;}/*!sc*/ @media (forced-colors:active){.dPmZyJ:focus{outline:solid 1px transparent;}}/*!sc*/ .dPmZyJ [data-component=ButtonCounter]{font-size:12px;}/*!sc*/ .dPmZyJ[data-component=IconButton]{display:inline-grid;padding:unset;place-content:center;width:32px;min-width:unset;}/*!sc*/ .dPmZyJ[data-size="small"]{padding:0 8px;height:28px;gap:4px;font-size:12px;}/*!sc*/ .dPmZyJ[data-size="small"] [data-component="text"]{line-height:1.6666667;}/*!sc*/ .dPmZyJ[data-size="small"] [data-component=ButtonCounter]{font-size:12px;}/*!sc*/ .dPmZyJ[data-size="small"] [data-component="buttonContent"] > :not(:last-child){margin-right:4px;}/*!sc*/ .dPmZyJ[data-size="small"][data-component=IconButton]{width:28px;padding:unset;}/*!sc*/ .dPmZyJ[data-size="large"]{padding:0 16px;height:40px;gap:8px;}/*!sc*/ .dPmZyJ[data-size="large"] [data-component="buttonContent"] > :not(:last-child){margin-right:8px;}/*!sc*/ .dPmZyJ[data-size="large"][data-component=IconButton]{width:40px;padding:unset;}/*!sc*/ .dPmZyJ[data-block="block"]{width:100%;}/*!sc*/ .dPmZyJ[data-label-wrap="true"]{min-width:-webkit-fit-content;min-width:-moz-fit-content;min-width:fit-content;height:unset;min-height:var(--control-medium-size,2rem);}/*!sc*/ .dPmZyJ[data-label-wrap="true"] [data-component="buttonContent"]{-webkit-flex:1 1 auto;-ms-flex:1 1 auto;flex:1 1 auto;-webkit-align-self:stretch;-ms-flex-item-align:stretch;align-self:stretch;padding-block:calc(var(--control-medium-paddingBlock,0.375rem) - 2px);}/*!sc*/ .dPmZyJ[data-label-wrap="true"] [data-component="text"]{white-space:unset;word-break:break-word;}/*!sc*/ .dPmZyJ[data-label-wrap="true"][data-size="small"]{height:unset;min-height:var(--control-small-size,1.75rem);}/*!sc*/ .dPmZyJ[data-label-wrap="true"][data-size="small"] [data-component="buttonContent"]{padding-block:calc(var(--control-small-paddingBlock,0.25rem) - 2px);}/*!sc*/ .dPmZyJ[data-label-wrap="true"][data-size="large"]{height:unset;min-height:var(--control-large-size,2.5rem);padding-inline:var(--control-large-paddingInline-spacious,1rem);}/*!sc*/ .dPmZyJ[data-label-wrap="true"][data-size="large"] [data-component="buttonContent"]{padding-block:calc(var(--control-large-paddingBlock,0.625rem) - 2px);}/*!sc*/ .dPmZyJ[data-inactive]:not([disabled]){background-color:var(--button-inactive-bgColor,var(--button-inactive-bgColor-rest,var(--color-btn-inactive-bg,#eaeef2)));border-color:var(--button-inactive-bgColor,var(--button-inactive-bgColor-rest,var(--color-btn-inactive-bg,#eaeef2)));color:var(--button-inactive-fgColor,var(--button-inactive-fgColor-rest,var(--color-btn-inactive-text,#57606a)));}/*!sc*/ .dPmZyJ[data-inactive]:not([disabled]):focus-visible{box-shadow:none;}/*!sc*/ .dPmZyJ [data-component="leadingVisual"]{grid-area:leadingVisual;color:var(--button-invisible-iconColor-rest,var(--fgColor-muted,var(--color-fg-muted,#656d76)));}/*!sc*/ .dPmZyJ [data-component="text"]{grid-area:text;line-height:1.4285714;white-space:nowrap;}/*!sc*/ .dPmZyJ [data-component="trailingVisual"]{grid-area:trailingVisual;color:var(--button-invisible-iconColor-rest,var(--fgColor-muted,var(--color-fg-muted,#656d76)));}/*!sc*/ .dPmZyJ [data-component="trailingAction"]{margin-right:-4px;color:var(--button-invisible-iconColor-rest,var(--fgColor-muted,var(--color-fg-muted,#656d76)));}/*!sc*/ .dPmZyJ [data-component="buttonContent"]{-webkit-flex:1 0 auto;-ms-flex:1 0 auto;flex:1 0 auto;display:grid;grid-template-areas:"leadingVisual text trailingVisual";grid-template-columns:min-content minmax(0,auto) min-content;-webkit-align-items:center;-webkit-box-align:center;-ms-flex-align:center;align-items:center;-webkit-align-content:center;-ms-flex-line-pack:center;align-content:center;}/*!sc*/ .dPmZyJ [data-component="buttonContent"] > :not(:last-child){margin-right:8px;}/*!sc*/ .dPmZyJ [data-component="loadingSpinner"]{grid-area:text;margin-right:0px !important;place-self:center;color:var(--fgColor-muted,var(--color-fg-muted,#656d76));}/*!sc*/ .dPmZyJ [data-component="loadingSpinner"] + [data-component="text"]{visibility:hidden;}/*!sc*/ .dPmZyJ:hover:not([disabled]){background-color:var(--control-transparent-bgColor-hover,var(--color-action-list-item-default-hover-bg,rgba(208,215,222,0.32)));}/*!sc*/ .dPmZyJ:active:not([disabled]){background-color:var(--control-transparent-bgColor-active,var(--color-action-list-item-default-active-bg,rgba(208,215,222,0.48)));}/*!sc*/ .dPmZyJ[aria-expanded=true]{background-color:var(--control-transparent-bgColor-selected,var(--color-action-list-item-default-selected-bg,rgba(208,215,222,0.24)));}/*!sc*/ .dPmZyJ[data-component="IconButton"][data-no-visuals]{color:var(--button-invisible-iconColor-rest,var(--fgColor-muted,var(--color-fg-muted,#656d76)));}/*!sc*/ .dPmZyJ[data-no-visuals]{color:var(--button-invisible-fgColor-rest,var(--button-default-fgColor-rest,var(--color-btn-text,#24292f)));}/*!sc*/ .dPmZyJ:has([data-component="ButtonCounter"]){color:var(--button-invisible-fgColor-rest,var(--button-default-fgColor-rest,var(--color-btn-text,#24292f)));}/*!sc*/ .dPmZyJ:disabled[data-no-visuals]{color:var(--fgColor-disabled,var(--color-primer-fg-disabled,#8c959f));}/*!sc*/ .dPmZyJ:disabled[data-no-visuals] [data-component=ButtonCounter]{color:inherit;}/*!sc*/ .gXPTqA{border-radius:6px;border:1px solid;border-color:transparent;font-family:inherit;font-weight:500;font-size:14px;cursor:pointer;-webkit-appearance:none;-moz-appearance:none;appearance:none;-webkit-user-select:none;-moz-user-select:none;-ms-user-select:none;user-select:none;-webkit-text-decoration:none;text-decoration:none;text-align:center;display:-webkit-box;display:-webkit-flex;display:-ms-flexbox;display:flex;-webkit-align-items:center;-webkit-box-align:center;-ms-flex-align:center;align-items:center;-webkit-box-pack:justify;-webkit-justify-content:space-between;-ms-flex-pack:justify;justify-content:space-between;height:32px;padding:0 12px;gap:8px;min-width:-webkit-max-content;min-width:-moz-max-content;min-width:max-content;-webkit-transition:80ms cubic-bezier(0.65,0,0.35,1);transition:80ms cubic-bezier(0.65,0,0.35,1);-webkit-transition-property:color,fill,background-color,border-color;transition-property:color,fill,background-color,border-color;color:var(--button-invisible-fgColor-rest,var(--button-default-fgColor-rest,var(--color-btn-text,#24292f)));background-color:transparent;box-shadow:none;}/*!sc*/ .gXPTqA:focus:not(:disabled){box-shadow:none;outline:2px solid var(--fgColor-accent,var(--color-accent-fg,#0969da));outline-offset:-2px;}/*!sc*/ .gXPTqA:focus:not(:disabled):not(:focus-visible){outline:solid 1px transparent;}/*!sc*/ .gXPTqA:focus-visible:not(:disabled){box-shadow:none;outline:2px solid var(--fgColor-accent,var(--color-accent-fg,#0969da));outline-offset:-2px;}/*!sc*/ .gXPTqA[href]{display:-webkit-inline-box;display:-webkit-inline-flex;display:-ms-inline-flexbox;display:inline-flex;}/*!sc*/ .gXPTqA[href]:hover{-webkit-text-decoration:none;text-decoration:none;}/*!sc*/ .gXPTqA:hover{-webkit-transition-duration:80ms;transition-duration:80ms;}/*!sc*/ .gXPTqA:active{-webkit-transition:none;transition:none;}/*!sc*/ .gXPTqA[data-inactive]{cursor:auto;}/*!sc*/ .gXPTqA:disabled{cursor:not-allowed;box-shadow:none;color:var(--fgColor-disabled,var(--color-primer-fg-disabled,#8c959f));background-color:var(--button-invisible-bgColor-disabled,transparent);}/*!sc*/ .gXPTqA:disabled [data-component=ButtonCounter],.gXPTqA:disabled [data-component="leadingVisual"],.gXPTqA:disabled [data-component="trailingAction"]{color:inherit;}/*!sc*/ @media (forced-colors:active){.gXPTqA:focus{outline:solid 1px transparent;}}/*!sc*/ .gXPTqA [data-component=ButtonCounter]{font-size:12px;}/*!sc*/ .gXPTqA[data-component=IconButton]{display:inline-grid;padding:unset;place-content:center;width:32px;min-width:unset;}/*!sc*/ .gXPTqA[data-size="small"]{padding:0 8px;height:28px;gap:4px;font-size:12px;}/*!sc*/ .gXPTqA[data-size="small"] [data-component="text"]{line-height:1.6666667;}/*!sc*/ .gXPTqA[data-size="small"] [data-component=ButtonCounter]{font-size:12px;}/*!sc*/ .gXPTqA[data-size="small"] [data-component="buttonContent"] > :not(:last-child){margin-right:4px;}/*!sc*/ .gXPTqA[data-size="small"][data-component=IconButton]{width:28px;padding:unset;}/*!sc*/ .gXPTqA[data-size="large"]{padding:0 16px;height:40px;gap:8px;}/*!sc*/ .gXPTqA[data-size="large"] [data-component="buttonContent"] > :not(:last-child){margin-right:8px;}/*!sc*/ .gXPTqA[data-size="large"][data-component=IconButton]{width:40px;padding:unset;}/*!sc*/ .gXPTqA[data-block="block"]{width:100%;}/*!sc*/ .gXPTqA[data-label-wrap="true"]{min-width:-webkit-fit-content;min-width:-moz-fit-content;min-width:fit-content;height:unset;min-height:var(--control-medium-size,2rem);}/*!sc*/ .gXPTqA[data-label-wrap="true"] [data-component="buttonContent"]{-webkit-flex:1 1 auto;-ms-flex:1 1 auto;flex:1 1 auto;-webkit-align-self:stretch;-ms-flex-item-align:stretch;align-self:stretch;padding-block:calc(var(--control-medium-paddingBlock,0.375rem) - 2px);}/*!sc*/ .gXPTqA[data-label-wrap="true"] [data-component="text"]{white-space:unset;word-break:break-word;}/*!sc*/ .gXPTqA[data-label-wrap="true"][data-size="small"]{height:unset;min-height:var(--control-small-size,1.75rem);}/*!sc*/ .gXPTqA[data-label-wrap="true"][data-size="small"] [data-component="buttonContent"]{padding-block:calc(var(--control-small-paddingBlock,0.25rem) - 2px);}/*!sc*/ .gXPTqA[data-label-wrap="true"][data-size="large"]{height:unset;min-height:var(--control-large-size,2.5rem);padding-inline:var(--control-large-paddingInline-spacious,1rem);}/*!sc*/ .gXPTqA[data-label-wrap="true"][data-size="large"] [data-component="buttonContent"]{padding-block:calc(var(--control-large-paddingBlock,0.625rem) - 2px);}/*!sc*/ .gXPTqA[data-inactive]:not([disabled]){background-color:var(--button-inactive-bgColor,var(--button-inactive-bgColor-rest,var(--color-btn-inactive-bg,#eaeef2)));border-color:var(--button-inactive-bgColor,var(--button-inactive-bgColor-rest,var(--color-btn-inactive-bg,#eaeef2)));color:var(--button-inactive-fgColor,var(--button-inactive-fgColor-rest,var(--color-btn-inactive-text,#57606a)));}/*!sc*/ .gXPTqA[data-inactive]:not([disabled]):focus-visible{box-shadow:none;}/*!sc*/ .gXPTqA [data-component="leadingVisual"]{grid-area:leadingVisual;color:var(--button-invisible-iconColor-rest,var(--fgColor-muted,var(--color-fg-muted,#656d76)));}/*!sc*/ .gXPTqA [data-component="text"]{grid-area:text;line-height:1.4285714;white-space:nowrap;}/*!sc*/ .gXPTqA [data-component="trailingVisual"]{grid-area:trailingVisual;color:var(--button-invisible-iconColor-rest,var(--fgColor-muted,var(--color-fg-muted,#656d76)));}/*!sc*/ .gXPTqA [data-component="trailingAction"]{margin-right:-4px;color:var(--button-invisible-iconColor-rest,var(--fgColor-muted,var(--color-fg-muted,#656d76)));}/*!sc*/ .gXPTqA [data-component="buttonContent"]{-webkit-flex:1 0 auto;-ms-flex:1 0 auto;flex:1 0 auto;display:grid;grid-template-areas:"leadingVisual text trailingVisual";grid-template-columns:min-content minmax(0,auto) min-content;-webkit-align-items:center;-webkit-box-align:center;-ms-flex-align:center;align-items:center;-webkit-align-content:center;-ms-flex-line-pack:center;align-content:center;}/*!sc*/ .gXPTqA [data-component="buttonContent"] > :not(:last-child){margin-right:8px;}/*!sc*/ .gXPTqA [data-component="loadingSpinner"]{grid-area:text;margin-right:0px !important;place-self:center;color:var(--fgColor-muted,var(--color-fg-muted,#656d76));}/*!sc*/ .gXPTqA [data-component="loadingSpinner"] + [data-component="text"]{visibility:hidden;}/*!sc*/ .gXPTqA:hover:not([disabled]){background-color:var(--control-transparent-bgColor-hover,var(--color-action-list-item-default-hover-bg,rgba(208,215,222,0.32)));}/*!sc*/ .gXPTqA:active:not([disabled]){background-color:var(--control-transparent-bgColor-active,var(--color-action-list-item-default-active-bg,rgba(208,215,222,0.48)));}/*!sc*/ .gXPTqA[aria-expanded=true]{background-color:var(--control-transparent-bgColor-selected,var(--color-action-list-item-default-selected-bg,rgba(208,215,222,0.24)));}/*!sc*/ .gXPTqA[data-component="IconButton"][data-no-visuals]{color:var(--button-invisible-iconColor-rest,var(--fgColor-muted,var(--color-fg-muted,#656d76)));}/*!sc*/ .gXPTqA[data-no-visuals]{color:var(--button-invisible-fgColor-rest,var(--button-default-fgColor-rest,var(--color-btn-text,#24292f)));}/*!sc*/ .gXPTqA:has([data-component="ButtonCounter"]){color:var(--button-invisible-fgColor-rest,var(--button-default-fgColor-rest,var(--color-btn-text,#24292f)));}/*!sc*/ .gXPTqA:disabled[data-no-visuals]{color:var(--fgColor-disabled,var(--color-primer-fg-disabled,#8c959f));}/*!sc*/ .gXPTqA:disabled[data-no-visuals] [data-component=ButtonCounter]{color:inherit;}/*!sc*/ .gXPTqA[data-size="medium"]{color:var(--fgColor-muted,var(--color-fg-subtle,#6e7781));padding-left:8px;padding-right:8px;}/*!sc*/ data-styled.g11[id="types__StyledButton-sc-ws60qy-0"]{content:"gVXRRg,loAzyw,cXsOlJ,gGdPyq,bmlmSe,dPmZyJ,gXPTqA,"}/*!sc*/ .hWlpPn{position:relative;display:inline-block;}/*!sc*/ .hWlpPn::after{position:absolute;z-index:1000000;display:none;padding:0.5em 0.75em;font:normal normal 11px/1.5 -apple-system,BlinkMacSystemFont,"Segoe UI","Noto Sans",Helvetica,Arial,sans-serif,"Apple Color Emoji","Segoe UI Emoji";-webkit-font-smoothing:subpixel-antialiased;color:var(--tooltip-fgColor,var(--fgColor-onEmphasis,var(--color-fg-on-emphasis,#ffffff)));text-align:center;-webkit-text-decoration:none;text-decoration:none;text-shadow:none;text-transform:none;-webkit-letter-spacing:normal;-moz-letter-spacing:normal;-ms-letter-spacing:normal;letter-spacing:normal;word-wrap:break-word;white-space:pre;pointer-events:none;content:attr(aria-label);background:var(--tooltip-bgColor,var(--bgColor-emphasis,var(--color-neutral-emphasis-plus,#24292f)));border-radius:6px;opacity:0;}/*!sc*/ @-webkit-keyframes tooltip-appear{from{opacity:0;}to{opacity:1;}}/*!sc*/ @keyframes tooltip-appear{from{opacity:0;}to{opacity:1;}}/*!sc*/ .hWlpPn:hover::after,.hWlpPn:active::after,.hWlpPn:focus::after,.hWlpPn:focus-within::after{display:inline-block;-webkit-text-decoration:none;text-decoration:none;-webkit-animation-name:tooltip-appear;animation-name:tooltip-appear;-webkit-animation-duration:0.1s;animation-duration:0.1s;-webkit-animation-fill-mode:forwards;animation-fill-mode:forwards;-webkit-animation-timing-function:ease-in;animation-timing-function:ease-in;-webkit-animation-delay:0s;animation-delay:0s;}/*!sc*/ .hWlpPn.tooltipped-no-delay:hover::after,.hWlpPn.tooltipped-no-delay:active::after,.hWlpPn.tooltipped-no-delay:focus::after,.hWlpPn.tooltipped-no-delay:focus-within::after{-webkit-animation-delay:0s;animation-delay:0s;}/*!sc*/ .hWlpPn.tooltipped-multiline:hover::after,.hWlpPn.tooltipped-multiline:active::after,.hWlpPn.tooltipped-multiline:focus::after,.hWlpPn.tooltipped-multiline:focus-within::after{display:table-cell;}/*!sc*/ .hWlpPn.tooltipped-s::after,.hWlpPn.tooltipped-se::after,.hWlpPn.tooltipped-sw::after{top:100%;right:50%;margin-top:6px;}/*!sc*/ .hWlpPn.tooltipped-se::after{right:auto;left:50%;margin-left:-16px;}/*!sc*/ .hWlpPn.tooltipped-sw::after{margin-right:-16px;}/*!sc*/ .hWlpPn.tooltipped-n::after,.hWlpPn.tooltipped-ne::after,.hWlpPn.tooltipped-nw::after{right:50%;bottom:100%;margin-bottom:6px;}/*!sc*/ .hWlpPn.tooltipped-ne::after{right:auto;left:50%;margin-left:-16px;}/*!sc*/ .hWlpPn.tooltipped-nw::after{margin-right:-16px;}/*!sc*/ .hWlpPn.tooltipped-s::after,.hWlpPn.tooltipped-n::after{-webkit-transform:translateX(50%);-ms-transform:translateX(50%);transform:translateX(50%);}/*!sc*/ .hWlpPn.tooltipped-w::after{right:100%;bottom:50%;margin-right:6px;-webkit-transform:translateY(50%);-ms-transform:translateY(50%);transform:translateY(50%);}/*!sc*/ .hWlpPn.tooltipped-e::after{bottom:50%;left:100%;margin-left:6px;-webkit-transform:translateY(50%);-ms-transform:translateY(50%);transform:translateY(50%);}/*!sc*/ .hWlpPn.tooltipped-multiline::after{width:-webkit-max-content;width:-moz-max-content;width:max-content;max-width:250px;word-wrap:break-word;white-space:pre-line;border-collapse:separate;}/*!sc*/ .hWlpPn.tooltipped-multiline.tooltipped-s::after,.hWlpPn.tooltipped-multiline.tooltipped-n::after{right:auto;left:50%;-webkit-transform:translateX(-50%);-ms-transform:translateX(-50%);transform:translateX(-50%);}/*!sc*/ .hWlpPn.tooltipped-multiline.tooltipped-w::after,.hWlpPn.tooltipped-multiline.tooltipped-e::after{right:100%;}/*!sc*/ .hWlpPn.tooltipped-align-right-2::after{right:0;margin-right:0;}/*!sc*/ .hWlpPn.tooltipped-align-left-2::after{left:0;margin-left:0;}/*!sc*/ data-styled.g14[id="Tooltip__TooltipBase-sc-17tf59c-0"]{content:"hWlpPn,"}/*!sc*/ .kbCLEG{border:0;font-size:inherit;font-family:inherit;background-color:transparent;-webkit-appearance:none;color:inherit;width:100%;}/*!sc*/ .kbCLEG:focus{outline:0;}/*!sc*/ data-styled.g15[id="UnstyledTextInput-sc-14ypya-0"]{content:"kbCLEG,"}/*!sc*/ .liVpTx{display:inline-block;overflow:hidden;text-overflow:ellipsis;vertical-align:top;white-space:nowrap;max-width:125px;}/*!sc*/ data-styled.g17[id="Truncate__StyledTruncate-sc-23o1d2-0"]{content:"liVpTx,"}/*!sc*/ .iBVwpg{display:-webkit-box;display:-webkit-flex;display:-ms-flexbox;display:flex;padding-inline:var(--stack-padding-normal,16px);-webkit-box-pack:start;-webkit-justify-content:flex-start;-ms-flex-pack:start;justify-content:flex-start;-webkit-align-items:center;-webkit-box-align:center;-ms-flex-align:center;align-items:center;min-height:var(--control-xlarge-size,48px);box-shadow:inset 0px -1px var(--borderColor-muted,var(--borderColor-muted,var(--color-border-muted,hsla(210,18%,87%,1))));-webkit-box-flex:1;-webkit-flex-grow:1;-ms-flex-positive:1;flex-grow:1;border-bottom:none;max-width:100%;padding-left:8px;padding-right:8px;}/*!sc*/ data-styled.g92[id="UnderlineTabbedInterface__StyledUnderlineWrapper-sc-4ilrg0-0"]{content:"iBVwpg,"}/*!sc*/ .gJyWUl{display:-webkit-box;display:-webkit-flex;display:-ms-flexbox;display:flex;list-style:none;white-space:nowrap;padding:0;margin:0;-webkit-align-items:center;-webkit-box-align:center;-ms-flex-align:center;align-items:center;gap:8px;position:relative;}/*!sc*/ data-styled.g93[id="UnderlineTabbedInterface__StyledUnderlineItemList-sc-4ilrg0-1"]{content:"gJyWUl,"}/*!sc*/ .beOdPj{-webkit-appearance:none;-moz-appearance:none;appearance:none;background-color:transparent;border:0;cursor:pointer;font:inherit;position:relative;display:-webkit-inline-box;display:-webkit-inline-flex;display:-ms-inline-flexbox;display:inline-flex;color:var(--fgColor-default,var(--color-fg-default,#1F2328));text-align:center;-webkit-text-decoration:none;text-decoration:none;line-height:var(--text-body-lineHeight-medium,1.4285);border-radius:var(--borderRadius-medium,6px);font-size:var(--text-body-size-medium,14px);padding-inline:var(--control-medium-paddingInline-condensed,8px);padding-block:var(--control-medium-paddingBlock,6px);-webkit-align-items:center;-webkit-box-align:center;-ms-flex-align:center;align-items:center;}/*!sc*/ @media (hover:hover){.beOdPj:hover{background-color:var(--bgColor-neutral-muted,var(--bgColor-neutral-muted,var(--color-neutral-subtle,rgba(234,238,242,0.5))));-webkit-transition:background 0.12s ease-out;transition:background 0.12s ease-out;-webkit-text-decoration:none;text-decoration:none;}}/*!sc*/ .beOdPj:focus:{outline:2px solid transparent;box-shadow:inset 0 0 0 2px var(--fgColor-accent,var(--fgColor-accent,var(--color-accent-fg,#0969da)));}/*!sc*/ .beOdPj:focus::not(:focus-visible){box-shadow:none;}/*!sc*/ .beOdPj:focus-visible{outline:2px solid transparent;box-shadow:inset 0 0 0 2px var(--fgColor-accent,var(--fgColor-accent,var(--color-accent-fg,#0969da)));}/*!sc*/ .beOdPj [data-content]::before{content:attr(data-content);display:block;height:0;font-weight:var(--base-text-weight-semibold,500);visibility:hidden;white-space:nowrap;}/*!sc*/ .beOdPj [data-component='icon']{color:var(--fgColor-muted,var(--fgColor-muted,var(--color-fg-muted,#656d76)));-webkit-align-items:center;-webkit-box-align:center;-ms-flex-align:center;align-items:center;display:-webkit-inline-box;display:-webkit-inline-flex;display:-ms-inline-flexbox;display:inline-flex;margin-inline-end:var(--control-medium-gap,8px);}/*!sc*/ .beOdPj [data-component='counter']{margin-inline-start:var(--control-medium-gap,8px);display:-webkit-box;display:-webkit-flex;display:-ms-flexbox;display:flex;-webkit-align-items:center;-webkit-box-align:center;-ms-flex-align:center;align-items:center;}/*!sc*/ .beOdPj::after{position:absolute;right:50%;bottom:calc(50% - calc(var(--control-xlarge-size,48px) / 2 + 1px));width:100%;height:2px;content:'';background-color:transparent;border-radius:0;-webkit-transform:translate(50%,-50%);-ms-transform:translate(50%,-50%);transform:translate(50%,-50%);}/*!sc*/ .beOdPj[aria-current]:not([aria-current='false']) [data-component='text'],.beOdPj[aria-selected='true'] [data-component='text']{font-weight:var(--base-text-weight-semibold,500);}/*!sc*/ .beOdPj[aria-current]:not([aria-current='false'])::after,.beOdPj[aria-selected='true']::after{background-color:var(--underlineNav-borderColor-active,var(--color-primer-border-active,#fd8c73));}/*!sc*/ @media (forced-colors:active){.beOdPj[aria-current]:not([aria-current='false'])::after,.beOdPj[aria-selected='true']::after{background-color:LinkText;}}/*!sc*/ data-styled.g94[id="UnderlineTabbedInterface__StyledUnderlineItem-sc-4ilrg0-2"]{content:"beOdPj,"}/*!sc*/ </style> <!-- --> <!-- --> <div class="Box-sc-g0xbh4-0 iVEunk"><div class="Box-sc-g0xbh4-0 jzuOtQ"><div class="Box-sc-g0xbh4-0 bGojzy"></div></div><div class="Box-sc-g0xbh4-0 iNSVHo"><div class="Box-sc-g0xbh4-0 bVgnfw"><div class="Box-sc-g0xbh4-0 CEgMp"><button type="button" aria-haspopup="true" aria-expanded="false" tabindex="0" aria-label="master branch" data-testid="anchor-button" class="types__StyledButton-sc-ws60qy-0 gVXRRg overview-ref-selector width-full" data-loading="false" data-size="medium" aria-describedby="branch-picker-repos-header-ref-selector-loading-announcement" id="branch-picker-repos-header-ref-selector"><span data-component="buttonContent" class="Box-sc-g0xbh4-0 gUkoLg"><span data-component="text"><div class="Box-sc-g0xbh4-0 bZBlpz"><div class="Box-sc-g0xbh4-0 lhTYNA"><svg aria-hidden="true" focusable="false" class="octicon octicon-git-branch" viewBox="0 0 16 16" width="16" height="16" fill="currentColor" style="display:inline-block;user-select:none;vertical-align:text-bottom;overflow:visible"><path d="M9.5 3.25a2.25 2.25 0 1 1 3 2.122V6A2.5 2.5 0 0 1 10 8.5H6a1 1 0 0 0-1 1v1.128a2.251 2.251 0 1 1-1.5 0V5.372a2.25 2.25 0 1 1 1.5 0v1.836A2.493 2.493 0 0 1 6 7h4a1 1 0 0 0 1-1v-.628A2.25 2.25 0 0 1 9.5 3.25Zm-6 0a.75.75 0 1 0 1.5 0 .75.75 0 0 0-1.5 0Zm8.25-.75a.75.75 0 1 0 0 1.5.75.75 0 0 0 0-1.5ZM4.25 12a.75.75 0 1 0 0 1.5.75.75 0 0 0 0-1.5Z"></path></svg></div><div class="Box-sc-g0xbh4-0 ffLUq ref-selector-button-text-container"><span class="Text__StyledText-sc-17v1xeu-0 eMMFM"> <!-- -->master</span></div></div></span><span data-component="trailingVisual" class="Box-sc-g0xbh4-0 hzSPyu"><svg aria-hidden="true" focusable="false" class="octicon octicon-triangle-down" viewBox="0 0 16 16" width="16" height="16" fill="currentColor" style="display:inline-block;user-select:none;vertical-align:text-bottom;overflow:visible"><path d="m4.427 7.427 3.396 3.396a.25.25 0 0 0 .354 0l3.396-3.396A.25.25 0 0 0 11.396 7H4.604a.25.25 0 0 0-.177.427Z"></path></svg></span></span></button><button hidden="" data-hotkey-scope="read-only-cursor-text-area"></button></div><div class="Box-sc-g0xbh4-0 fLXEGX"><a style="--button-color:fg.muted" type="button" href="/RenderKit/oidn/branches" class="types__StyledButton-sc-ws60qy-0 loAzyw" data-loading="false" data-size="medium" aria-describedby=":Rclab:-loading-announcement"><span data-component="buttonContent" class="Box-sc-g0xbh4-0 gUkoLg"><span data-component="leadingVisual" class="Box-sc-g0xbh4-0 hzSPyu"><svg aria-hidden="true" focusable="false" class="octicon octicon-git-branch" viewBox="0 0 16 16" width="16" height="16" fill="currentColor" style="display:inline-block;user-select:none;vertical-align:text-bottom;overflow:visible"><path d="M9.5 3.25a2.25 2.25 0 1 1 3 2.122V6A2.5 2.5 0 0 1 10 8.5H6a1 1 0 0 0-1 1v1.128a2.251 2.251 0 1 1-1.5 0V5.372a2.25 2.25 0 1 1 1.5 0v1.836A2.493 2.493 0 0 1 6 7h4a1 1 0 0 0 1-1v-.628A2.25 2.25 0 0 1 9.5 3.25Zm-6 0a.75.75 0 1 0 1.5 0 .75.75 0 0 0-1.5 0Zm8.25-.75a.75.75 0 1 0 0 1.5.75.75 0 0 0 0-1.5ZM4.25 12a.75.75 0 1 0 0 1.5.75.75 0 0 0 0-1.5Z"></path></svg></span><span data-component="text">Branches</span></span></a><a style="--button-color:fg.muted" type="button" href="/RenderKit/oidn/tags" class="types__StyledButton-sc-ws60qy-0 loAzyw" data-loading="false" data-size="medium" aria-describedby=":Rklab:-loading-announcement"><span data-component="buttonContent" class="Box-sc-g0xbh4-0 gUkoLg"><span data-component="leadingVisual" class="Box-sc-g0xbh4-0 hzSPyu"><svg aria-hidden="true" focusable="false" class="octicon octicon-tag" viewBox="0 0 16 16" width="16" height="16" fill="currentColor" style="display:inline-block;user-select:none;vertical-align:text-bottom;overflow:visible"><path d="M1 7.775V2.75C1 1.784 1.784 1 2.75 1h5.025c.464 0 .91.184 1.238.513l6.25 6.25a1.75 1.75 0 0 1 0 2.474l-5.026 5.026a1.75 1.75 0 0 1-2.474 0l-6.25-6.25A1.752 1.752 0 0 1 1 7.775Zm1.5 0c0 .066.026.13.073.177l6.25 6.25a.25.25 0 0 0 .354 0l5.025-5.025a.25.25 0 0 0 0-.354l-6.25-6.25a.25.25 0 0 0-.177-.073H2.75a.25.25 0 0 0-.25.25ZM6 5a1 1 0 1 1 0 2 1 1 0 0 1 0-2Z"></path></svg></span><span data-component="text">Tags</span></span></a></div><div class="Box-sc-g0xbh4-0 dqfxud"><a style="--button-color:fg.muted" type="button" aria-label="Go to Branches page" href="/RenderKit/oidn/branches" class="types__StyledButton-sc-ws60qy-0 cXsOlJ" data-loading="false" data-no-visuals="true" data-size="medium" aria-describedby=":Relab:-loading-announcement"><svg aria-hidden="true" focusable="false" class="octicon octicon-git-branch" viewBox="0 0 16 16" width="16" height="16" fill="currentColor" style="display:inline-block;user-select:none;vertical-align:text-bottom;overflow:visible"><path d="M9.5 3.25a2.25 2.25 0 1 1 3 2.122V6A2.5 2.5 0 0 1 10 8.5H6a1 1 0 0 0-1 1v1.128a2.251 2.251 0 1 1-1.5 0V5.372a2.25 2.25 0 1 1 1.5 0v1.836A2.493 2.493 0 0 1 6 7h4a1 1 0 0 0 1-1v-.628A2.25 2.25 0 0 1 9.5 3.25Zm-6 0a.75.75 0 1 0 1.5 0 .75.75 0 0 0-1.5 0Zm8.25-.75a.75.75 0 1 0 0 1.5.75.75 0 0 0 0-1.5ZM4.25 12a.75.75 0 1 0 0 1.5.75.75 0 0 0 0-1.5Z"></path></svg></a><a style="--button-color:fg.muted" type="button" aria-label="Go to Tags page" href="/RenderKit/oidn/tags" class="types__StyledButton-sc-ws60qy-0 cXsOlJ" data-loading="false" data-no-visuals="true" data-size="medium" aria-describedby=":Rmlab:-loading-announcement"><svg aria-hidden="true" focusable="false" class="octicon octicon-tag" viewBox="0 0 16 16" width="16" height="16" fill="currentColor" style="display:inline-block;user-select:none;vertical-align:text-bottom;overflow:visible"><path d="M1 7.775V2.75C1 1.784 1.784 1 2.75 1h5.025c.464 0 .91.184 1.238.513l6.25 6.25a1.75 1.75 0 0 1 0 2.474l-5.026 5.026a1.75 1.75 0 0 1-2.474 0l-6.25-6.25A1.752 1.752 0 0 1 1 7.775Zm1.5 0c0 .066.026.13.073.177l6.25 6.25a.25.25 0 0 0 .354 0l5.025-5.025a.25.25 0 0 0 0-.354l-6.25-6.25a.25.25 0 0 0-.177-.073H2.75a.25.25 0 0 0-.25.25ZM6 5a1 1 0 1 1 0 2 1 1 0 0 1 0-2Z"></path></svg></a></div></div><div class="Box-sc-g0xbh4-0 jxTzTd"><div class="Box-sc-g0xbh4-0 gqqBXN"><div class="Box-sc-g0xbh4-0 dzXgxt"><!--$--><div class="Box-sc-g0xbh4-0 iWFGlI"><span class="TextInputWrapper__TextInputBaseWrapper-sc-1mqhpbi-0 TextInputWrapper-sc-1mqhpbi-1 gwqFqs decvaq TextInput-wrapper" aria-busy="false"><span class="TextInput-icon" id=":R2j5ab:" aria-hidden="true"><svg aria-hidden="true" focusable="false" class="octicon octicon-search" viewBox="0 0 16 16" width="16" height="16" fill="currentColor" style="display:inline-block;user-select:none;vertical-align:text-bottom;overflow:visible"><path d="M10.68 11.74a6 6 0 0 1-7.922-8.982 6 6 0 0 1 8.982 7.922l3.04 3.04a.749.749 0 0 1-.326 1.275.749.749 0 0 1-.734-.215ZM11.5 7a4.499 4.499 0 1 0-8.997 0A4.499 4.499 0 0 0 11.5 7Z"></path></svg></span><input type="text" aria-label="Go to file" role="combobox" aria-controls="file-results-list" aria-expanded="false" aria-haspopup="dialog" autoCorrect="off" spellcheck="false" placeholder="Go to file" aria-describedby=":R2j5ab: :R2j5abH1:" data-component="input" class="UnstyledTextInput-sc-14ypya-0 kbCLEG" value=""/><span class="TextInput-icon" id=":R2j5abH1:" aria-hidden="true"></span></span></div><!--/$--></div><div class="Box-sc-g0xbh4-0 YUPas"><button type="button" class="types__StyledButton-sc-ws60qy-0 gGdPyq" data-loading="false" data-no-visuals="true" data-size="medium" aria-describedby=":Rr5ab:-loading-announcement"><span data-component="buttonContent" class="Box-sc-g0xbh4-0 gUkoLg"><span data-component="text">Go to file</span></span></button></div><div class="react-directory-add-file-icon"></div><div class="react-directory-remove-file-icon"></div></div><button type="button" aria-haspopup="true" aria-expanded="false" tabindex="0" class="types__StyledButton-sc-ws60qy-0 bmlmSe" data-loading="false" data-size="medium" aria-describedby=":R55ab:-loading-announcement" id=":R55ab:"><span data-component="buttonContent" class="Box-sc-g0xbh4-0 gUkoLg"><span data-component="leadingVisual" class="Box-sc-g0xbh4-0 hzSPyu"><svg aria-hidden="true" focusable="false" class="hide-sm" viewBox="0 0 16 16" width="16" height="16" fill="currentColor" style="display:inline-block;user-select:none;vertical-align:text-bottom;overflow:visible"><path d="m11.28 3.22 4.25 4.25a.75.75 0 0 1 0 1.06l-4.25 4.25a.749.749 0 0 1-1.275-.326.749.749 0 0 1 .215-.734L13.94 8l-3.72-3.72a.749.749 0 0 1 .326-1.275.749.749 0 0 1 .734.215Zm-6.56 0a.751.751 0 0 1 1.042.018.751.751 0 0 1 .018 1.042L2.06 8l3.72 3.72a.749.749 0 0 1-.326 1.275.749.749 0 0 1-.734-.215L.47 8.53a.75.75 0 0 1 0-1.06Z"></path></svg></span><span data-component="text">Code</span><span data-component="trailingVisual" class="Box-sc-g0xbh4-0 hzSPyu"><svg aria-hidden="true" focusable="false" class="octicon octicon-triangle-down" viewBox="0 0 16 16" width="16" height="16" fill="currentColor" style="display:inline-block;user-select:none;vertical-align:text-bottom;overflow:visible"><path d="m4.427 7.427 3.396 3.396a.25.25 0 0 0 .354 0l3.396-3.396A.25.25 0 0 0 11.396 7H4.604a.25.25 0 0 0-.177.427Z"></path></svg></span></span></button><div class="Box-sc-g0xbh4-0 izFOf"><button data-component="IconButton" type="button" aria-label="Open more actions menu" aria-haspopup="true" aria-expanded="false" tabindex="0" class="types__StyledButton-sc-ws60qy-0 gGdPyq prc-Button-IconButton-szpyj" data-loading="false" data-no-visuals="true" data-size="medium" aria-describedby=":R75ab:-loading-announcement" id=":R75ab:"><svg aria-hidden="true" focusable="false" class="octicon octicon-kebab-horizontal" viewBox="0 0 16 16" width="16" height="16" fill="currentColor" style="display:inline-block;user-select:none;vertical-align:text-bottom;overflow:visible"><path d="M8 9a1.5 1.5 0 1 0 0-3 1.5 1.5 0 0 0 0 3ZM1.5 9a1.5 1.5 0 1 0 0-3 1.5 1.5 0 0 0 0 3Zm13 0a1.5 1.5 0 1 0 0-3 1.5 1.5 0 0 0 0 3Z"></path></svg></button></div></div></div><div class="Box-sc-g0xbh4-0 vIPPs"><div data-hpc="true"><button hidden="" data-testid="focus-next-element-button" data-hotkey="j"></button><button hidden="" data-testid="focus-previous-element-button" data-hotkey="k"></button><h2 class="sr-only prc-Heading-Heading-6CmGO" data-testid="screen-reader-heading" id="folders-and-files">Folders and files</h2><table aria-labelledby="folders-and-files" class="Box-sc-g0xbh4-0 fdROMU"><thead class="Box-sc-g0xbh4-0 jGKpsv"><tr class="Box-sc-g0xbh4-0 jdgHnn"><th colSpan="2" class="Box-sc-g0xbh4-0 bQivRW"><span class="text-bold">Name</span></th><th colSpan="1" class="Box-sc-g0xbh4-0 ldkMIO"><span class="text-bold">Name</span></th><th class="hide-sm"><div title="Last commit message" class="Truncate__StyledTruncate-sc-23o1d2-0 liVpTx width-fit"><span class="text-bold">Last commit message</span></div></th><th colSpan="1" class="Box-sc-g0xbh4-0 jMbWeI"><div title="Last commit date" class="Truncate__StyledTruncate-sc-23o1d2-0 liVpTx width-fit"><span class="text-bold">Last commit date</span></div></th></tr></thead><tbody><tr class="Box-sc-g0xbh4-0 gpqjiB"><td colSpan="3" class="bgColor-muted p-1 rounded-top-2"><div class="Box-sc-g0xbh4-0 dzCJzi"><h2 class="sr-only prc-Heading-Heading-6CmGO" data-testid="screen-reader-heading">Latest commit</h2><div style="width:120px" class="Skeleton Skeleton--text" data-testid="loading"> </div><div class="d-flex flex-shrink-0 gap-2"><div data-testid="latest-commit-details" class="d-none d-sm-flex flex-items-center"></div><div class="d-flex gap-2"><h2 class="sr-only prc-Heading-Heading-6CmGO" data-testid="screen-reader-heading">History</h2><a href="/RenderKit/oidn/commits/master/" class="types__StyledButton-sc-ws60qy-0 dPmZyJ d-none d-lg-flex LinkButton-module__code-view-link-button--xvCGA flex-items-center fgColor-default" data-loading="false" data-size="small" aria-describedby=":Raqj8pab:-loading-announcement"><span data-component="buttonContent" class="Box-sc-g0xbh4-0 gUkoLg"><span data-component="leadingVisual" class="Box-sc-g0xbh4-0 hzSPyu"><svg aria-hidden="true" focusable="false" class="octicon octicon-history" viewBox="0 0 16 16" width="16" height="16" fill="currentColor" style="display:inline-block;user-select:none;vertical-align:text-bottom;overflow:visible"><path d="m.427 1.927 1.215 1.215a8.002 8.002 0 1 1-1.6 5.685.75.75 0 1 1 1.493-.154 6.5 6.5 0 1 0 1.18-4.458l1.358 1.358A.25.25 0 0 1 3.896 6H.25A.25.25 0 0 1 0 5.75V2.104a.25.25 0 0 1 .427-.177ZM7.75 4a.75.75 0 0 1 .75.75v2.992l2.028.812a.75.75 0 0 1-.557 1.392l-2.5-1A.751.751 0 0 1 7 8.25v-3.5A.75.75 0 0 1 7.75 4Z"></path></svg></span><span data-component="text"><span class="fgColor-default">1,956 Commits</span></span></span></a><div class="d-sm-none"></div><div class="d-flex d-lg-none"><span role="tooltip" aria-label="1,956 Commits" id="history-icon-button-tooltip" class="Tooltip__TooltipBase-sc-17tf59c-0 hWlpPn tooltipped-n"><a href="/RenderKit/oidn/commits/master/" class="types__StyledButton-sc-ws60qy-0 dPmZyJ LinkButton-module__code-view-link-button--xvCGA flex-items-center fgColor-default" data-loading="false" data-size="small" aria-describedby=":R1iqj8pab:-loading-announcement history-icon-button-tooltip"><span data-component="buttonContent" class="Box-sc-g0xbh4-0 gUkoLg"><span data-component="leadingVisual" class="Box-sc-g0xbh4-0 hzSPyu"><svg aria-hidden="true" focusable="false" class="octicon octicon-history" viewBox="0 0 16 16" width="16" height="16" fill="currentColor" style="display:inline-block;user-select:none;vertical-align:text-bottom;overflow:visible"><path d="m.427 1.927 1.215 1.215a8.002 8.002 0 1 1-1.6 5.685.75.75 0 1 1 1.493-.154 6.5 6.5 0 1 0 1.18-4.458l1.358 1.358A.25.25 0 0 1 3.896 6H.25A.25.25 0 0 1 0 5.75V2.104a.25.25 0 0 1 .427-.177ZM7.75 4a.75.75 0 0 1 .75.75v2.992l2.028.812a.75.75 0 0 1-.557 1.392l-2.5-1A.751.751 0 0 1 7 8.25v-3.5A.75.75 0 0 1 7.75 4Z"></path></svg></span></span></a></span></div></div></div></div></td></tr><tr class="react-directory-row undefined" id="folder-row-0"><td class="react-directory-row-name-cell-small-screen" colSpan="2"><div class="react-directory-filename-column"><svg aria-hidden="true" focusable="false" class="icon-directory" viewBox="0 0 16 16" width="16" height="16" fill="currentColor" style="display:inline-block;user-select:none;vertical-align:text-bottom;overflow:visible"><path d="M1.75 1A1.75 1.75 0 0 0 0 2.75v10.5C0 14.216.784 15 1.75 15h12.5A1.75 1.75 0 0 0 16 13.25v-8.5A1.75 1.75 0 0 0 14.25 3H7.5a.25.25 0 0 1-.2-.1l-.9-1.2C6.07 1.26 5.55 1 5 1H1.75Z"></path></svg><div class="overflow-hidden"><div class="react-directory-filename-cell"><div class="react-directory-truncate"><a title=".github" aria-label=".github, (Directory)" class="Link--primary" href="/RenderKit/oidn/tree/master/.github">.github</a></div></div></div></div></td><td class="react-directory-row-name-cell-large-screen" colSpan="1"><div class="react-directory-filename-column"><svg aria-hidden="true" focusable="false" class="icon-directory" viewBox="0 0 16 16" width="16" height="16" fill="currentColor" style="display:inline-block;user-select:none;vertical-align:text-bottom;overflow:visible"><path d="M1.75 1A1.75 1.75 0 0 0 0 2.75v10.5C0 14.216.784 15 1.75 15h12.5A1.75 1.75 0 0 0 16 13.25v-8.5A1.75 1.75 0 0 0 14.25 3H7.5a.25.25 0 0 1-.2-.1l-.9-1.2C6.07 1.26 5.55 1 5 1H1.75Z"></path></svg><div class="overflow-hidden"><div class="react-directory-filename-cell"><div class="react-directory-truncate"><a title=".github" aria-label=".github, (Directory)" class="Link--primary" href="/RenderKit/oidn/tree/master/.github">.github</a></div></div></div></div></td><td class="react-directory-row-commit-cell"><div class="Skeleton Skeleton--text"> </div></td><td><div class="Skeleton Skeleton--text"> </div></td></tr><tr class="react-directory-row undefined" id="folder-row-1"><td class="react-directory-row-name-cell-small-screen" colSpan="2"><div class="react-directory-filename-column"><svg aria-hidden="true" focusable="false" class="icon-directory" viewBox="0 0 16 16" width="16" height="16" fill="currentColor" style="display:inline-block;user-select:none;vertical-align:text-bottom;overflow:visible"><path d="M1.75 1A1.75 1.75 0 0 0 0 2.75v10.5C0 14.216.784 15 1.75 15h12.5A1.75 1.75 0 0 0 16 13.25v-8.5A1.75 1.75 0 0 0 14.25 3H7.5a.25.25 0 0 1-.2-.1l-.9-1.2C6.07 1.26 5.55 1 5 1H1.75Z"></path></svg><div class="overflow-hidden"><div class="react-directory-filename-cell"><div class="react-directory-truncate"><a title="api" aria-label="api, (Directory)" class="Link--primary" href="/RenderKit/oidn/tree/master/api">api</a></div></div></div></div></td><td class="react-directory-row-name-cell-large-screen" colSpan="1"><div class="react-directory-filename-column"><svg aria-hidden="true" focusable="false" class="icon-directory" viewBox="0 0 16 16" width="16" height="16" fill="currentColor" style="display:inline-block;user-select:none;vertical-align:text-bottom;overflow:visible"><path d="M1.75 1A1.75 1.75 0 0 0 0 2.75v10.5C0 14.216.784 15 1.75 15h12.5A1.75 1.75 0 0 0 16 13.25v-8.5A1.75 1.75 0 0 0 14.25 3H7.5a.25.25 0 0 1-.2-.1l-.9-1.2C6.07 1.26 5.55 1 5 1H1.75Z"></path></svg><div class="overflow-hidden"><div class="react-directory-filename-cell"><div class="react-directory-truncate"><a title="api" aria-label="api, (Directory)" class="Link--primary" href="/RenderKit/oidn/tree/master/api">api</a></div></div></div></div></td><td class="react-directory-row-commit-cell"><div class="Skeleton Skeleton--text"> </div></td><td><div class="Skeleton Skeleton--text"> </div></td></tr><tr class="react-directory-row undefined" id="folder-row-2"><td class="react-directory-row-name-cell-small-screen" colSpan="2"><div class="react-directory-filename-column"><svg aria-hidden="true" focusable="false" class="icon-directory" viewBox="0 0 16 16" width="16" height="16" fill="currentColor" style="display:inline-block;user-select:none;vertical-align:text-bottom;overflow:visible"><path d="M1.75 1A1.75 1.75 0 0 0 0 2.75v10.5C0 14.216.784 15 1.75 15h12.5A1.75 1.75 0 0 0 16 13.25v-8.5A1.75 1.75 0 0 0 14.25 3H7.5a.25.25 0 0 1-.2-.1l-.9-1.2C6.07 1.26 5.55 1 5 1H1.75Z"></path></svg><div class="overflow-hidden"><div class="react-directory-filename-cell"><div class="react-directory-truncate"><a title="apps" aria-label="apps, (Directory)" class="Link--primary" href="/RenderKit/oidn/tree/master/apps">apps</a></div></div></div></div></td><td class="react-directory-row-name-cell-large-screen" colSpan="1"><div class="react-directory-filename-column"><svg aria-hidden="true" focusable="false" class="icon-directory" viewBox="0 0 16 16" width="16" height="16" fill="currentColor" style="display:inline-block;user-select:none;vertical-align:text-bottom;overflow:visible"><path d="M1.75 1A1.75 1.75 0 0 0 0 2.75v10.5C0 14.216.784 15 1.75 15h12.5A1.75 1.75 0 0 0 16 13.25v-8.5A1.75 1.75 0 0 0 14.25 3H7.5a.25.25 0 0 1-.2-.1l-.9-1.2C6.07 1.26 5.55 1 5 1H1.75Z"></path></svg><div class="overflow-hidden"><div class="react-directory-filename-cell"><div class="react-directory-truncate"><a title="apps" aria-label="apps, (Directory)" class="Link--primary" href="/RenderKit/oidn/tree/master/apps">apps</a></div></div></div></div></td><td class="react-directory-row-commit-cell"><div class="Skeleton Skeleton--text"> </div></td><td><div class="Skeleton Skeleton--text"> </div></td></tr><tr class="react-directory-row undefined" id="folder-row-3"><td class="react-directory-row-name-cell-small-screen" colSpan="2"><div class="react-directory-filename-column"><svg aria-hidden="true" focusable="false" class="icon-directory" viewBox="0 0 16 16" width="16" height="16" fill="currentColor" style="display:inline-block;user-select:none;vertical-align:text-bottom;overflow:visible"><path d="M1.75 1A1.75 1.75 0 0 0 0 2.75v10.5C0 14.216.784 15 1.75 15h12.5A1.75 1.75 0 0 0 16 13.25v-8.5A1.75 1.75 0 0 0 14.25 3H7.5a.25.25 0 0 1-.2-.1l-.9-1.2C6.07 1.26 5.55 1 5 1H1.75Z"></path></svg><div class="overflow-hidden"><div class="react-directory-filename-cell"><div class="react-directory-truncate"><a title="cmake" aria-label="cmake, (Directory)" class="Link--primary" href="/RenderKit/oidn/tree/master/cmake">cmake</a></div></div></div></div></td><td class="react-directory-row-name-cell-large-screen" colSpan="1"><div class="react-directory-filename-column"><svg aria-hidden="true" focusable="false" class="icon-directory" viewBox="0 0 16 16" width="16" height="16" fill="currentColor" style="display:inline-block;user-select:none;vertical-align:text-bottom;overflow:visible"><path d="M1.75 1A1.75 1.75 0 0 0 0 2.75v10.5C0 14.216.784 15 1.75 15h12.5A1.75 1.75 0 0 0 16 13.25v-8.5A1.75 1.75 0 0 0 14.25 3H7.5a.25.25 0 0 1-.2-.1l-.9-1.2C6.07 1.26 5.55 1 5 1H1.75Z"></path></svg><div class="overflow-hidden"><div class="react-directory-filename-cell"><div class="react-directory-truncate"><a title="cmake" aria-label="cmake, (Directory)" class="Link--primary" href="/RenderKit/oidn/tree/master/cmake">cmake</a></div></div></div></div></td><td class="react-directory-row-commit-cell"><div class="Skeleton Skeleton--text"> </div></td><td><div class="Skeleton Skeleton--text"> </div></td></tr><tr class="react-directory-row undefined" id="folder-row-4"><td class="react-directory-row-name-cell-small-screen" colSpan="2"><div class="react-directory-filename-column"><svg aria-hidden="true" focusable="false" class="icon-directory" viewBox="0 0 16 16" width="16" height="16" fill="currentColor" style="display:inline-block;user-select:none;vertical-align:text-bottom;overflow:visible"><path d="M1.75 1A1.75 1.75 0 0 0 0 2.75v10.5C0 14.216.784 15 1.75 15h12.5A1.75 1.75 0 0 0 16 13.25v-8.5A1.75 1.75 0 0 0 14.25 3H7.5a.25.25 0 0 1-.2-.1l-.9-1.2C6.07 1.26 5.55 1 5 1H1.75Z"></path></svg><div class="overflow-hidden"><div class="react-directory-filename-cell"><div class="react-directory-truncate"><a title="common" aria-label="common, (Directory)" class="Link--primary" href="/RenderKit/oidn/tree/master/common">common</a></div></div></div></div></td><td class="react-directory-row-name-cell-large-screen" colSpan="1"><div class="react-directory-filename-column"><svg aria-hidden="true" focusable="false" class="icon-directory" viewBox="0 0 16 16" width="16" height="16" fill="currentColor" style="display:inline-block;user-select:none;vertical-align:text-bottom;overflow:visible"><path d="M1.75 1A1.75 1.75 0 0 0 0 2.75v10.5C0 14.216.784 15 1.75 15h12.5A1.75 1.75 0 0 0 16 13.25v-8.5A1.75 1.75 0 0 0 14.25 3H7.5a.25.25 0 0 1-.2-.1l-.9-1.2C6.07 1.26 5.55 1 5 1H1.75Z"></path></svg><div class="overflow-hidden"><div class="react-directory-filename-cell"><div class="react-directory-truncate"><a title="common" aria-label="common, (Directory)" class="Link--primary" href="/RenderKit/oidn/tree/master/common">common</a></div></div></div></div></td><td class="react-directory-row-commit-cell"><div class="Skeleton Skeleton--text"> </div></td><td><div class="Skeleton Skeleton--text"> </div></td></tr><tr class="react-directory-row undefined" id="folder-row-5"><td class="react-directory-row-name-cell-small-screen" colSpan="2"><div class="react-directory-filename-column"><svg aria-hidden="true" focusable="false" class="icon-directory" viewBox="0 0 16 16" width="16" height="16" fill="currentColor" style="display:inline-block;user-select:none;vertical-align:text-bottom;overflow:visible"><path d="M1.75 1A1.75 1.75 0 0 0 0 2.75v10.5C0 14.216.784 15 1.75 15h12.5A1.75 1.75 0 0 0 16 13.25v-8.5A1.75 1.75 0 0 0 14.25 3H7.5a.25.25 0 0 1-.2-.1l-.9-1.2C6.07 1.26 5.55 1 5 1H1.75Z"></path></svg><div class="overflow-hidden"><div class="react-directory-filename-cell"><div class="react-directory-truncate"><a title="core" aria-label="core, (Directory)" class="Link--primary" href="/RenderKit/oidn/tree/master/core">core</a></div></div></div></div></td><td class="react-directory-row-name-cell-large-screen" colSpan="1"><div class="react-directory-filename-column"><svg aria-hidden="true" focusable="false" class="icon-directory" viewBox="0 0 16 16" width="16" height="16" fill="currentColor" style="display:inline-block;user-select:none;vertical-align:text-bottom;overflow:visible"><path d="M1.75 1A1.75 1.75 0 0 0 0 2.75v10.5C0 14.216.784 15 1.75 15h12.5A1.75 1.75 0 0 0 16 13.25v-8.5A1.75 1.75 0 0 0 14.25 3H7.5a.25.25 0 0 1-.2-.1l-.9-1.2C6.07 1.26 5.55 1 5 1H1.75Z"></path></svg><div class="overflow-hidden"><div class="react-directory-filename-cell"><div class="react-directory-truncate"><a title="core" aria-label="core, (Directory)" class="Link--primary" href="/RenderKit/oidn/tree/master/core">core</a></div></div></div></div></td><td class="react-directory-row-commit-cell"><div class="Skeleton Skeleton--text"> </div></td><td><div class="Skeleton Skeleton--text"> </div></td></tr><tr class="react-directory-row undefined" id="folder-row-6"><td class="react-directory-row-name-cell-small-screen" colSpan="2"><div class="react-directory-filename-column"><svg aria-hidden="true" focusable="false" class="icon-directory" viewBox="0 0 16 16" width="16" height="16" fill="currentColor" style="display:inline-block;user-select:none;vertical-align:text-bottom;overflow:visible"><path d="M1.75 1A1.75 1.75 0 0 0 0 2.75v10.5C0 14.216.784 15 1.75 15h12.5A1.75 1.75 0 0 0 16 13.25v-8.5A1.75 1.75 0 0 0 14.25 3H7.5a.25.25 0 0 1-.2-.1l-.9-1.2C6.07 1.26 5.55 1 5 1H1.75Z"></path></svg><div class="overflow-hidden"><div class="react-directory-filename-cell"><div class="react-directory-truncate"><a title="devices" aria-label="devices, (Directory)" class="Link--primary" href="/RenderKit/oidn/tree/master/devices">devices</a></div></div></div></div></td><td class="react-directory-row-name-cell-large-screen" colSpan="1"><div class="react-directory-filename-column"><svg aria-hidden="true" focusable="false" class="icon-directory" viewBox="0 0 16 16" width="16" height="16" fill="currentColor" style="display:inline-block;user-select:none;vertical-align:text-bottom;overflow:visible"><path d="M1.75 1A1.75 1.75 0 0 0 0 2.75v10.5C0 14.216.784 15 1.75 15h12.5A1.75 1.75 0 0 0 16 13.25v-8.5A1.75 1.75 0 0 0 14.25 3H7.5a.25.25 0 0 1-.2-.1l-.9-1.2C6.07 1.26 5.55 1 5 1H1.75Z"></path></svg><div class="overflow-hidden"><div class="react-directory-filename-cell"><div class="react-directory-truncate"><a title="devices" aria-label="devices, (Directory)" class="Link--primary" href="/RenderKit/oidn/tree/master/devices">devices</a></div></div></div></div></td><td class="react-directory-row-commit-cell"><div class="Skeleton Skeleton--text"> </div></td><td><div class="Skeleton Skeleton--text"> </div></td></tr><tr class="react-directory-row undefined" id="folder-row-7"><td class="react-directory-row-name-cell-small-screen" colSpan="2"><div class="react-directory-filename-column"><svg aria-hidden="true" focusable="false" class="icon-directory" viewBox="0 0 16 16" width="16" height="16" fill="currentColor" style="display:inline-block;user-select:none;vertical-align:text-bottom;overflow:visible"><path d="M1.75 1A1.75 1.75 0 0 0 0 2.75v10.5C0 14.216.784 15 1.75 15h12.5A1.75 1.75 0 0 0 16 13.25v-8.5A1.75 1.75 0 0 0 14.25 3H7.5a.25.25 0 0 1-.2-.1l-.9-1.2C6.07 1.26 5.55 1 5 1H1.75Z"></path></svg><div class="overflow-hidden"><div class="react-directory-filename-cell"><div class="react-directory-truncate"><a title="doc" aria-label="doc, (Directory)" class="Link--primary" href="/RenderKit/oidn/tree/master/doc">doc</a></div></div></div></div></td><td class="react-directory-row-name-cell-large-screen" colSpan="1"><div class="react-directory-filename-column"><svg aria-hidden="true" focusable="false" class="icon-directory" viewBox="0 0 16 16" width="16" height="16" fill="currentColor" style="display:inline-block;user-select:none;vertical-align:text-bottom;overflow:visible"><path d="M1.75 1A1.75 1.75 0 0 0 0 2.75v10.5C0 14.216.784 15 1.75 15h12.5A1.75 1.75 0 0 0 16 13.25v-8.5A1.75 1.75 0 0 0 14.25 3H7.5a.25.25 0 0 1-.2-.1l-.9-1.2C6.07 1.26 5.55 1 5 1H1.75Z"></path></svg><div class="overflow-hidden"><div class="react-directory-filename-cell"><div class="react-directory-truncate"><a title="doc" aria-label="doc, (Directory)" class="Link--primary" href="/RenderKit/oidn/tree/master/doc">doc</a></div></div></div></div></td><td class="react-directory-row-commit-cell"><div class="Skeleton Skeleton--text"> </div></td><td><div class="Skeleton Skeleton--text"> </div></td></tr><tr class="react-directory-row undefined" id="folder-row-8"><td class="react-directory-row-name-cell-small-screen" colSpan="2"><div class="react-directory-filename-column"><svg aria-hidden="true" focusable="false" class="icon-directory" viewBox="0 0 16 16" width="16" height="16" fill="currentColor" style="display:inline-block;user-select:none;vertical-align:text-bottom;overflow:visible"><path d="M1.75 1A1.75 1.75 0 0 0 0 2.75v10.5C0 14.216.784 15 1.75 15h12.5A1.75 1.75 0 0 0 16 13.25v-8.5A1.75 1.75 0 0 0 14.25 3H7.5a.25.25 0 0 1-.2-.1l-.9-1.2C6.07 1.26 5.55 1 5 1H1.75Z"></path></svg><div class="overflow-hidden"><div class="react-directory-filename-cell"><div class="react-directory-truncate"><a title="external" aria-label="external, (Directory)" class="Link--primary" href="/RenderKit/oidn/tree/master/external">external</a></div></div></div></div></td><td class="react-directory-row-name-cell-large-screen" colSpan="1"><div class="react-directory-filename-column"><svg aria-hidden="true" focusable="false" class="icon-directory" viewBox="0 0 16 16" width="16" height="16" fill="currentColor" style="display:inline-block;user-select:none;vertical-align:text-bottom;overflow:visible"><path d="M1.75 1A1.75 1.75 0 0 0 0 2.75v10.5C0 14.216.784 15 1.75 15h12.5A1.75 1.75 0 0 0 16 13.25v-8.5A1.75 1.75 0 0 0 14.25 3H7.5a.25.25 0 0 1-.2-.1l-.9-1.2C6.07 1.26 5.55 1 5 1H1.75Z"></path></svg><div class="overflow-hidden"><div class="react-directory-filename-cell"><div class="react-directory-truncate"><a title="external" aria-label="external, (Directory)" class="Link--primary" href="/RenderKit/oidn/tree/master/external">external</a></div></div></div></div></td><td class="react-directory-row-commit-cell"><div class="Skeleton Skeleton--text"> </div></td><td><div class="Skeleton Skeleton--text"> </div></td></tr><tr class="react-directory-row undefined" id="folder-row-9"><td class="react-directory-row-name-cell-small-screen" colSpan="2"><div class="react-directory-filename-column"><svg aria-hidden="true" focusable="false" class="icon-directory" viewBox="0 0 16 16" width="16" height="16" fill="currentColor" style="display:inline-block;user-select:none;vertical-align:text-bottom;overflow:visible"><path d="M1.75 1A1.75 1.75 0 0 0 0 2.75v10.5C0 14.216.784 15 1.75 15h12.5A1.75 1.75 0 0 0 16 13.25v-8.5A1.75 1.75 0 0 0 14.25 3H7.5a.25.25 0 0 1-.2-.1l-.9-1.2C6.07 1.26 5.55 1 5 1H1.75Z"></path></svg><div class="overflow-hidden"><div class="react-directory-filename-cell"><div class="react-directory-truncate"><a title="This path skips through empty directories" aria-label="include/OpenImageDenoise, (Directory)" class="Link--primary" href="/RenderKit/oidn/tree/master/include/OpenImageDenoise"><span class="react-directory-default-color" data-testid="path-name-segment">include/</span><span class="" data-testid="path-name-segment">OpenImageDenoise</span></a></div></div></div></div></td><td class="react-directory-row-name-cell-large-screen" colSpan="1"><div class="react-directory-filename-column"><svg aria-hidden="true" focusable="false" class="icon-directory" viewBox="0 0 16 16" width="16" height="16" fill="currentColor" style="display:inline-block;user-select:none;vertical-align:text-bottom;overflow:visible"><path d="M1.75 1A1.75 1.75 0 0 0 0 2.75v10.5C0 14.216.784 15 1.75 15h12.5A1.75 1.75 0 0 0 16 13.25v-8.5A1.75 1.75 0 0 0 14.25 3H7.5a.25.25 0 0 1-.2-.1l-.9-1.2C6.07 1.26 5.55 1 5 1H1.75Z"></path></svg><div class="overflow-hidden"><div class="react-directory-filename-cell"><div class="react-directory-truncate"><a title="This path skips through empty directories" aria-label="include/OpenImageDenoise, (Directory)" class="Link--primary" href="/RenderKit/oidn/tree/master/include/OpenImageDenoise"><span class="react-directory-default-color" data-testid="path-name-segment">include/</span><span class="" data-testid="path-name-segment">OpenImageDenoise</span></a></div></div></div></div></td><td class="react-directory-row-commit-cell"><div class="Skeleton Skeleton--text"> </div></td><td><div class="Skeleton Skeleton--text"> </div></td></tr><tr class="react-directory-row truncate-for-mobile" id="folder-row-10"><td class="react-directory-row-name-cell-small-screen" colSpan="2"><div class="react-directory-filename-column"><svg aria-hidden="true" focusable="false" class="icon-directory" viewBox="0 0 16 16" width="16" height="16" fill="currentColor" style="display:inline-block;user-select:none;vertical-align:text-bottom;overflow:visible"><path d="M1.75 1A1.75 1.75 0 0 0 0 2.75v10.5C0 14.216.784 15 1.75 15h12.5A1.75 1.75 0 0 0 16 13.25v-8.5A1.75 1.75 0 0 0 14.25 3H7.5a.25.25 0 0 1-.2-.1l-.9-1.2C6.07 1.26 5.55 1 5 1H1.75Z"></path></svg><div class="overflow-hidden"><div class="react-directory-filename-cell"><div class="react-directory-truncate"><a title="scripts" aria-label="scripts, (Directory)" class="Link--primary" href="/RenderKit/oidn/tree/master/scripts">scripts</a></div></div></div></div></td><td class="react-directory-row-name-cell-large-screen" colSpan="1"><div class="react-directory-filename-column"><svg aria-hidden="true" focusable="false" class="icon-directory" viewBox="0 0 16 16" width="16" height="16" fill="currentColor" style="display:inline-block;user-select:none;vertical-align:text-bottom;overflow:visible"><path d="M1.75 1A1.75 1.75 0 0 0 0 2.75v10.5C0 14.216.784 15 1.75 15h12.5A1.75 1.75 0 0 0 16 13.25v-8.5A1.75 1.75 0 0 0 14.25 3H7.5a.25.25 0 0 1-.2-.1l-.9-1.2C6.07 1.26 5.55 1 5 1H1.75Z"></path></svg><div class="overflow-hidden"><div class="react-directory-filename-cell"><div class="react-directory-truncate"><a title="scripts" aria-label="scripts, (Directory)" class="Link--primary" href="/RenderKit/oidn/tree/master/scripts">scripts</a></div></div></div></div></td><td class="react-directory-row-commit-cell"><div class="Skeleton Skeleton--text"> </div></td><td><div class="Skeleton Skeleton--text"> </div></td></tr><tr class="react-directory-row truncate-for-mobile" id="folder-row-11"><td class="react-directory-row-name-cell-small-screen" colSpan="2"><div class="react-directory-filename-column"><svg aria-hidden="true" focusable="false" class="icon-directory" viewBox="0 0 16 16" width="16" height="16" fill="currentColor" style="display:inline-block;user-select:none;vertical-align:text-bottom;overflow:visible"><path d="M1.75 1A1.75 1.75 0 0 0 0 2.75v10.5C0 14.216.784 15 1.75 15h12.5A1.75 1.75 0 0 0 16 13.25v-8.5A1.75 1.75 0 0 0 14.25 3H7.5a.25.25 0 0 1-.2-.1l-.9-1.2C6.07 1.26 5.55 1 5 1H1.75Z"></path></svg><div class="overflow-hidden"><div class="react-directory-filename-cell"><div class="react-directory-truncate"><a title="training" aria-label="training, (Directory)" class="Link--primary" href="/RenderKit/oidn/tree/master/training">training</a></div></div></div></div></td><td class="react-directory-row-name-cell-large-screen" colSpan="1"><div class="react-directory-filename-column"><svg aria-hidden="true" focusable="false" class="icon-directory" viewBox="0 0 16 16" width="16" height="16" fill="currentColor" style="display:inline-block;user-select:none;vertical-align:text-bottom;overflow:visible"><path d="M1.75 1A1.75 1.75 0 0 0 0 2.75v10.5C0 14.216.784 15 1.75 15h12.5A1.75 1.75 0 0 0 16 13.25v-8.5A1.75 1.75 0 0 0 14.25 3H7.5a.25.25 0 0 1-.2-.1l-.9-1.2C6.07 1.26 5.55 1 5 1H1.75Z"></path></svg><div class="overflow-hidden"><div class="react-directory-filename-cell"><div class="react-directory-truncate"><a title="training" aria-label="training, (Directory)" class="Link--primary" href="/RenderKit/oidn/tree/master/training">training</a></div></div></div></div></td><td class="react-directory-row-commit-cell"><div class="Skeleton Skeleton--text"> </div></td><td><div class="Skeleton Skeleton--text"> </div></td></tr><tr class="react-directory-row truncate-for-mobile" id="folder-row-12"><td class="react-directory-row-name-cell-small-screen" colSpan="2"><div class="react-directory-filename-column"><svg aria-hidden="true" focusable="false" class="icon-directory" viewBox="0 0 16 16" width="16" height="16" fill="currentColor" style="display:inline-block;user-select:none;vertical-align:text-bottom;overflow:visible"><path d="M0 2.75C0 1.784.784 1 1.75 1H5c.55 0 1.07.26 1.4.7l.9 1.2a.25.25 0 0 0 .2.1h6.75c.966 0 1.75.784 1.75 1.75v8.5A1.75 1.75 0 0 1 14.25 15H1.75A1.75 1.75 0 0 1 0 13.25Zm9.42 9.36 2.883-2.677a.25.25 0 0 0 0-.366L9.42 6.39a.249.249 0 0 0-.42.183V8.5H4.75a.75.75 0 0 0 0 1.5H9v1.927c0 .218.26.331.42.183Z"></path></svg><div class="overflow-hidden"><div class="react-directory-filename-cell"><div class="react-directory-truncate"><a title="weights" aria-label="weights, (Submodule)" class="Link--primary" href="/RenderKit/oidn-weights/tree/28883d1769d5930e13cf7f1676dd852bd81ed9e7"><span style="color:var(--fgColor-accent, var(--color-accent-fg))">weights @ 28883d1</span></a></div></div></div></div></td><td class="react-directory-row-name-cell-large-screen" colSpan="1"><div class="react-directory-filename-column"><svg aria-hidden="true" focusable="false" class="icon-directory" viewBox="0 0 16 16" width="16" height="16" fill="currentColor" style="display:inline-block;user-select:none;vertical-align:text-bottom;overflow:visible"><path d="M0 2.75C0 1.784.784 1 1.75 1H5c.55 0 1.07.26 1.4.7l.9 1.2a.25.25 0 0 0 .2.1h6.75c.966 0 1.75.784 1.75 1.75v8.5A1.75 1.75 0 0 1 14.25 15H1.75A1.75 1.75 0 0 1 0 13.25Zm9.42 9.36 2.883-2.677a.25.25 0 0 0 0-.366L9.42 6.39a.249.249 0 0 0-.42.183V8.5H4.75a.75.75 0 0 0 0 1.5H9v1.927c0 .218.26.331.42.183Z"></path></svg><div class="overflow-hidden"><div class="react-directory-filename-cell"><div class="react-directory-truncate"><a title="weights" aria-label="weights, (Submodule)" class="Link--primary" href="/RenderKit/oidn-weights/tree/28883d1769d5930e13cf7f1676dd852bd81ed9e7"><span style="color:var(--fgColor-accent, var(--color-accent-fg))">weights @ 28883d1</span></a></div></div></div></div></td><td class="react-directory-row-commit-cell"><div class="Skeleton Skeleton--text"> </div></td><td><div class="Skeleton Skeleton--text"> </div></td></tr><tr class="react-directory-row truncate-for-mobile" id="folder-row-13"><td class="react-directory-row-name-cell-small-screen" colSpan="2"><div class="react-directory-filename-column"><svg aria-hidden="true" focusable="false" class="color-fg-muted" viewBox="0 0 16 16" width="16" height="16" fill="currentColor" style="display:inline-block;user-select:none;vertical-align:text-bottom;overflow:visible"><path d="M2 1.75C2 .784 2.784 0 3.75 0h6.586c.464 0 .909.184 1.237.513l2.914 2.914c.329.328.513.773.513 1.237v9.586A1.75 1.75 0 0 1 13.25 16h-9.5A1.75 1.75 0 0 1 2 14.25Zm1.75-.25a.25.25 0 0 0-.25.25v12.5c0 .138.112.25.25.25h9.5a.25.25 0 0 0 .25-.25V6h-2.75A1.75 1.75 0 0 1 9 4.25V1.5Zm6.75.062V4.25c0 .138.112.25.25.25h2.688l-.011-.013-2.914-2.914-.013-.011Z"></path></svg><div class="overflow-hidden"><div class="react-directory-filename-cell"><div class="react-directory-truncate"><a title=".gitignore" aria-label=".gitignore, (File)" class="Link--primary" href="/RenderKit/oidn/blob/master/.gitignore">.gitignore</a></div></div></div></div></td><td class="react-directory-row-name-cell-large-screen" colSpan="1"><div class="react-directory-filename-column"><svg aria-hidden="true" focusable="false" class="color-fg-muted" viewBox="0 0 16 16" width="16" height="16" fill="currentColor" style="display:inline-block;user-select:none;vertical-align:text-bottom;overflow:visible"><path d="M2 1.75C2 .784 2.784 0 3.75 0h6.586c.464 0 .909.184 1.237.513l2.914 2.914c.329.328.513.773.513 1.237v9.586A1.75 1.75 0 0 1 13.25 16h-9.5A1.75 1.75 0 0 1 2 14.25Zm1.75-.25a.25.25 0 0 0-.25.25v12.5c0 .138.112.25.25.25h9.5a.25.25 0 0 0 .25-.25V6h-2.75A1.75 1.75 0 0 1 9 4.25V1.5Zm6.75.062V4.25c0 .138.112.25.25.25h2.688l-.011-.013-2.914-2.914-.013-.011Z"></path></svg><div class="overflow-hidden"><div class="react-directory-filename-cell"><div class="react-directory-truncate"><a title=".gitignore" aria-label=".gitignore, (File)" class="Link--primary" href="/RenderKit/oidn/blob/master/.gitignore">.gitignore</a></div></div></div></div></td><td class="react-directory-row-commit-cell"><div class="Skeleton Skeleton--text"> </div></td><td><div class="Skeleton Skeleton--text"> </div></td></tr><tr class="react-directory-row truncate-for-mobile" id="folder-row-14"><td class="react-directory-row-name-cell-small-screen" colSpan="2"><div class="react-directory-filename-column"><svg aria-hidden="true" focusable="false" class="color-fg-muted" viewBox="0 0 16 16" width="16" height="16" fill="currentColor" style="display:inline-block;user-select:none;vertical-align:text-bottom;overflow:visible"><path d="M2 1.75C2 .784 2.784 0 3.75 0h6.586c.464 0 .909.184 1.237.513l2.914 2.914c.329.328.513.773.513 1.237v9.586A1.75 1.75 0 0 1 13.25 16h-9.5A1.75 1.75 0 0 1 2 14.25Zm1.75-.25a.25.25 0 0 0-.25.25v12.5c0 .138.112.25.25.25h9.5a.25.25 0 0 0 .25-.25V6h-2.75A1.75 1.75 0 0 1 9 4.25V1.5Zm6.75.062V4.25c0 .138.112.25.25.25h2.688l-.011-.013-2.914-2.914-.013-.011Z"></path></svg><div class="overflow-hidden"><div class="react-directory-filename-cell"><div class="react-directory-truncate"><a title=".gitmodules" aria-label=".gitmodules, (File)" class="Link--primary" href="/RenderKit/oidn/blob/master/.gitmodules">.gitmodules</a></div></div></div></div></td><td class="react-directory-row-name-cell-large-screen" colSpan="1"><div class="react-directory-filename-column"><svg aria-hidden="true" focusable="false" class="color-fg-muted" viewBox="0 0 16 16" width="16" height="16" fill="currentColor" style="display:inline-block;user-select:none;vertical-align:text-bottom;overflow:visible"><path d="M2 1.75C2 .784 2.784 0 3.75 0h6.586c.464 0 .909.184 1.237.513l2.914 2.914c.329.328.513.773.513 1.237v9.586A1.75 1.75 0 0 1 13.25 16h-9.5A1.75 1.75 0 0 1 2 14.25Zm1.75-.25a.25.25 0 0 0-.25.25v12.5c0 .138.112.25.25.25h9.5a.25.25 0 0 0 .25-.25V6h-2.75A1.75 1.75 0 0 1 9 4.25V1.5Zm6.75.062V4.25c0 .138.112.25.25.25h2.688l-.011-.013-2.914-2.914-.013-.011Z"></path></svg><div class="overflow-hidden"><div class="react-directory-filename-cell"><div class="react-directory-truncate"><a title=".gitmodules" aria-label=".gitmodules, (File)" class="Link--primary" href="/RenderKit/oidn/blob/master/.gitmodules">.gitmodules</a></div></div></div></div></td><td class="react-directory-row-commit-cell"><div class="Skeleton Skeleton--text"> </div></td><td><div class="Skeleton Skeleton--text"> </div></td></tr><tr class="react-directory-row truncate-for-mobile" id="folder-row-15"><td class="react-directory-row-name-cell-small-screen" colSpan="2"><div class="react-directory-filename-column"><svg aria-hidden="true" focusable="false" class="color-fg-muted" viewBox="0 0 16 16" width="16" height="16" fill="currentColor" style="display:inline-block;user-select:none;vertical-align:text-bottom;overflow:visible"><path d="M2 1.75C2 .784 2.784 0 3.75 0h6.586c.464 0 .909.184 1.237.513l2.914 2.914c.329.328.513.773.513 1.237v9.586A1.75 1.75 0 0 1 13.25 16h-9.5A1.75 1.75 0 0 1 2 14.25Zm1.75-.25a.25.25 0 0 0-.25.25v12.5c0 .138.112.25.25.25h9.5a.25.25 0 0 0 .25-.25V6h-2.75A1.75 1.75 0 0 1 9 4.25V1.5Zm6.75.062V4.25c0 .138.112.25.25.25h2.688l-.011-.013-2.914-2.914-.013-.011Z"></path></svg><div class="overflow-hidden"><div class="react-directory-filename-cell"><div class="react-directory-truncate"><a title="CHANGELOG.md" aria-label="CHANGELOG.md, (File)" class="Link--primary" href="/RenderKit/oidn/blob/master/CHANGELOG.md">CHANGELOG.md</a></div></div></div></div></td><td class="react-directory-row-name-cell-large-screen" colSpan="1"><div class="react-directory-filename-column"><svg aria-hidden="true" focusable="false" class="color-fg-muted" viewBox="0 0 16 16" width="16" height="16" fill="currentColor" style="display:inline-block;user-select:none;vertical-align:text-bottom;overflow:visible"><path d="M2 1.75C2 .784 2.784 0 3.75 0h6.586c.464 0 .909.184 1.237.513l2.914 2.914c.329.328.513.773.513 1.237v9.586A1.75 1.75 0 0 1 13.25 16h-9.5A1.75 1.75 0 0 1 2 14.25Zm1.75-.25a.25.25 0 0 0-.25.25v12.5c0 .138.112.25.25.25h9.5a.25.25 0 0 0 .25-.25V6h-2.75A1.75 1.75 0 0 1 9 4.25V1.5Zm6.75.062V4.25c0 .138.112.25.25.25h2.688l-.011-.013-2.914-2.914-.013-.011Z"></path></svg><div class="overflow-hidden"><div class="react-directory-filename-cell"><div class="react-directory-truncate"><a title="CHANGELOG.md" aria-label="CHANGELOG.md, (File)" class="Link--primary" href="/RenderKit/oidn/blob/master/CHANGELOG.md">CHANGELOG.md</a></div></div></div></div></td><td class="react-directory-row-commit-cell"><div class="Skeleton Skeleton--text"> </div></td><td><div class="Skeleton Skeleton--text"> </div></td></tr><tr class="react-directory-row truncate-for-mobile" id="folder-row-16"><td class="react-directory-row-name-cell-small-screen" colSpan="2"><div class="react-directory-filename-column"><svg aria-hidden="true" focusable="false" class="color-fg-muted" viewBox="0 0 16 16" width="16" height="16" fill="currentColor" style="display:inline-block;user-select:none;vertical-align:text-bottom;overflow:visible"><path d="M2 1.75C2 .784 2.784 0 3.75 0h6.586c.464 0 .909.184 1.237.513l2.914 2.914c.329.328.513.773.513 1.237v9.586A1.75 1.75 0 0 1 13.25 16h-9.5A1.75 1.75 0 0 1 2 14.25Zm1.75-.25a.25.25 0 0 0-.25.25v12.5c0 .138.112.25.25.25h9.5a.25.25 0 0 0 .25-.25V6h-2.75A1.75 1.75 0 0 1 9 4.25V1.5Zm6.75.062V4.25c0 .138.112.25.25.25h2.688l-.011-.013-2.914-2.914-.013-.011Z"></path></svg><div class="overflow-hidden"><div class="react-directory-filename-cell"><div class="react-directory-truncate"><a title="CMakeLists.txt" aria-label="CMakeLists.txt, (File)" class="Link--primary" href="/RenderKit/oidn/blob/master/CMakeLists.txt">CMakeLists.txt</a></div></div></div></div></td><td class="react-directory-row-name-cell-large-screen" colSpan="1"><div class="react-directory-filename-column"><svg aria-hidden="true" focusable="false" class="color-fg-muted" viewBox="0 0 16 16" width="16" height="16" fill="currentColor" style="display:inline-block;user-select:none;vertical-align:text-bottom;overflow:visible"><path d="M2 1.75C2 .784 2.784 0 3.75 0h6.586c.464 0 .909.184 1.237.513l2.914 2.914c.329.328.513.773.513 1.237v9.586A1.75 1.75 0 0 1 13.25 16h-9.5A1.75 1.75 0 0 1 2 14.25Zm1.75-.25a.25.25 0 0 0-.25.25v12.5c0 .138.112.25.25.25h9.5a.25.25 0 0 0 .25-.25V6h-2.75A1.75 1.75 0 0 1 9 4.25V1.5Zm6.75.062V4.25c0 .138.112.25.25.25h2.688l-.011-.013-2.914-2.914-.013-.011Z"></path></svg><div class="overflow-hidden"><div class="react-directory-filename-cell"><div class="react-directory-truncate"><a title="CMakeLists.txt" aria-label="CMakeLists.txt, (File)" class="Link--primary" href="/RenderKit/oidn/blob/master/CMakeLists.txt">CMakeLists.txt</a></div></div></div></div></td><td class="react-directory-row-commit-cell"><div class="Skeleton Skeleton--text"> </div></td><td><div class="Skeleton Skeleton--text"> </div></td></tr><tr class="react-directory-row truncate-for-mobile" id="folder-row-17"><td class="react-directory-row-name-cell-small-screen" colSpan="2"><div class="react-directory-filename-column"><svg aria-hidden="true" focusable="false" class="color-fg-muted" viewBox="0 0 16 16" width="16" height="16" fill="currentColor" style="display:inline-block;user-select:none;vertical-align:text-bottom;overflow:visible"><path d="M2 1.75C2 .784 2.784 0 3.75 0h6.586c.464 0 .909.184 1.237.513l2.914 2.914c.329.328.513.773.513 1.237v9.586A1.75 1.75 0 0 1 13.25 16h-9.5A1.75 1.75 0 0 1 2 14.25Zm1.75-.25a.25.25 0 0 0-.25.25v12.5c0 .138.112.25.25.25h9.5a.25.25 0 0 0 .25-.25V6h-2.75A1.75 1.75 0 0 1 9 4.25V1.5Zm6.75.062V4.25c0 .138.112.25.25.25h2.688l-.011-.013-2.914-2.914-.013-.011Z"></path></svg><div class="overflow-hidden"><div class="react-directory-filename-cell"><div class="react-directory-truncate"><a title="LICENSE.txt" aria-label="LICENSE.txt, (File)" class="Link--primary" href="/RenderKit/oidn/blob/master/LICENSE.txt">LICENSE.txt</a></div></div></div></div></td><td class="react-directory-row-name-cell-large-screen" colSpan="1"><div class="react-directory-filename-column"><svg aria-hidden="true" focusable="false" class="color-fg-muted" viewBox="0 0 16 16" width="16" height="16" fill="currentColor" style="display:inline-block;user-select:none;vertical-align:text-bottom;overflow:visible"><path d="M2 1.75C2 .784 2.784 0 3.75 0h6.586c.464 0 .909.184 1.237.513l2.914 2.914c.329.328.513.773.513 1.237v9.586A1.75 1.75 0 0 1 13.25 16h-9.5A1.75 1.75 0 0 1 2 14.25Zm1.75-.25a.25.25 0 0 0-.25.25v12.5c0 .138.112.25.25.25h9.5a.25.25 0 0 0 .25-.25V6h-2.75A1.75 1.75 0 0 1 9 4.25V1.5Zm6.75.062V4.25c0 .138.112.25.25.25h2.688l-.011-.013-2.914-2.914-.013-.011Z"></path></svg><div class="overflow-hidden"><div class="react-directory-filename-cell"><div class="react-directory-truncate"><a title="LICENSE.txt" aria-label="LICENSE.txt, (File)" class="Link--primary" href="/RenderKit/oidn/blob/master/LICENSE.txt">LICENSE.txt</a></div></div></div></div></td><td class="react-directory-row-commit-cell"><div class="Skeleton Skeleton--text"> </div></td><td><div class="Skeleton Skeleton--text"> </div></td></tr><tr class="react-directory-row truncate-for-mobile" id="folder-row-18"><td class="react-directory-row-name-cell-small-screen" colSpan="2"><div class="react-directory-filename-column"><svg aria-hidden="true" focusable="false" class="color-fg-muted" viewBox="0 0 16 16" width="16" height="16" fill="currentColor" style="display:inline-block;user-select:none;vertical-align:text-bottom;overflow:visible"><path d="M2 1.75C2 .784 2.784 0 3.75 0h6.586c.464 0 .909.184 1.237.513l2.914 2.914c.329.328.513.773.513 1.237v9.586A1.75 1.75 0 0 1 13.25 16h-9.5A1.75 1.75 0 0 1 2 14.25Zm1.75-.25a.25.25 0 0 0-.25.25v12.5c0 .138.112.25.25.25h9.5a.25.25 0 0 0 .25-.25V6h-2.75A1.75 1.75 0 0 1 9 4.25V1.5Zm6.75.062V4.25c0 .138.112.25.25.25h2.688l-.011-.013-2.914-2.914-.013-.011Z"></path></svg><div class="overflow-hidden"><div class="react-directory-filename-cell"><div class="react-directory-truncate"><a title="README.md" aria-label="README.md, (File)" class="Link--primary" href="/RenderKit/oidn/blob/master/README.md">README.md</a></div></div></div></div></td><td class="react-directory-row-name-cell-large-screen" colSpan="1"><div class="react-directory-filename-column"><svg aria-hidden="true" focusable="false" class="color-fg-muted" viewBox="0 0 16 16" width="16" height="16" fill="currentColor" style="display:inline-block;user-select:none;vertical-align:text-bottom;overflow:visible"><path d="M2 1.75C2 .784 2.784 0 3.75 0h6.586c.464 0 .909.184 1.237.513l2.914 2.914c.329.328.513.773.513 1.237v9.586A1.75 1.75 0 0 1 13.25 16h-9.5A1.75 1.75 0 0 1 2 14.25Zm1.75-.25a.25.25 0 0 0-.25.25v12.5c0 .138.112.25.25.25h9.5a.25.25 0 0 0 .25-.25V6h-2.75A1.75 1.75 0 0 1 9 4.25V1.5Zm6.75.062V4.25c0 .138.112.25.25.25h2.688l-.011-.013-2.914-2.914-.013-.011Z"></path></svg><div class="overflow-hidden"><div class="react-directory-filename-cell"><div class="react-directory-truncate"><a title="README.md" aria-label="README.md, (File)" class="Link--primary" href="/RenderKit/oidn/blob/master/README.md">README.md</a></div></div></div></div></td><td class="react-directory-row-commit-cell"><div class="Skeleton Skeleton--text"> </div></td><td><div class="Skeleton Skeleton--text"> </div></td></tr><tr class="react-directory-row truncate-for-mobile" id="folder-row-19"><td class="react-directory-row-name-cell-small-screen" colSpan="2"><div class="react-directory-filename-column"><svg aria-hidden="true" focusable="false" class="color-fg-muted" viewBox="0 0 16 16" width="16" height="16" fill="currentColor" style="display:inline-block;user-select:none;vertical-align:text-bottom;overflow:visible"><path d="M2 1.75C2 .784 2.784 0 3.75 0h6.586c.464 0 .909.184 1.237.513l2.914 2.914c.329.328.513.773.513 1.237v9.586A1.75 1.75 0 0 1 13.25 16h-9.5A1.75 1.75 0 0 1 2 14.25Zm1.75-.25a.25.25 0 0 0-.25.25v12.5c0 .138.112.25.25.25h9.5a.25.25 0 0 0 .25-.25V6h-2.75A1.75 1.75 0 0 1 9 4.25V1.5Zm6.75.062V4.25c0 .138.112.25.25.25h2.688l-.011-.013-2.914-2.914-.013-.011Z"></path></svg><div class="overflow-hidden"><div class="react-directory-filename-cell"><div class="react-directory-truncate"><a title="SECURITY.md" aria-label="SECURITY.md, (File)" class="Link--primary" href="/RenderKit/oidn/blob/master/SECURITY.md">SECURITY.md</a></div></div></div></div></td><td class="react-directory-row-name-cell-large-screen" colSpan="1"><div class="react-directory-filename-column"><svg aria-hidden="true" focusable="false" class="color-fg-muted" viewBox="0 0 16 16" width="16" height="16" fill="currentColor" style="display:inline-block;user-select:none;vertical-align:text-bottom;overflow:visible"><path d="M2 1.75C2 .784 2.784 0 3.75 0h6.586c.464 0 .909.184 1.237.513l2.914 2.914c.329.328.513.773.513 1.237v9.586A1.75 1.75 0 0 1 13.25 16h-9.5A1.75 1.75 0 0 1 2 14.25Zm1.75-.25a.25.25 0 0 0-.25.25v12.5c0 .138.112.25.25.25h9.5a.25.25 0 0 0 .25-.25V6h-2.75A1.75 1.75 0 0 1 9 4.25V1.5Zm6.75.062V4.25c0 .138.112.25.25.25h2.688l-.011-.013-2.914-2.914-.013-.011Z"></path></svg><div class="overflow-hidden"><div class="react-directory-filename-cell"><div class="react-directory-truncate"><a title="SECURITY.md" aria-label="SECURITY.md, (File)" class="Link--primary" href="/RenderKit/oidn/blob/master/SECURITY.md">SECURITY.md</a></div></div></div></div></td><td class="react-directory-row-commit-cell"><div class="Skeleton Skeleton--text"> </div></td><td><div class="Skeleton Skeleton--text"> </div></td></tr><tr class="react-directory-row truncate-for-mobile" id="folder-row-20"><td class="react-directory-row-name-cell-small-screen" colSpan="2"><div class="react-directory-filename-column"><svg aria-hidden="true" focusable="false" class="color-fg-muted" viewBox="0 0 16 16" width="16" height="16" fill="currentColor" style="display:inline-block;user-select:none;vertical-align:text-bottom;overflow:visible"><path d="M2 1.75C2 .784 2.784 0 3.75 0h6.586c.464 0 .909.184 1.237.513l2.914 2.914c.329.328.513.773.513 1.237v9.586A1.75 1.75 0 0 1 13.25 16h-9.5A1.75 1.75 0 0 1 2 14.25Zm1.75-.25a.25.25 0 0 0-.25.25v12.5c0 .138.112.25.25.25h9.5a.25.25 0 0 0 .25-.25V6h-2.75A1.75 1.75 0 0 1 9 4.25V1.5Zm6.75.062V4.25c0 .138.112.25.25.25h2.688l-.011-.013-2.914-2.914-.013-.011Z"></path></svg><div class="overflow-hidden"><div class="react-directory-filename-cell"><div class="react-directory-truncate"><a title="readme.pdf" aria-label="readme.pdf, (File)" class="Link--primary" href="/RenderKit/oidn/blob/master/readme.pdf">readme.pdf</a></div></div></div></div></td><td class="react-directory-row-name-cell-large-screen" colSpan="1"><div class="react-directory-filename-column"><svg aria-hidden="true" focusable="false" class="color-fg-muted" viewBox="0 0 16 16" width="16" height="16" fill="currentColor" style="display:inline-block;user-select:none;vertical-align:text-bottom;overflow:visible"><path d="M2 1.75C2 .784 2.784 0 3.75 0h6.586c.464 0 .909.184 1.237.513l2.914 2.914c.329.328.513.773.513 1.237v9.586A1.75 1.75 0 0 1 13.25 16h-9.5A1.75 1.75 0 0 1 2 14.25Zm1.75-.25a.25.25 0 0 0-.25.25v12.5c0 .138.112.25.25.25h9.5a.25.25 0 0 0 .25-.25V6h-2.75A1.75 1.75 0 0 1 9 4.25V1.5Zm6.75.062V4.25c0 .138.112.25.25.25h2.688l-.011-.013-2.914-2.914-.013-.011Z"></path></svg><div class="overflow-hidden"><div class="react-directory-filename-cell"><div class="react-directory-truncate"><a title="readme.pdf" aria-label="readme.pdf, (File)" class="Link--primary" href="/RenderKit/oidn/blob/master/readme.pdf">readme.pdf</a></div></div></div></div></td><td class="react-directory-row-commit-cell"><div class="Skeleton Skeleton--text"> </div></td><td><div class="Skeleton Skeleton--text"> </div></td></tr><tr class="react-directory-row truncate-for-mobile" id="folder-row-21"><td class="react-directory-row-name-cell-small-screen" colSpan="2"><div class="react-directory-filename-column"><svg aria-hidden="true" focusable="false" class="color-fg-muted" viewBox="0 0 16 16" width="16" height="16" fill="currentColor" style="display:inline-block;user-select:none;vertical-align:text-bottom;overflow:visible"><path d="M2 1.75C2 .784 2.784 0 3.75 0h6.586c.464 0 .909.184 1.237.513l2.914 2.914c.329.328.513.773.513 1.237v9.586A1.75 1.75 0 0 1 13.25 16h-9.5A1.75 1.75 0 0 1 2 14.25Zm1.75-.25a.25.25 0 0 0-.25.25v12.5c0 .138.112.25.25.25h9.5a.25.25 0 0 0 .25-.25V6h-2.75A1.75 1.75 0 0 1 9 4.25V1.5Zm6.75.062V4.25c0 .138.112.25.25.25h2.688l-.011-.013-2.914-2.914-.013-.011Z"></path></svg><div class="overflow-hidden"><div class="react-directory-filename-cell"><div class="react-directory-truncate"><a title="requirements.txt" aria-label="requirements.txt, (File)" class="Link--primary" href="/RenderKit/oidn/blob/master/requirements.txt">requirements.txt</a></div></div></div></div></td><td class="react-directory-row-name-cell-large-screen" colSpan="1"><div class="react-directory-filename-column"><svg aria-hidden="true" focusable="false" class="color-fg-muted" viewBox="0 0 16 16" width="16" height="16" fill="currentColor" style="display:inline-block;user-select:none;vertical-align:text-bottom;overflow:visible"><path d="M2 1.75C2 .784 2.784 0 3.75 0h6.586c.464 0 .909.184 1.237.513l2.914 2.914c.329.328.513.773.513 1.237v9.586A1.75 1.75 0 0 1 13.25 16h-9.5A1.75 1.75 0 0 1 2 14.25Zm1.75-.25a.25.25 0 0 0-.25.25v12.5c0 .138.112.25.25.25h9.5a.25.25 0 0 0 .25-.25V6h-2.75A1.75 1.75 0 0 1 9 4.25V1.5Zm6.75.062V4.25c0 .138.112.25.25.25h2.688l-.011-.013-2.914-2.914-.013-.011Z"></path></svg><div class="overflow-hidden"><div class="react-directory-filename-cell"><div class="react-directory-truncate"><a title="requirements.txt" aria-label="requirements.txt, (File)" class="Link--primary" href="/RenderKit/oidn/blob/master/requirements.txt">requirements.txt</a></div></div></div></div></td><td class="react-directory-row-commit-cell"><div class="Skeleton Skeleton--text"> </div></td><td><div class="Skeleton Skeleton--text"> </div></td></tr><tr class="react-directory-row truncate-for-mobile" id="folder-row-22"><td class="react-directory-row-name-cell-small-screen" colSpan="2"><div class="react-directory-filename-column"><svg aria-hidden="true" focusable="false" class="color-fg-muted" viewBox="0 0 16 16" width="16" height="16" fill="currentColor" style="display:inline-block;user-select:none;vertical-align:text-bottom;overflow:visible"><path d="M2 1.75C2 .784 2.784 0 3.75 0h6.586c.464 0 .909.184 1.237.513l2.914 2.914c.329.328.513.773.513 1.237v9.586A1.75 1.75 0 0 1 13.25 16h-9.5A1.75 1.75 0 0 1 2 14.25Zm1.75-.25a.25.25 0 0 0-.25.25v12.5c0 .138.112.25.25.25h9.5a.25.25 0 0 0 .25-.25V6h-2.75A1.75 1.75 0 0 1 9 4.25V1.5Zm6.75.062V4.25c0 .138.112.25.25.25h2.688l-.011-.013-2.914-2.914-.013-.011Z"></path></svg><div class="overflow-hidden"><div class="react-directory-filename-cell"><div class="react-directory-truncate"><a title="third-party-programs-DPCPP.txt" aria-label="third-party-programs-DPCPP.txt, (File)" class="Link--primary" href="/RenderKit/oidn/blob/master/third-party-programs-DPCPP.txt">third-party-programs-DPCPP.txt</a></div></div></div></div></td><td class="react-directory-row-name-cell-large-screen" colSpan="1"><div class="react-directory-filename-column"><svg aria-hidden="true" focusable="false" class="color-fg-muted" viewBox="0 0 16 16" width="16" height="16" fill="currentColor" style="display:inline-block;user-select:none;vertical-align:text-bottom;overflow:visible"><path d="M2 1.75C2 .784 2.784 0 3.75 0h6.586c.464 0 .909.184 1.237.513l2.914 2.914c.329.328.513.773.513 1.237v9.586A1.75 1.75 0 0 1 13.25 16h-9.5A1.75 1.75 0 0 1 2 14.25Zm1.75-.25a.25.25 0 0 0-.25.25v12.5c0 .138.112.25.25.25h9.5a.25.25 0 0 0 .25-.25V6h-2.75A1.75 1.75 0 0 1 9 4.25V1.5Zm6.75.062V4.25c0 .138.112.25.25.25h2.688l-.011-.013-2.914-2.914-.013-.011Z"></path></svg><div class="overflow-hidden"><div class="react-directory-filename-cell"><div class="react-directory-truncate"><a title="third-party-programs-DPCPP.txt" aria-label="third-party-programs-DPCPP.txt, (File)" class="Link--primary" href="/RenderKit/oidn/blob/master/third-party-programs-DPCPP.txt">third-party-programs-DPCPP.txt</a></div></div></div></div></td><td class="react-directory-row-commit-cell"><div class="Skeleton Skeleton--text"> </div></td><td><div class="Skeleton Skeleton--text"> </div></td></tr><tr class="react-directory-row truncate-for-mobile" id="folder-row-23"><td class="react-directory-row-name-cell-small-screen" colSpan="2"><div class="react-directory-filename-column"><svg aria-hidden="true" focusable="false" class="color-fg-muted" viewBox="0 0 16 16" width="16" height="16" fill="currentColor" style="display:inline-block;user-select:none;vertical-align:text-bottom;overflow:visible"><path d="M2 1.75C2 .784 2.784 0 3.75 0h6.586c.464 0 .909.184 1.237.513l2.914 2.914c.329.328.513.773.513 1.237v9.586A1.75 1.75 0 0 1 13.25 16h-9.5A1.75 1.75 0 0 1 2 14.25Zm1.75-.25a.25.25 0 0 0-.25.25v12.5c0 .138.112.25.25.25h9.5a.25.25 0 0 0 .25-.25V6h-2.75A1.75 1.75 0 0 1 9 4.25V1.5Zm6.75.062V4.25c0 .138.112.25.25.25h2.688l-.011-.013-2.914-2.914-.013-.011Z"></path></svg><div class="overflow-hidden"><div class="react-directory-filename-cell"><div class="react-directory-truncate"><a title="third-party-programs-oneDNN.txt" aria-label="third-party-programs-oneDNN.txt, (File)" class="Link--primary" href="/RenderKit/oidn/blob/master/third-party-programs-oneDNN.txt">third-party-programs-oneDNN.txt</a></div></div></div></div></td><td class="react-directory-row-name-cell-large-screen" colSpan="1"><div class="react-directory-filename-column"><svg aria-hidden="true" focusable="false" class="color-fg-muted" viewBox="0 0 16 16" width="16" height="16" fill="currentColor" style="display:inline-block;user-select:none;vertical-align:text-bottom;overflow:visible"><path d="M2 1.75C2 .784 2.784 0 3.75 0h6.586c.464 0 .909.184 1.237.513l2.914 2.914c.329.328.513.773.513 1.237v9.586A1.75 1.75 0 0 1 13.25 16h-9.5A1.75 1.75 0 0 1 2 14.25Zm1.75-.25a.25.25 0 0 0-.25.25v12.5c0 .138.112.25.25.25h9.5a.25.25 0 0 0 .25-.25V6h-2.75A1.75 1.75 0 0 1 9 4.25V1.5Zm6.75.062V4.25c0 .138.112.25.25.25h2.688l-.011-.013-2.914-2.914-.013-.011Z"></path></svg><div class="overflow-hidden"><div class="react-directory-filename-cell"><div class="react-directory-truncate"><a title="third-party-programs-oneDNN.txt" aria-label="third-party-programs-oneDNN.txt, (File)" class="Link--primary" href="/RenderKit/oidn/blob/master/third-party-programs-oneDNN.txt">third-party-programs-oneDNN.txt</a></div></div></div></div></td><td class="react-directory-row-commit-cell"><div class="Skeleton Skeleton--text"> </div></td><td><div class="Skeleton Skeleton--text"> </div></td></tr><tr class="react-directory-row truncate-for-mobile" id="folder-row-24"><td class="react-directory-row-name-cell-small-screen" colSpan="2"><div class="react-directory-filename-column"><svg aria-hidden="true" focusable="false" class="color-fg-muted" viewBox="0 0 16 16" width="16" height="16" fill="currentColor" style="display:inline-block;user-select:none;vertical-align:text-bottom;overflow:visible"><path d="M2 1.75C2 .784 2.784 0 3.75 0h6.586c.464 0 .909.184 1.237.513l2.914 2.914c.329.328.513.773.513 1.237v9.586A1.75 1.75 0 0 1 13.25 16h-9.5A1.75 1.75 0 0 1 2 14.25Zm1.75-.25a.25.25 0 0 0-.25.25v12.5c0 .138.112.25.25.25h9.5a.25.25 0 0 0 .25-.25V6h-2.75A1.75 1.75 0 0 1 9 4.25V1.5Zm6.75.062V4.25c0 .138.112.25.25.25h2.688l-.011-.013-2.914-2.914-.013-.011Z"></path></svg><div class="overflow-hidden"><div class="react-directory-filename-cell"><div class="react-directory-truncate"><a title="third-party-programs-oneTBB.txt" aria-label="third-party-programs-oneTBB.txt, (File)" class="Link--primary" href="/RenderKit/oidn/blob/master/third-party-programs-oneTBB.txt">third-party-programs-oneTBB.txt</a></div></div></div></div></td><td class="react-directory-row-name-cell-large-screen" colSpan="1"><div class="react-directory-filename-column"><svg aria-hidden="true" focusable="false" class="color-fg-muted" viewBox="0 0 16 16" width="16" height="16" fill="currentColor" style="display:inline-block;user-select:none;vertical-align:text-bottom;overflow:visible"><path d="M2 1.75C2 .784 2.784 0 3.75 0h6.586c.464 0 .909.184 1.237.513l2.914 2.914c.329.328.513.773.513 1.237v9.586A1.75 1.75 0 0 1 13.25 16h-9.5A1.75 1.75 0 0 1 2 14.25Zm1.75-.25a.25.25 0 0 0-.25.25v12.5c0 .138.112.25.25.25h9.5a.25.25 0 0 0 .25-.25V6h-2.75A1.75 1.75 0 0 1 9 4.25V1.5Zm6.75.062V4.25c0 .138.112.25.25.25h2.688l-.011-.013-2.914-2.914-.013-.011Z"></path></svg><div class="overflow-hidden"><div class="react-directory-filename-cell"><div class="react-directory-truncate"><a title="third-party-programs-oneTBB.txt" aria-label="third-party-programs-oneTBB.txt, (File)" class="Link--primary" href="/RenderKit/oidn/blob/master/third-party-programs-oneTBB.txt">third-party-programs-oneTBB.txt</a></div></div></div></div></td><td class="react-directory-row-commit-cell"><div class="Skeleton Skeleton--text"> </div></td><td><div class="Skeleton Skeleton--text"> </div></td></tr><tr class="react-directory-row truncate-for-mobile" id="folder-row-25"><td class="react-directory-row-name-cell-small-screen" colSpan="2"><div class="react-directory-filename-column"><svg aria-hidden="true" focusable="false" class="color-fg-muted" viewBox="0 0 16 16" width="16" height="16" fill="currentColor" style="display:inline-block;user-select:none;vertical-align:text-bottom;overflow:visible"><path d="M2 1.75C2 .784 2.784 0 3.75 0h6.586c.464 0 .909.184 1.237.513l2.914 2.914c.329.328.513.773.513 1.237v9.586A1.75 1.75 0 0 1 13.25 16h-9.5A1.75 1.75 0 0 1 2 14.25Zm1.75-.25a.25.25 0 0 0-.25.25v12.5c0 .138.112.25.25.25h9.5a.25.25 0 0 0 .25-.25V6h-2.75A1.75 1.75 0 0 1 9 4.25V1.5Zm6.75.062V4.25c0 .138.112.25.25.25h2.688l-.011-.013-2.914-2.914-.013-.011Z"></path></svg><div class="overflow-hidden"><div class="react-directory-filename-cell"><div class="react-directory-truncate"><a title="third-party-programs.txt" aria-label="third-party-programs.txt, (File)" class="Link--primary" href="/RenderKit/oidn/blob/master/third-party-programs.txt">third-party-programs.txt</a></div></div></div></div></td><td class="react-directory-row-name-cell-large-screen" colSpan="1"><div class="react-directory-filename-column"><svg aria-hidden="true" focusable="false" class="color-fg-muted" viewBox="0 0 16 16" width="16" height="16" fill="currentColor" style="display:inline-block;user-select:none;vertical-align:text-bottom;overflow:visible"><path d="M2 1.75C2 .784 2.784 0 3.75 0h6.586c.464 0 .909.184 1.237.513l2.914 2.914c.329.328.513.773.513 1.237v9.586A1.75 1.75 0 0 1 13.25 16h-9.5A1.75 1.75 0 0 1 2 14.25Zm1.75-.25a.25.25 0 0 0-.25.25v12.5c0 .138.112.25.25.25h9.5a.25.25 0 0 0 .25-.25V6h-2.75A1.75 1.75 0 0 1 9 4.25V1.5Zm6.75.062V4.25c0 .138.112.25.25.25h2.688l-.011-.013-2.914-2.914-.013-.011Z"></path></svg><div class="overflow-hidden"><div class="react-directory-filename-cell"><div class="react-directory-truncate"><a title="third-party-programs.txt" aria-label="third-party-programs.txt, (File)" class="Link--primary" href="/RenderKit/oidn/blob/master/third-party-programs.txt">third-party-programs.txt</a></div></div></div></div></td><td class="react-directory-row-commit-cell"><div class="Skeleton Skeleton--text"> </div></td><td><div class="Skeleton Skeleton--text"> </div></td></tr><tr class="Box-sc-g0xbh4-0 eNCcrz show-for-mobile" data-testid="view-all-files-row"><td colSpan="3" class="Box-sc-g0xbh4-0 bHTcCe"><div><button class="prc-Link-Link-85e08">View all files</button></div></td></tr></tbody></table></div><div class="Box-sc-g0xbh4-0 csrIcr"><div class="Box-sc-g0xbh4-0 bUQNHB"><div itemscope="" itemType="https://schema.org/abstract" class="Box-sc-g0xbh4-0 jPdcfu"><h2 class="_VisuallyHidden__VisuallyHidden-sc-11jhm7a-0 brGdpi">Repository files navigation</h2><nav aria-label="Repository files" class="UnderlineTabbedInterface__StyledUnderlineWrapper-sc-4ilrg0-0 iBVwpg"><ul role="list" class="UnderlineTabbedInterface__StyledUnderlineItemList-sc-4ilrg0-1 gJyWUl"><li class="Box-sc-g0xbh4-0 hUCRAk"><a href="#" aria-current="page" class="UnderlineTabbedInterface__StyledUnderlineItem-sc-4ilrg0-2 beOdPj"><span data-component="icon"><svg aria-hidden="true" focusable="false" class="octicon octicon-book" viewBox="0 0 16 16" width="16" height="16" fill="currentColor" style="display:inline-block;user-select:none;vertical-align:text-bottom;overflow:visible"><path d="M0 1.75A.75.75 0 0 1 .75 1h4.253c1.227 0 2.317.59 3 1.501A3.743 3.743 0 0 1 11.006 1h4.245a.75.75 0 0 1 .75.75v10.5a.75.75 0 0 1-.75.75h-4.507a2.25 2.25 0 0 0-1.591.659l-.622.621a.75.75 0 0 1-1.06 0l-.622-.621A2.25 2.25 0 0 0 5.258 13H.75a.75.75 0 0 1-.75-.75Zm7.251 10.324.004-5.073-.002-2.253A2.25 2.25 0 0 0 5.003 2.5H1.5v9h3.757a3.75 3.75 0 0 1 1.994.574ZM8.755 4.75l-.004 7.322a3.752 3.752 0 0 1 1.992-.572H14.5v-9h-3.495a2.25 2.25 0 0 0-2.25 2.25Z"></path></svg></span><span data-component="text" data-content="README">README</span></a></li><li class="Box-sc-g0xbh4-0 hUCRAk"><a href="#" class="UnderlineTabbedInterface__StyledUnderlineItem-sc-4ilrg0-2 beOdPj"><span data-component="icon"><svg aria-hidden="true" focusable="false" class="octicon octicon-law" viewBox="0 0 16 16" width="16" height="16" fill="currentColor" style="display:inline-block;user-select:none;vertical-align:text-bottom;overflow:visible"><path d="M8.75.75V2h.985c.304 0 .603.08.867.231l1.29.736c.038.022.08.033.124.033h2.234a.75.75 0 0 1 0 1.5h-.427l2.111 4.692a.75.75 0 0 1-.154.838l-.53-.53.529.531-.001.002-.002.002-.006.006-.006.005-.01.01-.045.04c-.21.176-.441.327-.686.45C14.556 10.78 13.88 11 13 11a4.498 4.498 0 0 1-2.023-.454 3.544 3.544 0 0 1-.686-.45l-.045-.04-.016-.015-.006-.006-.004-.004v-.001a.75.75 0 0 1-.154-.838L12.178 4.5h-.162c-.305 0-.604-.079-.868-.231l-1.29-.736a.245.245 0 0 0-.124-.033H8.75V13h2.5a.75.75 0 0 1 0 1.5h-6.5a.75.75 0 0 1 0-1.5h2.5V3.5h-.984a.245.245 0 0 0-.124.033l-1.289.737c-.265.15-.564.23-.869.23h-.162l2.112 4.692a.75.75 0 0 1-.154.838l-.53-.53.529.531-.001.002-.002.002-.006.006-.016.015-.045.04c-.21.176-.441.327-.686.45C4.556 10.78 3.88 11 3 11a4.498 4.498 0 0 1-2.023-.454 3.544 3.544 0 0 1-.686-.45l-.045-.04-.016-.015-.006-.006-.004-.004v-.001a.75.75 0 0 1-.154-.838L2.178 4.5H1.75a.75.75 0 0 1 0-1.5h2.234a.249.249 0 0 0 .125-.033l1.288-.737c.265-.15.564-.23.869-.23h.984V.75a.75.75 0 0 1 1.5 0Zm2.945 8.477c.285.135.718.273 1.305.273s1.02-.138 1.305-.273L13 6.327Zm-10 0c.285.135.718.273 1.305.273s1.02-.138 1.305-.273L3 6.327Z"></path></svg></span><span data-component="text" data-content="Apache-2.0 license">Apache-2.0 license</span></a></li><li class="Box-sc-g0xbh4-0 hUCRAk"><a href="#" class="UnderlineTabbedInterface__StyledUnderlineItem-sc-4ilrg0-2 beOdPj"><span data-component="icon"><svg aria-hidden="true" focusable="false" class="octicon octicon-law" viewBox="0 0 16 16" width="16" height="16" fill="currentColor" style="display:inline-block;user-select:none;vertical-align:text-bottom;overflow:visible"><path d="M8.75.75V2h.985c.304 0 .603.08.867.231l1.29.736c.038.022.08.033.124.033h2.234a.75.75 0 0 1 0 1.5h-.427l2.111 4.692a.75.75 0 0 1-.154.838l-.53-.53.529.531-.001.002-.002.002-.006.006-.006.005-.01.01-.045.04c-.21.176-.441.327-.686.45C14.556 10.78 13.88 11 13 11a4.498 4.498 0 0 1-2.023-.454 3.544 3.544 0 0 1-.686-.45l-.045-.04-.016-.015-.006-.006-.004-.004v-.001a.75.75 0 0 1-.154-.838L12.178 4.5h-.162c-.305 0-.604-.079-.868-.231l-1.29-.736a.245.245 0 0 0-.124-.033H8.75V13h2.5a.75.75 0 0 1 0 1.5h-6.5a.75.75 0 0 1 0-1.5h2.5V3.5h-.984a.245.245 0 0 0-.124.033l-1.289.737c-.265.15-.564.23-.869.23h-.162l2.112 4.692a.75.75 0 0 1-.154.838l-.53-.53.529.531-.001.002-.002.002-.006.006-.016.015-.045.04c-.21.176-.441.327-.686.45C4.556 10.78 3.88 11 3 11a4.498 4.498 0 0 1-2.023-.454 3.544 3.544 0 0 1-.686-.45l-.045-.04-.016-.015-.006-.006-.004-.004v-.001a.75.75 0 0 1-.154-.838L2.178 4.5H1.75a.75.75 0 0 1 0-1.5h2.234a.249.249 0 0 0 .125-.033l1.288-.737c.265-.15.564-.23.869-.23h.984V.75a.75.75 0 0 1 1.5 0Zm2.945 8.477c.285.135.718.273 1.305.273s1.02-.138 1.305-.273L13 6.327Zm-10 0c.285.135.718.273 1.305.273s1.02-.138 1.305-.273L3 6.327Z"></path></svg></span><span data-component="text" data-content="Security">Security</span></a></li></ul></nav><button style="--button-color:fg.subtle" type="button" aria-label="Outline" aria-haspopup="true" aria-expanded="false" tabindex="0" class="types__StyledButton-sc-ws60qy-0 gXPTqA" data-loading="false" data-size="medium" aria-describedby=":Rr9ab:-loading-announcement" id=":Rr9ab:"><svg aria-hidden="true" focusable="false" class="octicon octicon-list-unordered" viewBox="0 0 16 16" width="16" height="16" fill="currentColor" style="display:inline-block;user-select:none;vertical-align:text-bottom;overflow:visible"><path d="M5.75 2.5h8.5a.75.75 0 0 1 0 1.5h-8.5a.75.75 0 0 1 0-1.5Zm0 5h8.5a.75.75 0 0 1 0 1.5h-8.5a.75.75 0 0 1 0-1.5Zm0 5h8.5a.75.75 0 0 1 0 1.5h-8.5a.75.75 0 0 1 0-1.5ZM2 14a1 1 0 1 1 0-2 1 1 0 0 1 0 2Zm1-6a1 1 0 1 1-2 0 1 1 0 0 1 2 0ZM2 4a1 1 0 1 1 0-2 1 1 0 0 1 0 2Z"></path></svg></button></div><div class="Box-sc-g0xbh4-0 QkQOb js-snippet-clipboard-copy-unpositioned" data-hpc="true"><article class="markdown-body entry-content container-lg" itemprop="text"><div class="markdown-heading" dir="auto"><h1 tabindex="-1" class="heading-element" dir="auto">Intel® Open Image Denoise</h1><a id="user-content-intel-open-image-denoise" class="anchor" aria-label="Permalink: Intel® Open Image Denoise" href="#intel-open-image-denoise"><svg class="octicon octicon-link" viewBox="0 0 16 16" version="1.1" width="16" height="16" aria-hidden="true"><path d="m7.775 3.275 1.25-1.25a3.5 3.5 0 1 1 4.95 4.95l-2.5 2.5a3.5 3.5 0 0 1-4.95 0 .751.751 0 0 1 .018-1.042.751.751 0 0 1 1.042-.018 1.998 1.998 0 0 0 2.83 0l2.5-2.5a2.002 2.002 0 0 0-2.83-2.83l-1.25 1.25a.751.751 0 0 1-1.042-.018.751.751 0 0 1-.018-1.042Zm-4.69 9.64a1.998 1.998 0 0 0 2.83 0l1.25-1.25a.751.751 0 0 1 1.042.018.751.751 0 0 1 .018 1.042l-1.25 1.25a3.5 3.5 0 1 1-4.95-4.95l2.5-2.5a3.5 3.5 0 0 1 4.95 0 .751.751 0 0 1-.018 1.042.751.751 0 0 1-1.042.018 1.998 1.998 0 0 0-2.83 0l-2.5 2.5a1.998 1.998 0 0 0 0 2.83Z"></path></svg></a></div> <p dir="auto">This is release v2.3.1 of Intel Open Image Denoise. For changes and new features see the <a href="/RenderKit/oidn/blob/master/CHANGELOG.md">changelog</a>. Visit <a href="https://www.openimagedenoise.org" rel="nofollow">https://www.openimagedenoise.org</a> for more information.</p> <div class="markdown-heading" dir="auto"><h1 tabindex="-1" class="heading-element" dir="auto">Overview</h1><a id="user-content-overview" class="anchor" aria-label="Permalink: Overview" href="#overview"><svg class="octicon octicon-link" viewBox="0 0 16 16" version="1.1" width="16" height="16" aria-hidden="true"><path d="m7.775 3.275 1.25-1.25a3.5 3.5 0 1 1 4.95 4.95l-2.5 2.5a3.5 3.5 0 0 1-4.95 0 .751.751 0 0 1 .018-1.042.751.751 0 0 1 1.042-.018 1.998 1.998 0 0 0 2.83 0l2.5-2.5a2.002 2.002 0 0 0-2.83-2.83l-1.25 1.25a.751.751 0 0 1-1.042-.018.751.751 0 0 1-.018-1.042Zm-4.69 9.64a1.998 1.998 0 0 0 2.83 0l1.25-1.25a.751.751 0 0 1 1.042.018.751.751 0 0 1 .018 1.042l-1.25 1.25a3.5 3.5 0 1 1-4.95-4.95l2.5-2.5a3.5 3.5 0 0 1 4.95 0 .751.751 0 0 1-.018 1.042.751.751 0 0 1-1.042.018 1.998 1.998 0 0 0-2.83 0l-2.5 2.5a1.998 1.998 0 0 0 0 2.83Z"></path></svg></a></div> <p dir="auto">Intel Open Image Denoise is an open source library of high-performance, high-quality denoising filters for images rendered with ray tracing. Intel Open Image Denoise is part of the <a href="https://software.intel.com/en-us/oneapi/render-kit" rel="nofollow">Intel® Rendering Toolkit</a> and is released under the permissive <a href="http://www.apache.org/licenses/LICENSE-2.0" rel="nofollow">Apache 2.0 license</a>.</p> <p dir="auto">The purpose of Intel Open Image Denoise is to provide an open, high-quality, efficient, and easy-to-use denoising library that allows one to significantly reduce rendering times in ray tracing based rendering applications. It filters out the Monte Carlo noise inherent to stochastic ray tracing methods like path tracing, reducing the amount of necessary samples per pixel by even multiple orders of magnitude (depending on the desired closeness to the ground truth). A simple but flexible C/C++ API ensures that the library can be easily integrated into most existing or new rendering solutions.</p> <p dir="auto">At the heart of the Intel Open Image Denoise library is a collection of efficient deep learning based denoising filters, which were trained to handle a wide range of samples per pixel (spp), from 1 spp to almost fully converged. Thus it is suitable for both preview and final-frame rendering. The filters can denoise images either using only the noisy color (<em>beauty</em>) buffer, or, to preserve as much detail as possible, can optionally utilize auxiliary feature buffers as well (e.g. albedo, normal). Such buffers are supported by most renderers as arbitrary output variables (AOVs) or can be usually implemented with little effort.</p> <p dir="auto">Although the library ships with a set of pre-trained filter models, it is not mandatory to use these. To optimize a filter for a specific renderer, sample count, content type, scene, etc., it is possible to train the model using the included training toolkit and user-provided image datasets.</p> <p dir="auto">Intel Open Image Denoise supports a wide variety of CPUs and GPUs from different vendors:</p> <ul dir="auto"> <li> <p dir="auto">Intel® 64 architecture compatible CPUs (with at least SSE4.1)</p> </li> <li> <p dir="auto">ARM64 (AArch64) architecture CPUs (e.g. Apple silicon CPUs)</p> </li> <li> <p dir="auto">Intel Xe and Xe2 architecture dedicated and integrated GPUs, including Intel® Arc™ A-Series Graphics, Intel® Data Center GPU Flex Series, Intel® Data Center GPU Max Series, Intel® Iris® Xe Graphics, Intel® Core™ Ultra Processors with Intel® Arc™ Graphics, 11th-14th Gen Intel® Core™ processor graphics, and related Intel Pentium® and Celeron® processors (Xe-LP, Xe-LPG, Xe-LPG+, Xe-HPG, Xe-HPC, Xe2-LPG, and Xe2-HPG microarchitectures)</p> </li> <li> <p dir="auto">NVIDIA GPUs with Volta, Turing, Ampere, Ada Lovelace, and Hopper architectures</p> </li> <li> <p dir="auto">AMD GPUs with RDNA2 (Navi 21 only) and RDNA3 (Navi 3x) architectures</p> </li> <li> <p dir="auto">Apple silicon GPUs (M1 and newer)</p> </li> </ul> <p dir="auto">It runs on most machines ranging from laptops to workstations and compute nodes in HPC systems. It is efficient enough to be suitable not only for offline rendering, but, depending on the hardware used, also for interactive or even real-time ray tracing.</p> <p dir="auto">Intel Open Image Denoise exploits modern instruction sets like SSE4, AVX2, AVX-512, and NEON on CPUs, Intel® Xe Matrix Extensions (Intel® XMX) on Intel GPUs, and tensor cores on NVIDIA GPUs to achieve high denoising performance.</p> <div class="markdown-heading" dir="auto"><h2 tabindex="-1" class="heading-element" dir="auto">System Requirements</h2><a id="user-content-system-requirements" class="anchor" aria-label="Permalink: System Requirements" href="#system-requirements"><svg class="octicon octicon-link" viewBox="0 0 16 16" version="1.1" width="16" height="16" aria-hidden="true"><path d="m7.775 3.275 1.25-1.25a3.5 3.5 0 1 1 4.95 4.95l-2.5 2.5a3.5 3.5 0 0 1-4.95 0 .751.751 0 0 1 .018-1.042.751.751 0 0 1 1.042-.018 1.998 1.998 0 0 0 2.83 0l2.5-2.5a2.002 2.002 0 0 0-2.83-2.83l-1.25 1.25a.751.751 0 0 1-1.042-.018.751.751 0 0 1-.018-1.042Zm-4.69 9.64a1.998 1.998 0 0 0 2.83 0l1.25-1.25a.751.751 0 0 1 1.042.018.751.751 0 0 1 .018 1.042l-1.25 1.25a3.5 3.5 0 1 1-4.95-4.95l2.5-2.5a3.5 3.5 0 0 1 4.95 0 .751.751 0 0 1-.018 1.042.751.751 0 0 1-1.042.018 1.998 1.998 0 0 0-2.83 0l-2.5 2.5a1.998 1.998 0 0 0 0 2.83Z"></path></svg></a></div> <p dir="auto">You need an Intel® 64 (with SSE4.1) or ARM64 architecture compatible CPU to run Intel Open Image Denoise, and you need a 64-bit Windows, Linux, or macOS operating system as well.</p> <p dir="auto">For Intel GPU support, please also install the latest Intel graphics drivers:</p> <ul dir="auto"> <li> <p dir="auto">Windows: <a href="https://www.intel.com/content/www/us/en/download/726609/intel-arc-iris-xe-graphics-whql-windows.html" rel="nofollow">Intel® Graphics Driver</a> 31.0.101.4953 or newer</p> </li> <li> <p dir="auto">Linux: <a href="https://dgpu-docs.intel.com/driver/installation.html" rel="nofollow">Intel® software for General Purpose GPU capabilities</a> release <a href="https://dgpu-docs.intel.com/releases/stable_602_20230323.html" rel="nofollow">20230323</a> or newer</p> </li> </ul> <p dir="auto">Using older driver versions is <em>not</em> supported and Intel Open Image Denoise might run with only limited capabilities, have suboptimal performance or might be unstable. Also, Resizable BAR <em>must</em> be enabled in the BIOS for Intel dedicated GPUs if running on Linux, and strongly recommended if running on Windows.</p> <p dir="auto">For NVIDIA GPU support, please also install the latest <a href="https://www.nvidia.com/en-us/geforce/drivers/" rel="nofollow">NVIDIA graphics drivers</a>:</p> <ul dir="auto"> <li> <p dir="auto">Windows: Version 452.39 or newer</p> </li> <li> <p dir="auto">Linux: Version 450.80.02 or newer</p> </li> </ul> <p dir="auto">For AMD GPU support, please also install the latest <a href="https://www.amd.com/en/support" rel="nofollow">AMD graphics drivers</a>:</p> <ul dir="auto"> <li> <p dir="auto">Windows: AMD Software: Adrenalin Edition 24.10.1 or newer</p> </li> <li> <p dir="auto">Linux: <a href="https://www.amd.com/en/support/linux-drivers" rel="nofollow">Radeon Software for Linux</a> version 24.20.3 or newer</p> </li> </ul> <p dir="auto">For Apple GPU support, macOS Ventura or newer is required.</p> <div class="markdown-heading" dir="auto"><h2 tabindex="-1" class="heading-element" dir="auto">Support and Contact</h2><a id="user-content-support-and-contact" class="anchor" aria-label="Permalink: Support and Contact" href="#support-and-contact"><svg class="octicon octicon-link" viewBox="0 0 16 16" version="1.1" width="16" height="16" aria-hidden="true"><path d="m7.775 3.275 1.25-1.25a3.5 3.5 0 1 1 4.95 4.95l-2.5 2.5a3.5 3.5 0 0 1-4.95 0 .751.751 0 0 1 .018-1.042.751.751 0 0 1 1.042-.018 1.998 1.998 0 0 0 2.83 0l2.5-2.5a2.002 2.002 0 0 0-2.83-2.83l-1.25 1.25a.751.751 0 0 1-1.042-.018.751.751 0 0 1-.018-1.042Zm-4.69 9.64a1.998 1.998 0 0 0 2.83 0l1.25-1.25a.751.751 0 0 1 1.042.018.751.751 0 0 1 .018 1.042l-1.25 1.25a3.5 3.5 0 1 1-4.95-4.95l2.5-2.5a3.5 3.5 0 0 1 4.95 0 .751.751 0 0 1-.018 1.042.751.751 0 0 1-1.042.018 1.998 1.998 0 0 0-2.83 0l-2.5 2.5a1.998 1.998 0 0 0 0 2.83Z"></path></svg></a></div> <p dir="auto">Intel Open Image Denoise is under active development, and though we do our best to guarantee stable release versions a certain number of bugs, as-yet-missing features, inconsistencies, or any other issues are still possible. Should you find any such issues please report them immediately via the <a href="https://github.com/OpenImageDenoise/oidn/issues">Intel Open Image Denoise GitHub Issue Tracker</a> (or, if you should happen to have a fix for it, you can also send us a pull request); for missing features please contact us via email at <a href="mailto:openimagedenoise@googlegroups.com">openimagedenoise@googlegroups.com</a>.</p> <p dir="auto">Join our <a href="https://groups.google.com/d/forum/openimagedenoise/" rel="nofollow">mailing list</a> to receive release announcements and major news regarding Intel Open Image Denoise.</p> <div class="markdown-heading" dir="auto"><h2 tabindex="-1" class="heading-element" dir="auto">Citation</h2><a id="user-content-citation" class="anchor" aria-label="Permalink: Citation" href="#citation"><svg class="octicon octicon-link" viewBox="0 0 16 16" version="1.1" width="16" height="16" aria-hidden="true"><path d="m7.775 3.275 1.25-1.25a3.5 3.5 0 1 1 4.95 4.95l-2.5 2.5a3.5 3.5 0 0 1-4.95 0 .751.751 0 0 1 .018-1.042.751.751 0 0 1 1.042-.018 1.998 1.998 0 0 0 2.83 0l2.5-2.5a2.002 2.002 0 0 0-2.83-2.83l-1.25 1.25a.751.751 0 0 1-1.042-.018.751.751 0 0 1-.018-1.042Zm-4.69 9.64a1.998 1.998 0 0 0 2.83 0l1.25-1.25a.751.751 0 0 1 1.042.018.751.751 0 0 1 .018 1.042l-1.25 1.25a3.5 3.5 0 1 1-4.95-4.95l2.5-2.5a3.5 3.5 0 0 1 4.95 0 .751.751 0 0 1-.018 1.042.751.751 0 0 1-1.042.018 1.998 1.998 0 0 0-2.83 0l-2.5 2.5a1.998 1.998 0 0 0 0 2.83Z"></path></svg></a></div> <p dir="auto">If you use Intel Open Image Denoise in a research publication, please cite the project using the following BibTeX entry:</p> <div class="highlight highlight-text-bibtex notranslate position-relative overflow-auto" dir="auto" data-snippet-clipboard-copy-content="@misc{OpenImageDenoise, author = {Attila T. {\'A}fra}, title = {{Intel\textsuperscript{\textregistered} Open Image Denoise}}, year = {2024}, note = {\url{https://www.openimagedenoise.org}} }"><pre><span class="pl-k">@misc</span>{<span class="pl-en">OpenImageDenoise</span>, <span class="pl-s">author</span> = <span class="pl-s"><span class="pl-pds">{</span>Attila T. {\'A}fra<span class="pl-pds">}</span></span>, <span class="pl-s">title</span> = <span class="pl-s"><span class="pl-pds">{</span>{Intel\textsuperscript{\textregistered} Open Image Denoise}<span class="pl-pds">}</span></span>, <span class="pl-s">year</span> = <span class="pl-s"><span class="pl-pds">{</span>2024<span class="pl-pds">}</span></span>, <span class="pl-s">note</span> = <span class="pl-s"><span class="pl-pds">{</span>\url{https://www.openimagedenoise.org}<span class="pl-pds">}</span></span> }</pre></div> <div class="markdown-heading" dir="auto"><h1 tabindex="-1" class="heading-element" dir="auto">Compilation</h1><a id="user-content-compilation" class="anchor" aria-label="Permalink: Compilation" href="#compilation"><svg class="octicon octicon-link" viewBox="0 0 16 16" version="1.1" width="16" height="16" aria-hidden="true"><path d="m7.775 3.275 1.25-1.25a3.5 3.5 0 1 1 4.95 4.95l-2.5 2.5a3.5 3.5 0 0 1-4.95 0 .751.751 0 0 1 .018-1.042.751.751 0 0 1 1.042-.018 1.998 1.998 0 0 0 2.83 0l2.5-2.5a2.002 2.002 0 0 0-2.83-2.83l-1.25 1.25a.751.751 0 0 1-1.042-.018.751.751 0 0 1-.018-1.042Zm-4.69 9.64a1.998 1.998 0 0 0 2.83 0l1.25-1.25a.751.751 0 0 1 1.042.018.751.751 0 0 1 .018 1.042l-1.25 1.25a3.5 3.5 0 1 1-4.95-4.95l2.5-2.5a3.5 3.5 0 0 1 4.95 0 .751.751 0 0 1-.018 1.042.751.751 0 0 1-1.042.018 1.998 1.998 0 0 0-2.83 0l-2.5 2.5a1.998 1.998 0 0 0 0 2.83Z"></path></svg></a></div> <p dir="auto">The latest Intel Open Image Denoise sources are always available at the <a href="http://github.com/OpenImageDenoise/oidn">Intel Open Image Denoise GitHub repository</a>. The default <code>master</code> branch should always point to the latest tested bugfix release.</p> <div class="markdown-heading" dir="auto"><h2 tabindex="-1" class="heading-element" dir="auto">Prerequisites</h2><a id="user-content-prerequisites" class="anchor" aria-label="Permalink: Prerequisites" href="#prerequisites"><svg class="octicon octicon-link" viewBox="0 0 16 16" version="1.1" width="16" height="16" aria-hidden="true"><path d="m7.775 3.275 1.25-1.25a3.5 3.5 0 1 1 4.95 4.95l-2.5 2.5a3.5 3.5 0 0 1-4.95 0 .751.751 0 0 1 .018-1.042.751.751 0 0 1 1.042-.018 1.998 1.998 0 0 0 2.83 0l2.5-2.5a2.002 2.002 0 0 0-2.83-2.83l-1.25 1.25a.751.751 0 0 1-1.042-.018.751.751 0 0 1-.018-1.042Zm-4.69 9.64a1.998 1.998 0 0 0 2.83 0l1.25-1.25a.751.751 0 0 1 1.042.018.751.751 0 0 1 .018 1.042l-1.25 1.25a3.5 3.5 0 1 1-4.95-4.95l2.5-2.5a3.5 3.5 0 0 1 4.95 0 .751.751 0 0 1-.018 1.042.751.751 0 0 1-1.042.018 1.998 1.998 0 0 0-2.83 0l-2.5 2.5a1.998 1.998 0 0 0 0 2.83Z"></path></svg></a></div> <p dir="auto">You can clone the latest Intel Open Image Denoise sources using Git with the <a href="https://git-lfs.github.com/">Git Large File Storage (LFS)</a> extension installed:</p> <div class="snippet-clipboard-content notranslate position-relative overflow-auto" data-snippet-clipboard-copy-content="git clone --recursive https://github.com/OpenImageDenoise/oidn.git"><pre class="notranslate"><code>git clone --recursive https://github.com/OpenImageDenoise/oidn.git </code></pre></div> <p dir="auto">Please note that installing the Git LFS extension is <em>required</em> to correctly clone the repository. Cloning without Git LFS will seemingly succeed but actually some of the files will be invalid and thus compilation will fail.</p> <p dir="auto">Intel Open Image Denoise currently supports 64-bit Linux, Windows, and macOS operating systems. Before you can build Intel Open Image Denoise you need the following basic prerequisites:</p> <ul dir="auto"> <li> <p dir="auto"><a href="http://www.cmake.org" rel="nofollow">CMake</a> 3.15 or newer</p> </li> <li> <p dir="auto">A C++11 compiler (we recommend using a Clang-based compiler but also support GCC and Microsoft Visual Studio 2015 and newer)</p> </li> <li> <p dir="auto">Python 3</p> </li> </ul> <p dir="auto">To build support for different types of CPUs and GPUs, the following additional prerequisites are needed:</p> <div class="markdown-heading" dir="auto"><h4 tabindex="-1" class="heading-element" dir="auto">CPU device:</h4><a id="user-content-cpu-device" class="anchor" aria-label="Permalink: CPU device:" href="#cpu-device"><svg class="octicon octicon-link" viewBox="0 0 16 16" version="1.1" width="16" height="16" aria-hidden="true"><path d="m7.775 3.275 1.25-1.25a3.5 3.5 0 1 1 4.95 4.95l-2.5 2.5a3.5 3.5 0 0 1-4.95 0 .751.751 0 0 1 .018-1.042.751.751 0 0 1 1.042-.018 1.998 1.998 0 0 0 2.83 0l2.5-2.5a2.002 2.002 0 0 0-2.83-2.83l-1.25 1.25a.751.751 0 0 1-1.042-.018.751.751 0 0 1-.018-1.042Zm-4.69 9.64a1.998 1.998 0 0 0 2.83 0l1.25-1.25a.751.751 0 0 1 1.042.018.751.751 0 0 1 .018 1.042l-1.25 1.25a3.5 3.5 0 1 1-4.95-4.95l2.5-2.5a3.5 3.5 0 0 1 4.95 0 .751.751 0 0 1-.018 1.042.751.751 0 0 1-1.042.018 1.998 1.998 0 0 0-2.83 0l-2.5 2.5a1.998 1.998 0 0 0 0 2.83Z"></path></svg></a></div> <ul dir="auto"> <li> <p dir="auto"><a href="http://ispc.github.io" rel="nofollow">Intel® SPMD Program Compiler (ISPC)</a> 1.21.0 or newer. Please obtain a release of ISPC from the <a href="https://ispc.github.io/downloads.html" rel="nofollow">ISPC downloads page</a>. The build system looks for ISPC in the <code>PATH</code> and in the directory right “next to” the checked-out Intel Open Image Denoise sources. For example, if Intel Open Image Denoise is in <code>~/Projects/oidn</code>, ISPC will also be searched in <code>~/Projects/ispc-v1.21.0-linux</code>. Alternatively set the CMake variable <code>ISPC_EXECUTABLE</code> to the location of the ISPC compiler.</p> </li> <li> <p dir="auto"><a href="https://github.com/oneapi-src/oneTBB">Intel® Threading Building Blocks</a> (TBB) 2017 or newer</p> </li> </ul> <div class="markdown-heading" dir="auto"><h4 tabindex="-1" class="heading-element" dir="auto">SYCL device for Intel GPUs:</h4><a id="user-content-sycl-device-for-intel-gpus" class="anchor" aria-label="Permalink: SYCL device for Intel GPUs:" href="#sycl-device-for-intel-gpus"><svg class="octicon octicon-link" viewBox="0 0 16 16" version="1.1" width="16" height="16" aria-hidden="true"><path d="m7.775 3.275 1.25-1.25a3.5 3.5 0 1 1 4.95 4.95l-2.5 2.5a3.5 3.5 0 0 1-4.95 0 .751.751 0 0 1 .018-1.042.751.751 0 0 1 1.042-.018 1.998 1.998 0 0 0 2.83 0l2.5-2.5a2.002 2.002 0 0 0-2.83-2.83l-1.25 1.25a.751.751 0 0 1-1.042-.018.751.751 0 0 1-.018-1.042Zm-4.69 9.64a1.998 1.998 0 0 0 2.83 0l1.25-1.25a.751.751 0 0 1 1.042.018.751.751 0 0 1 .018 1.042l-1.25 1.25a3.5 3.5 0 1 1-4.95-4.95l2.5-2.5a3.5 3.5 0 0 1 4.95 0 .751.751 0 0 1-.018 1.042.751.751 0 0 1-1.042.018 1.998 1.998 0 0 0-2.83 0l-2.5 2.5a1.998 1.998 0 0 0 0 2.83Z"></path></svg></a></div> <ul dir="auto"> <li> <p dir="auto">oneAPI DPC++ Compiler, one of the following versions (other versions are <em>not</em> supported):</p> <ul dir="auto"> <li><a href="https://github.com/intel/llvm/releases/tag/nightly-2023-10-26">oneAPI DPC++ Compiler 2023-10-26</a>. This is the open source version of the compiler, which is more up-to-date but less stable, so we <em>strongly</em> recommend to use this exact version. On Linux we also recommend to rebuild it from source with the <code>--disable-fusion</code> flag to minimize the size of the SYCL runtime.</li> <li><a href="https://github.com/intel/llvm/releases/tag/2022-12">oneAPI DPC++ Compiler 2022-12</a>. <em>Must</em> be rebuilt from source.</li> <li><a href="https://www.intel.com/content/www/us/en/developer/tools/oneapi/dpc-compiler.html" rel="nofollow">Intel® oneAPI DPC++/C++ Compiler</a> 2024.1 or newer</li> </ul> </li> <li> <p dir="auto">Intel® Graphics Offline Compiler for OpenCL™ Code (OCLOC)</p> <ul dir="auto"> <li> <p dir="auto">Windows: Version <a href="https://registrationcenter-download.intel.com/akdlm/IRC_NAS/7000f8d2-dda8-4dd6-8b63-3917e4476fa5/intel-ocloc-2025.0.0.257_offline.exe" rel="nofollow">2025.0.0 / 32.0.101.6129</a> or newer as a <a href="https://www.intel.com/content/www/us/en/developer/articles/tool/oneapi-standalone-components.html" rel="nofollow">standalone component of Intel® oneAPI Toolkits</a>, which must be extracted and its contents added to the <code>PATH</code>. Also included with <a href="https://www.intel.com/content/www/us/en/developer/tools/oneapi/toolkits.html#base-kit" rel="nofollow">Intel® oneAPI Base Toolkit</a>.</p> </li> <li> <p dir="auto">Linux: Included with <a href="https://dgpu-docs.intel.com" rel="nofollow">Intel® software for General Purpose GPU capabilities</a> release <a href="https://dgpu-docs.intel.com/releases/rolling-release-notes.html#release-2024-10-31" rel="nofollow">2441.19</a> or newer (install at least <code>intel-opencl-icd</code> on Ubuntu, <code>intel-ocloc</code> on RHEL or SLES). Also available with <a href="https://github.com/intel/compute-runtime">Intel® Graphics Compute Runtime for oneAPI Level Zero and OpenCL™ Driver</a>.</p> </li> </ul> </li> <li> <p dir="auto">If using Intel® oneAPI DPC++/C++ Compiler: <a href="http://www.cmake.org" rel="nofollow">CMake</a> 3.25.2 or newer</p> </li> <li> <p dir="auto"><a href="https://ninja-build.org" rel="nofollow">Ninja</a> or Make as the CMake generator. The Visual Studio generator is <em>not</em> supported.</p> </li> </ul> <div class="markdown-heading" dir="auto"><h4 tabindex="-1" class="heading-element" dir="auto">CUDA device for NVIDIA GPUs:</h4><a id="user-content-cuda-device-for-nvidia-gpus" class="anchor" aria-label="Permalink: CUDA device for NVIDIA GPUs:" href="#cuda-device-for-nvidia-gpus"><svg class="octicon octicon-link" viewBox="0 0 16 16" version="1.1" width="16" height="16" aria-hidden="true"><path d="m7.775 3.275 1.25-1.25a3.5 3.5 0 1 1 4.95 4.95l-2.5 2.5a3.5 3.5 0 0 1-4.95 0 .751.751 0 0 1 .018-1.042.751.751 0 0 1 1.042-.018 1.998 1.998 0 0 0 2.83 0l2.5-2.5a2.002 2.002 0 0 0-2.83-2.83l-1.25 1.25a.751.751 0 0 1-1.042-.018.751.751 0 0 1-.018-1.042Zm-4.69 9.64a1.998 1.998 0 0 0 2.83 0l1.25-1.25a.751.751 0 0 1 1.042.018.751.751 0 0 1 .018 1.042l-1.25 1.25a3.5 3.5 0 1 1-4.95-4.95l2.5-2.5a3.5 3.5 0 0 1 4.95 0 .751.751 0 0 1-.018 1.042.751.751 0 0 1-1.042.018 1.998 1.998 0 0 0-2.83 0l-2.5 2.5a1.998 1.998 0 0 0 0 2.83Z"></path></svg></a></div> <ul dir="auto"> <li> <p dir="auto"><a href="http://www.cmake.org" rel="nofollow">CMake</a> 3.18 or newer</p> </li> <li> <p dir="auto"><a href="https://developer.nvidia.com/cuda-toolkit" rel="nofollow">NVIDIA CUDA Toolkit</a> 11.8 or newer</p> </li> </ul> <div class="markdown-heading" dir="auto"><h4 tabindex="-1" class="heading-element" dir="auto">HIP device for AMD GPUs:</h4><a id="user-content-hip-device-for-amd-gpus" class="anchor" aria-label="Permalink: HIP device for AMD GPUs:" href="#hip-device-for-amd-gpus"><svg class="octicon octicon-link" viewBox="0 0 16 16" version="1.1" width="16" height="16" aria-hidden="true"><path d="m7.775 3.275 1.25-1.25a3.5 3.5 0 1 1 4.95 4.95l-2.5 2.5a3.5 3.5 0 0 1-4.95 0 .751.751 0 0 1 .018-1.042.751.751 0 0 1 1.042-.018 1.998 1.998 0 0 0 2.83 0l2.5-2.5a2.002 2.002 0 0 0-2.83-2.83l-1.25 1.25a.751.751 0 0 1-1.042-.018.751.751 0 0 1-.018-1.042Zm-4.69 9.64a1.998 1.998 0 0 0 2.83 0l1.25-1.25a.751.751 0 0 1 1.042.018.751.751 0 0 1 .018 1.042l-1.25 1.25a3.5 3.5 0 1 1-4.95-4.95l2.5-2.5a3.5 3.5 0 0 1 4.95 0 .751.751 0 0 1-.018 1.042.751.751 0 0 1-1.042.018 1.998 1.998 0 0 0-2.83 0l-2.5 2.5a1.998 1.998 0 0 0 0 2.83Z"></path></svg></a></div> <ul dir="auto"> <li> <p dir="auto"><a href="http://www.cmake.org" rel="nofollow">CMake</a> 3.21 or newer</p> </li> <li> <p dir="auto"><a href="https://ninja-build.org" rel="nofollow">Ninja</a> or Make as the CMake generator. The Visual Studio generator is <em>not</em> supported.</p> </li> <li> <p dir="auto"><a href="https://rocm.docs.amd.com" rel="nofollow">AMD ROCm (HIP SDK)</a> v6.1.2 or newer.</p> </li> <li> <p dir="auto">Perl (e.g. <a href="https://strawberryperl.com" rel="nofollow">Strawberry Perl</a> on Windows)</p> </li> </ul> <div class="markdown-heading" dir="auto"><h4 tabindex="-1" class="heading-element" dir="auto">Metal device for Apple GPUs:</h4><a id="user-content-metal-device-for-apple-gpus" class="anchor" aria-label="Permalink: Metal device for Apple GPUs:" href="#metal-device-for-apple-gpus"><svg class="octicon octicon-link" viewBox="0 0 16 16" version="1.1" width="16" height="16" aria-hidden="true"><path d="m7.775 3.275 1.25-1.25a3.5 3.5 0 1 1 4.95 4.95l-2.5 2.5a3.5 3.5 0 0 1-4.95 0 .751.751 0 0 1 .018-1.042.751.751 0 0 1 1.042-.018 1.998 1.998 0 0 0 2.83 0l2.5-2.5a2.002 2.002 0 0 0-2.83-2.83l-1.25 1.25a.751.751 0 0 1-1.042-.018.751.751 0 0 1-.018-1.042Zm-4.69 9.64a1.998 1.998 0 0 0 2.83 0l1.25-1.25a.751.751 0 0 1 1.042.018.751.751 0 0 1 .018 1.042l-1.25 1.25a3.5 3.5 0 1 1-4.95-4.95l2.5-2.5a3.5 3.5 0 0 1 4.95 0 .751.751 0 0 1-.018 1.042.751.751 0 0 1-1.042.018 1.998 1.998 0 0 0-2.83 0l-2.5 2.5a1.998 1.998 0 0 0 0 2.83Z"></path></svg></a></div> <ul dir="auto"> <li> <p dir="auto"><a href="http://www.cmake.org" rel="nofollow">CMake</a> 3.21 or newer</p> </li> <li> <p dir="auto"><a href="https://developer.apple.com/xcode/" rel="nofollow">Xcode</a> 15.0 or newer</p> </li> </ul> <p dir="auto">Depending on your operating system, you can install some required dependencies (e.g., TBB) using <code>yum</code> or <code>apt-get</code> on Linux, <a href="https://brew.sh" rel="nofollow">Homebrew</a> or <a href="https://www.macports.org" rel="nofollow">MacPorts</a> on macOS, and <a href="https://vcpkg.io" rel="nofollow"><code>vcpkg</code></a> on Windows. For the other dependencies please download the necessary packages or installers and follow the included instructions.</p> <div class="markdown-heading" dir="auto"><h2 tabindex="-1" class="heading-element" dir="auto">Compiling on Linux/macOS</h2><a id="user-content-compiling-on-linuxmacos" class="anchor" aria-label="Permalink: Compiling on Linux/macOS" href="#compiling-on-linuxmacos"><svg class="octicon octicon-link" viewBox="0 0 16 16" version="1.1" width="16" height="16" aria-hidden="true"><path d="m7.775 3.275 1.25-1.25a3.5 3.5 0 1 1 4.95 4.95l-2.5 2.5a3.5 3.5 0 0 1-4.95 0 .751.751 0 0 1 .018-1.042.751.751 0 0 1 1.042-.018 1.998 1.998 0 0 0 2.83 0l2.5-2.5a2.002 2.002 0 0 0-2.83-2.83l-1.25 1.25a.751.751 0 0 1-1.042-.018.751.751 0 0 1-.018-1.042Zm-4.69 9.64a1.998 1.998 0 0 0 2.83 0l1.25-1.25a.751.751 0 0 1 1.042.018.751.751 0 0 1 .018 1.042l-1.25 1.25a3.5 3.5 0 1 1-4.95-4.95l2.5-2.5a3.5 3.5 0 0 1 4.95 0 .751.751 0 0 1-.018 1.042.751.751 0 0 1-1.042.018 1.998 1.998 0 0 0-2.83 0l-2.5 2.5a1.998 1.998 0 0 0 0 2.83Z"></path></svg></a></div> <p dir="auto">If you are building with SYCL support on Linux, make sure that the DPC++ compiler is properly set up. The open source oneAPI DPC++ Compiler can be downloaded and simply extracted. However, before using the compiler, the environment must be set up as well with the following command:</p> <div class="snippet-clipboard-content notranslate position-relative overflow-auto" data-snippet-clipboard-copy-content="source ./dpcpp_compiler/startup.sh"><pre class="notranslate"><code>source ./dpcpp_compiler/startup.sh </code></pre></div> <p dir="auto">The <code>startup.sh</code> script will put <code>clang</code> and <code>clang++</code> from the oneAPI DPC++ Compiler into your <code>PATH</code>.</p> <p dir="auto">Alternatively, if you have installed Intel® oneAPI DPC++/C++ Compiler instead, you can set up the compiler by sourcing the <code>vars.sh</code> script in the <code>env</code> directory of the compiler install directory, for example,</p> <div class="snippet-clipboard-content notranslate position-relative overflow-auto" data-snippet-clipboard-copy-content="source /opt/intel/oneAPI/compiler/latest/env/vars.sh"><pre class="notranslate"><code>source /opt/intel/oneAPI/compiler/latest/env/vars.sh </code></pre></div> <p dir="auto">This script will put the <code>icx</code> and <code>icpx</code> compiler executables from the Intel(R) oneAPI DPC++/C++ Compiler in your <code>PATH</code>.</p> <ul dir="auto"> <li> <p dir="auto">Create a build directory, and go into it using a command prompt</p> <div class="snippet-clipboard-content notranslate position-relative overflow-auto" data-snippet-clipboard-copy-content="mkdir oidn/build cd oidn/build"><pre class="notranslate"><code>mkdir oidn/build cd oidn/build </code></pre></div> <p dir="auto">(We do recommend having separate build directories for different configurations such as release, debug, etc.).</p> </li> <li> <p dir="auto">CMake will use the default compiler, which on most Linux machines is <code>gcc</code>, but it can be switched to <code>clang</code> by executing the following:</p> <div class="snippet-clipboard-content notranslate position-relative overflow-auto" data-snippet-clipboard-copy-content="cmake -G Ninja -DCMAKE_C_COMPILER=clang -DCMAKE_CXX_COMPILER=clang++ .."><pre class="notranslate"><code>cmake -G Ninja -DCMAKE_C_COMPILER=clang -DCMAKE_CXX_COMPILER=clang++ .. </code></pre></div> <p dir="auto">If you are building with SYCL support, you must set the DPC++ compiler (<code>clang</code>/<code>clang++</code> or <code>icx</code>/<code>icpx</code>) as the C/C++ compiler here. Note that the compiler variables cannot be changed after the first <code>cmake</code> or <code>ccmake</code> run.</p> </li> <li> <p dir="auto">Open the CMake configuration dialog</p> <div class="snippet-clipboard-content notranslate position-relative overflow-auto" data-snippet-clipboard-copy-content="ccmake .."><pre class="notranslate"><code>ccmake .. </code></pre></div> </li> <li> <p dir="auto">Make sure to properly set the build mode and enable the components and options you need. By default only CPU support is built, so SYCL and other device support must be enabled manually (e.g. with the <code>OIDN_DEVICE_SYCL</code> option). Then type ’c’onfigure and ’g’enerate. When back on the command prompt, build the library using</p> <div class="snippet-clipboard-content notranslate position-relative overflow-auto" data-snippet-clipboard-copy-content="ninja"><pre class="notranslate"><code>ninja </code></pre></div> </li> </ul> <div class="markdown-heading" dir="auto"><h2 tabindex="-1" class="heading-element" dir="auto">Compiling on Windows</h2><a id="user-content-compiling-on-windows" class="anchor" aria-label="Permalink: Compiling on Windows" href="#compiling-on-windows"><svg class="octicon octicon-link" viewBox="0 0 16 16" version="1.1" width="16" height="16" aria-hidden="true"><path d="m7.775 3.275 1.25-1.25a3.5 3.5 0 1 1 4.95 4.95l-2.5 2.5a3.5 3.5 0 0 1-4.95 0 .751.751 0 0 1 .018-1.042.751.751 0 0 1 1.042-.018 1.998 1.998 0 0 0 2.83 0l2.5-2.5a2.002 2.002 0 0 0-2.83-2.83l-1.25 1.25a.751.751 0 0 1-1.042-.018.751.751 0 0 1-.018-1.042Zm-4.69 9.64a1.998 1.998 0 0 0 2.83 0l1.25-1.25a.751.751 0 0 1 1.042.018.751.751 0 0 1 .018 1.042l-1.25 1.25a3.5 3.5 0 1 1-4.95-4.95l2.5-2.5a3.5 3.5 0 0 1 4.95 0 .751.751 0 0 1-.018 1.042.751.751 0 0 1-1.042.018 1.998 1.998 0 0 0-2.83 0l-2.5 2.5a1.998 1.998 0 0 0 0 2.83Z"></path></svg></a></div> <p dir="auto">If you are building with SYCL support, make sure that the DPC++ compiler is properly set up. The open source oneAPI DPC++ Compiler can be downloaded and simply extracted. However, before using the compiler, the environment must be set up. To achieve this, open the “x64 Native Tools Command Prompt for VS” that ships with Visual Studio and execute the following commands:</p> <div class="snippet-clipboard-content notranslate position-relative overflow-auto" data-snippet-clipboard-copy-content="set "DPCPP_DIR=path_to_dpcpp_compiler" set "PATH=%DPCPP_DIR%\bin;%PATH%" set "PATH=%DPCPP_DIR%\lib;%PATH%" set "CPATH=%DPCPP_DIR%\include;%CPATH%" set "INCLUDE=%DPCPP_DIR%\include;%INCLUDE%" set "LIB=%DPCPP_DIR%\lib;%LIB%""><pre class="notranslate"><code>set "DPCPP_DIR=path_to_dpcpp_compiler" set "PATH=%DPCPP_DIR%\bin;%PATH%" set "PATH=%DPCPP_DIR%\lib;%PATH%" set "CPATH=%DPCPP_DIR%\include;%CPATH%" set "INCLUDE=%DPCPP_DIR%\include;%INCLUDE%" set "LIB=%DPCPP_DIR%\lib;%LIB%" </code></pre></div> <p dir="auto">The <code>path_to_dpcpp_compiler</code> should point to the unpacked oneAPI DPC++ Compiler.</p> <p dir="auto">Alternatively, if you have installed Intel® oneAPI DPC++/C++ Compiler instead, you can either open a regular “Command Prompt” and execute the <code>vars.bat</code> script in the <code>env</code> directory of the compiler install directory, for example</p> <div class="snippet-clipboard-content notranslate position-relative overflow-auto" data-snippet-clipboard-copy-content="C:\Program Files (x86)\Intel\oneAPI\compiler\latest\env\vars.bat"><pre class="notranslate"><code>C:\Program Files (x86)\Intel\oneAPI\compiler\latest\env\vars.bat </code></pre></div> <p dir="auto">or simply open the installed “Intel oneAPI command prompt for Intel 64 for Visual Studio”. Either way, the <code>icx</code> compiler executable from the Intel® oneAPI DPC++/C++ Compiler will be added to your <code>PATH</code>.</p> <p dir="auto">On Windows we highly recommend to use Ninja as the CMake generator because not all devices can be built using the Visual Studio generator (e.g. SYCL).</p> <ul dir="auto"> <li> <p dir="auto">Create a build directory, and go into it using a Visual Studio command prompt</p> <div class="snippet-clipboard-content notranslate position-relative overflow-auto" data-snippet-clipboard-copy-content="mkdir oidn/build cd oidn/build"><pre class="notranslate"><code>mkdir oidn/build cd oidn/build </code></pre></div> <p dir="auto">(We do recommend having separate build directories for different configurations such as release, debug, etc.).</p> </li> <li> <p dir="auto">CMake will use the default compiler, which on most Windows machines is MSVC, but it can be switched to <code>clang</code> by executing the following:</p> <div class="snippet-clipboard-content notranslate position-relative overflow-auto" data-snippet-clipboard-copy-content="cmake -G Ninja -DCMAKE_C_COMPILER=clang -DCMAKE_CXX_COMPILER=clang++ .."><pre class="notranslate"><code>cmake -G Ninja -DCMAKE_C_COMPILER=clang -DCMAKE_CXX_COMPILER=clang++ .. </code></pre></div> <p dir="auto">If you are building with SYCL support, you must set the DPC++ compiler (<code>clang</code>/<code>clang++</code> or <code>icx</code>) as the C/C++ compiler here. Note that the compiler variables cannot be changed after the first <code>cmake</code> or <code>cmake-gui</code> run.</p> </li> <li> <p dir="auto">Open the CMake GUI (<code>cmake-gui.exe</code>)</p> <div class="snippet-clipboard-content notranslate position-relative overflow-auto" data-snippet-clipboard-copy-content="cmake-gui .."><pre class="notranslate"><code>cmake-gui .. </code></pre></div> </li> <li> <p dir="auto">Make sure to properly set the build mode and enable the components and options you need. By default only CPU support is built, so SYCL and other device support must be enabled manually (e.g. <code>OIDN_DEVICE_SYCL</code> option). Then click on Configure and Generate. When back on the command prompt, build the library using</p> <div class="snippet-clipboard-content notranslate position-relative overflow-auto" data-snippet-clipboard-copy-content="ninja"><pre class="notranslate"><code>ninja </code></pre></div> </li> </ul> <div class="markdown-heading" dir="auto"><h2 tabindex="-1" class="heading-element" dir="auto">CMake Configuration</h2><a id="user-content-cmake-configuration" class="anchor" aria-label="Permalink: CMake Configuration" href="#cmake-configuration"><svg class="octicon octicon-link" viewBox="0 0 16 16" version="1.1" width="16" height="16" aria-hidden="true"><path d="m7.775 3.275 1.25-1.25a3.5 3.5 0 1 1 4.95 4.95l-2.5 2.5a3.5 3.5 0 0 1-4.95 0 .751.751 0 0 1 .018-1.042.751.751 0 0 1 1.042-.018 1.998 1.998 0 0 0 2.83 0l2.5-2.5a2.002 2.002 0 0 0-2.83-2.83l-1.25 1.25a.751.751 0 0 1-1.042-.018.751.751 0 0 1-.018-1.042Zm-4.69 9.64a1.998 1.998 0 0 0 2.83 0l1.25-1.25a.751.751 0 0 1 1.042.018.751.751 0 0 1 .018 1.042l-1.25 1.25a3.5 3.5 0 1 1-4.95-4.95l2.5-2.5a3.5 3.5 0 0 1 4.95 0 .751.751 0 0 1-.018 1.042.751.751 0 0 1-1.042.018 1.998 1.998 0 0 0-2.83 0l-2.5 2.5a1.998 1.998 0 0 0 0 2.83Z"></path></svg></a></div> <p dir="auto">The following list describes the options that can be configured in CMake:</p> <ul dir="auto"> <li> <p dir="auto"><code>CMAKE_BUILD_TYPE</code>: Can be used to switch between Debug mode (Debug), Release mode (Release) (default), and Release mode with enabled assertions and debug symbols (RelWithDebInfo).</p> </li> <li> <p dir="auto"><code>OIDN_STATIC_LIB</code>: Build Open Image Denoise as a static (if only CPU support is enabled) or a hybrid static/shared (if GPU support is enabled as well) library.</p> </li> <li> <p dir="auto"><code>OIDN_LIBRARY_NAME</code>: Specifies the base name of the Open Image Denoise library files (<code>OpenImageDenoise</code> by default).</p> </li> <li> <p dir="auto"><code>OIDN_API_NAMESPACE</code>: Specifies a namespace to put all Open Image Denoise API symbols inside. This is also added as an outer namespace for the C++ wrapper API. By default no namespace is used and plain C symbols are exported.</p> </li> <li> <p dir="auto"><code>OIDN_DEVICE_CPU</code>: Enable CPU device support (ON by default).</p> </li> <li> <p dir="auto"><code>OIDN_DEVICE_SYCL</code>: Enable SYCL device support for Intel GPUs (OFF by default).</p> </li> <li> <p dir="auto"><code>OIDN_DEVICE_SYCL_AOT</code>: Enable ahead-of-time (AOT) compilation for SYCL kernels (ON by default). Turning this off removes dependency on OCLOC at build time and decreases binary size but significantly increases initialization time at runtime, so it is recommended only for development.</p> </li> <li> <p dir="auto"><code>OIDN_DEVICE_CUDA</code>: Enable CUDA device support for NVIDIA GPUs (OFF by default).</p> </li> <li> <p dir="auto"><code>OIDN_DEVICE_CUDA_API</code>: Use the CUDA driver API (<code>Driver</code>, default), the static CUDA runtime library (<code>RuntimeStatic</code>), or the shared CUDA runtime library (<code>RuntimeShared</code>).</p> </li> <li> <p dir="auto"><code>OIDN_DEVICE_HIP</code>: Enable HIP device support for AMD GPUs (OFF by default).</p> </li> <li> <p dir="auto"><code>OIDN_DEVICE_METAL</code>: Enable Metal device support for Apple GPUs (OFF by default).</p> </li> <li> <p dir="auto"><code>OIDN_FILTER_RT</code>: Include the trained weights of the <code>RT</code> filter in the build (ON by default). Turning this OFF significantly decreases the size of the library binary, while the filter remains functional if the weights are set by the user at runtime.</p> </li> <li> <p dir="auto"><code>OIDN_FILTER_RTLIGHTMAP</code>: Include the trained weights of the <code>RTLightmap</code> filter in the build (ON by default).</p> </li> <li> <p dir="auto"><code>OIDN_APPS</code>: Enable building example and test applications (ON by default).</p> </li> <li> <p dir="auto"><code>OIDN_APPS_OPENIMAGEIO</code>: Enable <a href="http://openimageio.org/" rel="nofollow">OpenImageIO</a> support in the example and test applications to be able to load/save OpenEXR, PNG, and other image file formats (OFF by default).</p> </li> <li> <p dir="auto"><code>OIDN_INSTALL_DEPENDENCIES</code>: Enable installing the dependencies (e.g. TBB, SYCL runtime) as well.</p> </li> <li> <p dir="auto"><code>TBB_ROOT</code>: The path to the TBB installation (autodetected by default).</p> </li> <li> <p dir="auto"><code>ROCM_PATH</code>: The path to the ROCm installation (autodetected by default).</p> </li> <li> <p dir="auto"><code>OpenImageIO_ROOT</code>: The path to the OpenImageIO installation (autodetected by default).</p> </li> </ul> <div class="markdown-heading" dir="auto"><h1 tabindex="-1" class="heading-element" dir="auto">Documentation</h1><a id="user-content-documentation" class="anchor" aria-label="Permalink: Documentation" href="#documentation"><svg class="octicon octicon-link" viewBox="0 0 16 16" version="1.1" width="16" height="16" aria-hidden="true"><path d="m7.775 3.275 1.25-1.25a3.5 3.5 0 1 1 4.95 4.95l-2.5 2.5a3.5 3.5 0 0 1-4.95 0 .751.751 0 0 1 .018-1.042.751.751 0 0 1 1.042-.018 1.998 1.998 0 0 0 2.83 0l2.5-2.5a2.002 2.002 0 0 0-2.83-2.83l-1.25 1.25a.751.751 0 0 1-1.042-.018.751.751 0 0 1-.018-1.042Zm-4.69 9.64a1.998 1.998 0 0 0 2.83 0l1.25-1.25a.751.751 0 0 1 1.042.018.751.751 0 0 1 .018 1.042l-1.25 1.25a3.5 3.5 0 1 1-4.95-4.95l2.5-2.5a3.5 3.5 0 0 1 4.95 0 .751.751 0 0 1-.018 1.042.751.751 0 0 1-1.042.018 1.998 1.998 0 0 0-2.83 0l-2.5 2.5a1.998 1.998 0 0 0 0 2.83Z"></path></svg></a></div> <p dir="auto">The following <a href="https://github.com/OpenImageDenoise/oidn/blob/master/readme.pdf" title="Intel Open Image Denoise Documentation">documentation</a> of Intel Open Image Denoise can also be found as a <a href="https://github.com/OpenImageDenoise/oidn/blob/master/readme.pdf" title="Intel Open Image Denoise Documentation">pdf document</a>.</p> <div class="markdown-heading" dir="auto"><h1 tabindex="-1" class="heading-element" dir="auto">Open Image Denoise API</h1><a id="user-content-open-image-denoise-api" class="anchor" aria-label="Permalink: Open Image Denoise API" href="#open-image-denoise-api"><svg class="octicon octicon-link" viewBox="0 0 16 16" version="1.1" width="16" height="16" aria-hidden="true"><path d="m7.775 3.275 1.25-1.25a3.5 3.5 0 1 1 4.95 4.95l-2.5 2.5a3.5 3.5 0 0 1-4.95 0 .751.751 0 0 1 .018-1.042.751.751 0 0 1 1.042-.018 1.998 1.998 0 0 0 2.83 0l2.5-2.5a2.002 2.002 0 0 0-2.83-2.83l-1.25 1.25a.751.751 0 0 1-1.042-.018.751.751 0 0 1-.018-1.042Zm-4.69 9.64a1.998 1.998 0 0 0 2.83 0l1.25-1.25a.751.751 0 0 1 1.042.018.751.751 0 0 1 .018 1.042l-1.25 1.25a3.5 3.5 0 1 1-4.95-4.95l2.5-2.5a3.5 3.5 0 0 1 4.95 0 .751.751 0 0 1-.018 1.042.751.751 0 0 1-1.042.018 1.998 1.998 0 0 0-2.83 0l-2.5 2.5a1.998 1.998 0 0 0 0 2.83Z"></path></svg></a></div> <p dir="auto">Open Image Denoise provides a C99 API (also compatible with C++) and a C++11 wrapper API as well. For simplicity, this document mostly refers to the C99 version of the API.</p> <p dir="auto">The API is designed in an object-oriented manner, e.g. it contains device objects (<code>OIDNDevice</code> type), buffer objects (<code>OIDNBuffer</code> type), and filter objects (<code>OIDNFilter</code> type). All objects are reference-counted, and handles can be released by calling the appropriate release function (e.g. <code>oidnReleaseDevice</code>) or retained by incrementing the reference count (e.g. <code>oidnRetainDevice</code>).</p> <p dir="auto">An important aspect of objects is that setting their parameters do not have an immediate effect (with a few exceptions). Instead, objects with updated parameters are in an unusable state until the parameters get explicitly committed to a given object. The commit semantic allows for batching up multiple small changes, and specifies exactly when changes to objects will occur.</p> <p dir="auto">All API calls are thread-safe, but operations that use the same device will be serialized, so the amount of API calls from different threads should be minimized.</p> <div class="markdown-heading" dir="auto"><h2 tabindex="-1" class="heading-element" dir="auto">Examples</h2><a id="user-content-examples" class="anchor" aria-label="Permalink: Examples" href="#examples"><svg class="octicon octicon-link" viewBox="0 0 16 16" version="1.1" width="16" height="16" aria-hidden="true"><path d="m7.775 3.275 1.25-1.25a3.5 3.5 0 1 1 4.95 4.95l-2.5 2.5a3.5 3.5 0 0 1-4.95 0 .751.751 0 0 1 .018-1.042.751.751 0 0 1 1.042-.018 1.998 1.998 0 0 0 2.83 0l2.5-2.5a2.002 2.002 0 0 0-2.83-2.83l-1.25 1.25a.751.751 0 0 1-1.042-.018.751.751 0 0 1-.018-1.042Zm-4.69 9.64a1.998 1.998 0 0 0 2.83 0l1.25-1.25a.751.751 0 0 1 1.042.018.751.751 0 0 1 .018 1.042l-1.25 1.25a3.5 3.5 0 1 1-4.95-4.95l2.5-2.5a3.5 3.5 0 0 1 4.95 0 .751.751 0 0 1-.018 1.042.751.751 0 0 1-1.042.018 1.998 1.998 0 0 0-2.83 0l-2.5 2.5a1.998 1.998 0 0 0 0 2.83Z"></path></svg></a></div> <p dir="auto">To have a quick overview of the C99 and C++11 APIs, see the following simple example code snippets.</p> <div class="markdown-heading" dir="auto"><h3 tabindex="-1" class="heading-element" dir="auto">Basic Denoising (C99 API)</h3><a id="user-content-basic-denoising-c99-api" class="anchor" aria-label="Permalink: Basic Denoising (C99 API)" href="#basic-denoising-c99-api"><svg class="octicon octicon-link" viewBox="0 0 16 16" version="1.1" width="16" height="16" aria-hidden="true"><path d="m7.775 3.275 1.25-1.25a3.5 3.5 0 1 1 4.95 4.95l-2.5 2.5a3.5 3.5 0 0 1-4.95 0 .751.751 0 0 1 .018-1.042.751.751 0 0 1 1.042-.018 1.998 1.998 0 0 0 2.83 0l2.5-2.5a2.002 2.002 0 0 0-2.83-2.83l-1.25 1.25a.751.751 0 0 1-1.042-.018.751.751 0 0 1-.018-1.042Zm-4.69 9.64a1.998 1.998 0 0 0 2.83 0l1.25-1.25a.751.751 0 0 1 1.042.018.751.751 0 0 1 .018 1.042l-1.25 1.25a3.5 3.5 0 1 1-4.95-4.95l2.5-2.5a3.5 3.5 0 0 1 4.95 0 .751.751 0 0 1-.018 1.042.751.751 0 0 1-1.042.018 1.998 1.998 0 0 0-2.83 0l-2.5 2.5a1.998 1.998 0 0 0 0 2.83Z"></path></svg></a></div> <div class="highlight highlight-source-c++ notranslate position-relative overflow-auto" dir="auto" data-snippet-clipboard-copy-content="#include <OpenImageDenoise/oidn.h> ... // Create an Open Image Denoise device OIDNDevice device = oidnNewDevice(OIDN_DEVICE_TYPE_DEFAULT); // CPU or GPU if available // OIDNDevice device = oidnNewDevice(OIDN_DEVICE_TYPE_CPU); oidnCommitDevice(device); // Create buffers for input/output images accessible by both host (CPU) and device (CPU/GPU) OIDNBuffer colorBuf = oidnNewBuffer(device, width * height * 3 * sizeof(float)); OIDNBuffer albedoBuf = ... // Create a filter for denoising a beauty (color) image using optional auxiliary images too // This can be an expensive operation, so try not to create a new filter for every image! OIDNFilter filter = oidnNewFilter(device, "RT"); // generic ray tracing filter oidnSetFilterImage(filter, "color", colorBuf, OIDN_FORMAT_FLOAT3, width, height, 0, 0, 0); // beauty oidnSetFilterImage(filter, "albedo", albedoBuf, OIDN_FORMAT_FLOAT3, width, height, 0, 0, 0); // auxiliary oidnSetFilterImage(filter, "normal", normalBuf, OIDN_FORMAT_FLOAT3, width, height, 0, 0, 0); // auxiliary oidnSetFilterImage(filter, "output", colorBuf, OIDN_FORMAT_FLOAT3, width, height, 0, 0, 0); // denoised beauty oidnSetFilterBool(filter, "hdr", true); // beauty image is HDR oidnCommitFilter(filter); // Fill the input image buffers float* colorPtr = (float*)oidnGetBufferData(colorBuf); ... // Filter the beauty image oidnExecuteFilter(filter); // Check for errors const char* errorMessage; if (oidnGetDeviceError(device, &errorMessage) != OIDN_ERROR_NONE) printf("Error: %s\n", errorMessage); // Cleanup oidnReleaseBuffer(colorBuf); ... oidnReleaseFilter(filter); oidnReleaseDevice(device);"><pre>#<span class="pl-k">include</span> <span class="pl-s"><span class="pl-pds"><</span>OpenImageDenoise/oidn.h<span class="pl-pds">></span></span> ... <span class="pl-c"><span class="pl-c">//</span> Create an Open Image Denoise device</span> OIDNDevice device = oidnNewDevice(OIDN_DEVICE_TYPE_DEFAULT); <span class="pl-c"><span class="pl-c">//</span> CPU or GPU if available</span> <span class="pl-c"><span class="pl-c">//</span> OIDNDevice device = oidnNewDevice(OIDN_DEVICE_TYPE_CPU);</span> <span class="pl-en">oidnCommitDevice</span>(device); <span class="pl-c"><span class="pl-c">//</span> Create buffers for input/output images accessible by both host (CPU) and device (CPU/GPU)</span> OIDNBuffer colorBuf = oidnNewBuffer(device, width * height * <span class="pl-c1">3</span> * <span class="pl-k">sizeof</span>(<span class="pl-k">float</span>)); OIDNBuffer albedoBuf = ... <span class="pl-c"><span class="pl-c">//</span> Create a filter for denoising a beauty (color) image using optional auxiliary images too</span> <span class="pl-c"><span class="pl-c">//</span> This can be an expensive operation, so try not to create a new filter for every image!</span> OIDNFilter filter = oidnNewFilter(device, <span class="pl-s"><span class="pl-pds">"</span>RT<span class="pl-pds">"</span></span>); <span class="pl-c"><span class="pl-c">//</span> generic ray tracing filter</span> <span class="pl-en">oidnSetFilterImage</span>(filter, <span class="pl-s"><span class="pl-pds">"</span>color<span class="pl-pds">"</span></span>, colorBuf, OIDN_FORMAT_FLOAT3, width, height, <span class="pl-c1">0</span>, <span class="pl-c1">0</span>, <span class="pl-c1">0</span>); <span class="pl-c"><span class="pl-c">//</span> beauty</span> <span class="pl-en">oidnSetFilterImage</span>(filter, <span class="pl-s"><span class="pl-pds">"</span>albedo<span class="pl-pds">"</span></span>, albedoBuf, OIDN_FORMAT_FLOAT3, width, height, <span class="pl-c1">0</span>, <span class="pl-c1">0</span>, <span class="pl-c1">0</span>); <span class="pl-c"><span class="pl-c">//</span> auxiliary</span> <span class="pl-en">oidnSetFilterImage</span>(filter, <span class="pl-s"><span class="pl-pds">"</span>normal<span class="pl-pds">"</span></span>, normalBuf, OIDN_FORMAT_FLOAT3, width, height, <span class="pl-c1">0</span>, <span class="pl-c1">0</span>, <span class="pl-c1">0</span>); <span class="pl-c"><span class="pl-c">//</span> auxiliary</span> <span class="pl-en">oidnSetFilterImage</span>(filter, <span class="pl-s"><span class="pl-pds">"</span>output<span class="pl-pds">"</span></span>, colorBuf, OIDN_FORMAT_FLOAT3, width, height, <span class="pl-c1">0</span>, <span class="pl-c1">0</span>, <span class="pl-c1">0</span>); <span class="pl-c"><span class="pl-c">//</span> denoised beauty</span> <span class="pl-en">oidnSetFilterBool</span>(filter, <span class="pl-s"><span class="pl-pds">"</span>hdr<span class="pl-pds">"</span></span>, <span class="pl-c1">true</span>); <span class="pl-c"><span class="pl-c">//</span> beauty image is HDR</span> <span class="pl-en">oidnCommitFilter</span>(filter); <span class="pl-c"><span class="pl-c">//</span> Fill the input image buffers</span> <span class="pl-k">float</span>* colorPtr = (<span class="pl-k">float</span>*)oidnGetBufferData(colorBuf); ... <span class="pl-c"><span class="pl-c">//</span> Filter the beauty image</span> <span class="pl-en">oidnExecuteFilter</span>(filter); <span class="pl-c"><span class="pl-c">//</span> Check for errors</span> <span class="pl-k">const</span> <span class="pl-k">char</span>* errorMessage; <span class="pl-k">if</span> (oidnGetDeviceError(device, &errorMessage) != OIDN_ERROR_NONE) <span class="pl-en">printf</span>(<span class="pl-s"><span class="pl-pds">"</span>Error: %s<span class="pl-cce">\n</span><span class="pl-pds">"</span></span>, errorMessage); <span class="pl-c"><span class="pl-c">//</span> Cleanup</span> <span class="pl-en">oidnReleaseBuffer</span>(colorBuf); ... <span class="pl-en">oidnReleaseFilter</span>(filter); <span class="pl-en">oidnReleaseDevice</span>(device);</pre></div> <div class="markdown-heading" dir="auto"><h3 tabindex="-1" class="heading-element" dir="auto">Basic Denoising (C++11 API)</h3><a id="user-content-basic-denoising-c11-api" class="anchor" aria-label="Permalink: Basic Denoising (C++11 API)" href="#basic-denoising-c11-api"><svg class="octicon octicon-link" viewBox="0 0 16 16" version="1.1" width="16" height="16" aria-hidden="true"><path d="m7.775 3.275 1.25-1.25a3.5 3.5 0 1 1 4.95 4.95l-2.5 2.5a3.5 3.5 0 0 1-4.95 0 .751.751 0 0 1 .018-1.042.751.751 0 0 1 1.042-.018 1.998 1.998 0 0 0 2.83 0l2.5-2.5a2.002 2.002 0 0 0-2.83-2.83l-1.25 1.25a.751.751 0 0 1-1.042-.018.751.751 0 0 1-.018-1.042Zm-4.69 9.64a1.998 1.998 0 0 0 2.83 0l1.25-1.25a.751.751 0 0 1 1.042.018.751.751 0 0 1 .018 1.042l-1.25 1.25a3.5 3.5 0 1 1-4.95-4.95l2.5-2.5a3.5 3.5 0 0 1 4.95 0 .751.751 0 0 1-.018 1.042.751.751 0 0 1-1.042.018 1.998 1.998 0 0 0-2.83 0l-2.5 2.5a1.998 1.998 0 0 0 0 2.83Z"></path></svg></a></div> <div class="highlight highlight-source-c++ notranslate position-relative overflow-auto" dir="auto" data-snippet-clipboard-copy-content="#include <OpenImageDenoise/oidn.hpp> ... // Create an Open Image Denoise device oidn::DeviceRef device = oidn::newDevice(); // CPU or GPU if available // oidn::DeviceRef device = oidn::newDevice(oidn::DeviceType::CPU); device.commit(); // Create buffers for input/output images accessible by both host (CPU) and device (CPU/GPU) oidn::BufferRef colorBuf = device.newBuffer(width * height * 3 * sizeof(float)); oidn::BufferRef albedoBuf = ... // Create a filter for denoising a beauty (color) image using optional auxiliary images too // This can be an expensive operation, so try no to create a new filter for every image! oidn::FilterRef filter = device.newFilter("RT"); // generic ray tracing filter filter.setImage("color", colorBuf, oidn::Format::Float3, width, height); // beauty filter.setImage("albedo", albedoBuf, oidn::Format::Float3, width, height); // auxiliary filter.setImage("normal", normalBuf, oidn::Format::Float3, width, height); // auxiliary filter.setImage("output", colorBuf, oidn::Format::Float3, width, height); // denoised beauty filter.set("hdr", true); // beauty image is HDR filter.commit(); // Fill the input image buffers float* colorPtr = (float*)colorBuf.getData(); ... // Filter the beauty image filter.execute(); // Check for errors const char* errorMessage; if (device.getError(errorMessage) != oidn::Error::None) std::cout << "Error: " << errorMessage << std::endl;"><pre>#<span class="pl-k">include</span> <span class="pl-s"><span class="pl-pds"><</span>OpenImageDenoise/oidn.hpp<span class="pl-pds">></span></span> ... <span class="pl-c"><span class="pl-c">//</span> Create an Open Image Denoise device</span> oidn::DeviceRef device = oidn::newDevice(); <span class="pl-c"><span class="pl-c">//</span> CPU or GPU if available</span> <span class="pl-c"><span class="pl-c">//</span> oidn::DeviceRef device = oidn::newDevice(oidn::DeviceType::CPU);</span> device.commit(); <span class="pl-c"><span class="pl-c">//</span> Create buffers for input/output images accessible by both host (CPU) and device (CPU/GPU)</span> oidn::BufferRef colorBuf = device.newBuffer(width * height * <span class="pl-c1">3</span> * <span class="pl-k">sizeof</span>(<span class="pl-k">float</span>)); oidn::BufferRef albedoBuf = ... <span class="pl-c"><span class="pl-c">//</span> Create a filter for denoising a beauty (color) image using optional auxiliary images too</span> <span class="pl-c"><span class="pl-c">//</span> This can be an expensive operation, so try no to create a new filter for every image!</span> oidn::FilterRef filter = device.newFilter(<span class="pl-s"><span class="pl-pds">"</span>RT<span class="pl-pds">"</span></span>); <span class="pl-c"><span class="pl-c">//</span> generic ray tracing filter</span> filter.setImage(<span class="pl-s"><span class="pl-pds">"</span>color<span class="pl-pds">"</span></span>, colorBuf, oidn::Format::Float3, width, height); <span class="pl-c"><span class="pl-c">//</span> beauty</span> filter.setImage(<span class="pl-s"><span class="pl-pds">"</span>albedo<span class="pl-pds">"</span></span>, albedoBuf, oidn::Format::Float3, width, height); <span class="pl-c"><span class="pl-c">//</span> auxiliary</span> filter.setImage(<span class="pl-s"><span class="pl-pds">"</span>normal<span class="pl-pds">"</span></span>, normalBuf, oidn::Format::Float3, width, height); <span class="pl-c"><span class="pl-c">//</span> auxiliary</span> filter.setImage(<span class="pl-s"><span class="pl-pds">"</span>output<span class="pl-pds">"</span></span>, colorBuf, oidn::Format::Float3, width, height); <span class="pl-c"><span class="pl-c">//</span> denoised beauty</span> filter.set(<span class="pl-s"><span class="pl-pds">"</span>hdr<span class="pl-pds">"</span></span>, <span class="pl-c1">true</span>); <span class="pl-c"><span class="pl-c">//</span> beauty image is HDR</span> filter.commit(); <span class="pl-c"><span class="pl-c">//</span> Fill the input image buffers</span> <span class="pl-k">float</span>* colorPtr = (<span class="pl-k">float</span>*)colorBuf.getData(); ... <span class="pl-c"><span class="pl-c">//</span> Filter the beauty image</span> filter.execute(); <span class="pl-c"><span class="pl-c">//</span> Check for errors</span> <span class="pl-k">const</span> <span class="pl-k">char</span>* errorMessage; <span class="pl-k">if</span> (device.getError(errorMessage) != oidn::Error::None) std::cout << <span class="pl-s"><span class="pl-pds">"</span>Error: <span class="pl-pds">"</span></span> << errorMessage << std::endl;</pre></div> <div class="markdown-heading" dir="auto"><h3 tabindex="-1" class="heading-element" dir="auto">Denoising with Prefiltering (C++11 API)</h3><a id="user-content-denoising-with-prefiltering-c11-api" class="anchor" aria-label="Permalink: Denoising with Prefiltering (C++11 API)" href="#denoising-with-prefiltering-c11-api"><svg class="octicon octicon-link" viewBox="0 0 16 16" version="1.1" width="16" height="16" aria-hidden="true"><path d="m7.775 3.275 1.25-1.25a3.5 3.5 0 1 1 4.95 4.95l-2.5 2.5a3.5 3.5 0 0 1-4.95 0 .751.751 0 0 1 .018-1.042.751.751 0 0 1 1.042-.018 1.998 1.998 0 0 0 2.83 0l2.5-2.5a2.002 2.002 0 0 0-2.83-2.83l-1.25 1.25a.751.751 0 0 1-1.042-.018.751.751 0 0 1-.018-1.042Zm-4.69 9.64a1.998 1.998 0 0 0 2.83 0l1.25-1.25a.751.751 0 0 1 1.042.018.751.751 0 0 1 .018 1.042l-1.25 1.25a3.5 3.5 0 1 1-4.95-4.95l2.5-2.5a3.5 3.5 0 0 1 4.95 0 .751.751 0 0 1-.018 1.042.751.751 0 0 1-1.042.018 1.998 1.998 0 0 0-2.83 0l-2.5 2.5a1.998 1.998 0 0 0 0 2.83Z"></path></svg></a></div> <div class="highlight highlight-source-c++ notranslate position-relative overflow-auto" dir="auto" data-snippet-clipboard-copy-content="// Create a filter for denoising a beauty (color) image using prefiltered auxiliary images too oidn::FilterRef filter = device.newFilter("RT"); // generic ray tracing filter filter.setImage("color", colorBuf, oidn::Format::Float3, width, height); // beauty filter.setImage("albedo", albedoBuf, oidn::Format::Float3, width, height); // auxiliary filter.setImage("normal", normalBuf, oidn::Format::Float3, width, height); // auxiliary filter.setImage("output", outputBuf, oidn::Format::Float3, width, height); // denoised beauty filter.set("hdr", true); // beauty image is HDR filter.set("cleanAux", true); // auxiliary images will be prefiltered filter.commit(); // Create a separate filter for denoising an auxiliary albedo image (in-place) oidn::FilterRef albedoFilter = device.newFilter("RT"); // same filter type as for beauty albedoFilter.setImage("albedo", albedoBuf, oidn::Format::Float3, width, height); albedoFilter.setImage("output", albedoBuf, oidn::Format::Float3, width, height); albedoFilter.commit(); // Create a separate filter for denoising an auxiliary normal image (in-place) oidn::FilterRef normalFilter = device.newFilter("RT"); // same filter type as for beauty normalFilter.setImage("normal", normalBuf, oidn::Format::Float3, width, height); normalFilter.setImage("output", normalBuf, oidn::Format::Float3, width, height); normalFilter.commit(); // Prefilter the auxiliary images albedoFilter.execute(); normalFilter.execute(); // Filter the beauty image filter.execute();"><pre><span class="pl-c"><span class="pl-c">//</span> Create a filter for denoising a beauty (color) image using prefiltered auxiliary images too</span> oidn::FilterRef filter = device.newFilter(<span class="pl-s"><span class="pl-pds">"</span>RT<span class="pl-pds">"</span></span>); <span class="pl-c"><span class="pl-c">//</span> generic ray tracing filter</span> filter.setImage(<span class="pl-s"><span class="pl-pds">"</span>color<span class="pl-pds">"</span></span>, colorBuf, oidn::Format::Float3, width, height); <span class="pl-c"><span class="pl-c">//</span> beauty</span> filter.setImage(<span class="pl-s"><span class="pl-pds">"</span>albedo<span class="pl-pds">"</span></span>, albedoBuf, oidn::Format::Float3, width, height); <span class="pl-c"><span class="pl-c">//</span> auxiliary</span> filter.setImage(<span class="pl-s"><span class="pl-pds">"</span>normal<span class="pl-pds">"</span></span>, normalBuf, oidn::Format::Float3, width, height); <span class="pl-c"><span class="pl-c">//</span> auxiliary</span> filter.setImage(<span class="pl-s"><span class="pl-pds">"</span>output<span class="pl-pds">"</span></span>, outputBuf, oidn::Format::Float3, width, height); <span class="pl-c"><span class="pl-c">//</span> denoised beauty</span> filter.set(<span class="pl-s"><span class="pl-pds">"</span>hdr<span class="pl-pds">"</span></span>, <span class="pl-c1">true</span>); <span class="pl-c"><span class="pl-c">//</span> beauty image is HDR</span> filter.set(<span class="pl-s"><span class="pl-pds">"</span>cleanAux<span class="pl-pds">"</span></span>, <span class="pl-c1">true</span>); <span class="pl-c"><span class="pl-c">//</span> auxiliary images will be prefiltered</span> filter.commit(); <span class="pl-c"><span class="pl-c">//</span> Create a separate filter for denoising an auxiliary albedo image (in-place)</span> oidn::FilterRef albedoFilter = device.newFilter(<span class="pl-s"><span class="pl-pds">"</span>RT<span class="pl-pds">"</span></span>); <span class="pl-c"><span class="pl-c">//</span> same filter type as for beauty</span> albedoFilter.setImage(<span class="pl-s"><span class="pl-pds">"</span>albedo<span class="pl-pds">"</span></span>, albedoBuf, oidn::Format::Float3, width, height); albedoFilter.setImage(<span class="pl-s"><span class="pl-pds">"</span>output<span class="pl-pds">"</span></span>, albedoBuf, oidn::Format::Float3, width, height); albedoFilter.commit(); <span class="pl-c"><span class="pl-c">//</span> Create a separate filter for denoising an auxiliary normal image (in-place)</span> oidn::FilterRef normalFilter = device.newFilter(<span class="pl-s"><span class="pl-pds">"</span>RT<span class="pl-pds">"</span></span>); <span class="pl-c"><span class="pl-c">//</span> same filter type as for beauty</span> normalFilter.setImage(<span class="pl-s"><span class="pl-pds">"</span>normal<span class="pl-pds">"</span></span>, normalBuf, oidn::Format::Float3, width, height); normalFilter.setImage(<span class="pl-s"><span class="pl-pds">"</span>output<span class="pl-pds">"</span></span>, normalBuf, oidn::Format::Float3, width, height); normalFilter.commit(); <span class="pl-c"><span class="pl-c">//</span> Prefilter the auxiliary images</span> albedoFilter.execute(); normalFilter.execute(); <span class="pl-c"><span class="pl-c">//</span> Filter the beauty image</span> filter.execute();</pre></div> <div class="markdown-heading" dir="auto"><h2 tabindex="-1" class="heading-element" dir="auto">Upgrading from Open Image Denoise 1.x</h2><a id="user-content-upgrading-from-open-image-denoise-1x" class="anchor" aria-label="Permalink: Upgrading from Open Image Denoise 1.x" href="#upgrading-from-open-image-denoise-1x"><svg class="octicon octicon-link" viewBox="0 0 16 16" version="1.1" width="16" height="16" aria-hidden="true"><path d="m7.775 3.275 1.25-1.25a3.5 3.5 0 1 1 4.95 4.95l-2.5 2.5a3.5 3.5 0 0 1-4.95 0 .751.751 0 0 1 .018-1.042.751.751 0 0 1 1.042-.018 1.998 1.998 0 0 0 2.83 0l2.5-2.5a2.002 2.002 0 0 0-2.83-2.83l-1.25 1.25a.751.751 0 0 1-1.042-.018.751.751 0 0 1-.018-1.042Zm-4.69 9.64a1.998 1.998 0 0 0 2.83 0l1.25-1.25a.751.751 0 0 1 1.042.018.751.751 0 0 1 .018 1.042l-1.25 1.25a3.5 3.5 0 1 1-4.95-4.95l2.5-2.5a3.5 3.5 0 0 1 4.95 0 .751.751 0 0 1-.018 1.042.751.751 0 0 1-1.042.018 1.998 1.998 0 0 0-2.83 0l-2.5 2.5a1.998 1.998 0 0 0 0 2.83Z"></path></svg></a></div> <p dir="auto">Open Image Denoise 2 introduces GPU support, which requires implementing some minor changes in applications. There are also small API changes, additions and improvements in this new version. In this section we summarize the necessary code modifications and also briefly mention the new features that users might find useful when upgrading to version 2.x. For a full description of the changes and new functionality, please see the API reference.</p> <div class="markdown-heading" dir="auto"><h3 tabindex="-1" class="heading-element" dir="auto">Buffers</h3><a id="user-content-buffers" class="anchor" aria-label="Permalink: Buffers" href="#buffers"><svg class="octicon octicon-link" viewBox="0 0 16 16" version="1.1" width="16" height="16" aria-hidden="true"><path d="m7.775 3.275 1.25-1.25a3.5 3.5 0 1 1 4.95 4.95l-2.5 2.5a3.5 3.5 0 0 1-4.95 0 .751.751 0 0 1 .018-1.042.751.751 0 0 1 1.042-.018 1.998 1.998 0 0 0 2.83 0l2.5-2.5a2.002 2.002 0 0 0-2.83-2.83l-1.25 1.25a.751.751 0 0 1-1.042-.018.751.751 0 0 1-.018-1.042Zm-4.69 9.64a1.998 1.998 0 0 0 2.83 0l1.25-1.25a.751.751 0 0 1 1.042.018.751.751 0 0 1 .018 1.042l-1.25 1.25a3.5 3.5 0 1 1-4.95-4.95l2.5-2.5a3.5 3.5 0 0 1 4.95 0 .751.751 0 0 1-.018 1.042.751.751 0 0 1-1.042.018 1.998 1.998 0 0 0-2.83 0l-2.5 2.5a1.998 1.998 0 0 0 0 2.83Z"></path></svg></a></div> <p dir="auto">The most important required change is related to how data is passed to Open Image Denoise. If the application is explicitly using only the CPU (by specifying <code>OIDN_DEVICE_TYPE_CPU</code>), no changes should be necessary. But if it wants to support GPUs as well, passing pointers to memory allocated with the system allocator (e.g. <code>malloc</code>) would raise an error because GPUs cannot access such memory in almost all cases.</p> <p dir="auto">To ensure compatibility with any kind of device, including GPUs, the application should use <code>OIDNBuffer</code> objects to store all image data passed to the library. Memory allocated using buffers is by default accessible by both the host (CPU) and the device (CPU or GPU).</p> <p dir="auto">Ideally, the application should directly read and write image data to/from such buffers to avoid redundant and inefficient data copying. If this cannot be implemented, the application should try to minimize the overhead of copying as much as possible:</p> <ul dir="auto"> <li> <p dir="auto">Data should be copied to/from buffers only if the data in system memory indeed cannot be accessed by the device. This can be determined by simply querying the <code>systemMemorySupported</code> device parameter. If system allocated memory is accessible by the device, no buffers are necessary and filter image parameters can be set with <code>oidnSetSharedFilterImage</code>.</p> </li> <li> <p dir="auto">If the image data cannot be accessed by the device, buffers must be created and the data must be copied to/from these buffers. These buffers should be directly passed to filters as image parameters instead of the original pointers using <code>oidnSetFilterImage</code>.</p> </li> <li> <p dir="auto">Data should be copied asynchronously using using the new <code>oidnReadBufferAsync</code> and <code>oidnWriteBufferAsync</code> functions, which may achieve higher performance than plain <code>memcpy</code>.</p> </li> <li> <p dir="auto">If image data must be copied, using the default buffer allocation may not be the most efficient method. If the device memory is not physically shared with the host memory (e.g. for dedicated GPUs), higher performance may be achieved by creating the buffers with device storage (<code>OIDN_STORAGE_DEVICE</code>) using the new <code>oidnNewBufferWithStorage</code> function. This way, the buffer data cannot be directly accessed by the host anymore but this should not matter because the data must be copied from some other memory location anyway. However, this ensures that the data is stored only in high-performance device memory, and the user has full control over when and how the data is transferred between host and device.</p> </li> </ul> <p dir="auto">The <code>oidnMapBuffer</code> and <code>oidnUnmapBuffer</code> functions have been removed from the API due to these not being supported by any of the device backends. Please use <code>oidnReadBuffer(Async)</code> and <code>oidnWriteBuffer(Async)</code> instead.</p> <div class="markdown-heading" dir="auto"><h3 tabindex="-1" class="heading-element" dir="auto">Interop with Compute (SYCL, CUDA, HIP) and Graphics (DX, Vulkan, Metal) APIs</h3><a id="user-content-interop-with-compute-sycl-cuda-hip-and-graphics-dx-vulkan-metal-apis" class="anchor" aria-label="Permalink: Interop with Compute (SYCL, CUDA, HIP) and Graphics (DX, Vulkan, Metal) APIs" href="#interop-with-compute-sycl-cuda-hip-and-graphics-dx-vulkan-metal-apis"><svg class="octicon octicon-link" viewBox="0 0 16 16" version="1.1" width="16" height="16" aria-hidden="true"><path d="m7.775 3.275 1.25-1.25a3.5 3.5 0 1 1 4.95 4.95l-2.5 2.5a3.5 3.5 0 0 1-4.95 0 .751.751 0 0 1 .018-1.042.751.751 0 0 1 1.042-.018 1.998 1.998 0 0 0 2.83 0l2.5-2.5a2.002 2.002 0 0 0-2.83-2.83l-1.25 1.25a.751.751 0 0 1-1.042-.018.751.751 0 0 1-.018-1.042Zm-4.69 9.64a1.998 1.998 0 0 0 2.83 0l1.25-1.25a.751.751 0 0 1 1.042.018.751.751 0 0 1 .018 1.042l-1.25 1.25a3.5 3.5 0 1 1-4.95-4.95l2.5-2.5a3.5 3.5 0 0 1 4.95 0 .751.751 0 0 1-.018 1.042.751.751 0 0 1-1.042.018 1.998 1.998 0 0 0-2.83 0l-2.5 2.5a1.998 1.998 0 0 0 0 2.83Z"></path></svg></a></div> <p dir="auto">If the application is explicitly using a particular device type which supports unified memory allocations, e.g. SYCL or CUDA, it may directly pass pointers allocated using the native allocator of the respective compute API (e.g. <code>sycl::malloc_device</code>, <code>cudaMalloc</code>) instead of using buffers. This way, it is the responsibility of the user to correctly allocate the memory for the device.</p> <p dir="auto">In such cases, it often necessary to have more control over the device creation as well, to ensure that filtering is running on the intended device and command queues or streams from the application can be shared to improve performance. If the application is using the same compute or graphics API as the Open Image Denoise device, this can be achieved by creating devices with <code>oidnNewSYCLDevice</code>, <code>oidnNewCUDADevice</code>, etc. For some APIs there are additional interoperability functions as well, e.g. <code>oidnExecuteSYCLFilterAsync</code>.</p> <p dir="auto">If the application is using a graphics API which does not support unified memory allocations, e.g. DX12 or Vulkan, it may be still possible to share memory between the application and Open Image Denoise using buffers, avoiding expensive copying through host memory. External buffers can be imported from graphics APIs with the new <code>oidnNewSharedBufferFromFD</code> and <code>oidnNewSharedBufferFromWin32Handle</code> functions. To use this feature, buffers must be exported in the graphics API and must be imported in Open Image Denoise using the same kind of handle. Care must be taken to select an external memory handle type which is supported by both APIs. The external memory types supported by an Open Image Denoise device can be queried using the <code>externalMemoryTypes</code> device parameter. Note that some devices do not support importing external memory at all (e.g. CPUs, and on GPUs it primarily depends on the installed drivers), so the application should always implement a fallback too, which copies the data through the host if there is no other supported way. Metal buffers can be used directly with the <code>oidnNewSharedBufferFromMetal</code> function.</p> <p dir="auto">Sharing textures is currently not supported natively but it is still possible avoid copying texture data by using a linear texture layout (e.g. <code>VK_IMAGE_TILING_LINEAR</code> in Vulkan) and sharing the buffer that backs this data. In this case, you should ensure that the row stride of the linear texture data is correctly set.</p> <p dir="auto">Importing external synchronization primitives (e.g. semaphores) from graphics APIs is not yet supported either but it is planned for a future release. Meanwhile, synchronizing access to shared memory should be done on the host using <code>oidnSyncDevice</code> and the used graphics API.</p> <p dir="auto">When importing external memory, the application also needs to make sure that the Open Image Denoise device is running on the same <em>physical</em> device as the graphics API. This can be easily achieved by using the new physical device feature, described in the next section.</p> <div class="markdown-heading" dir="auto"><h3 tabindex="-1" class="heading-element" dir="auto">Physical Devices</h3><a id="user-content-physical-devices" class="anchor" aria-label="Permalink: Physical Devices" href="#physical-devices"><svg class="octicon octicon-link" viewBox="0 0 16 16" version="1.1" width="16" height="16" aria-hidden="true"><path d="m7.775 3.275 1.25-1.25a3.5 3.5 0 1 1 4.95 4.95l-2.5 2.5a3.5 3.5 0 0 1-4.95 0 .751.751 0 0 1 .018-1.042.751.751 0 0 1 1.042-.018 1.998 1.998 0 0 0 2.83 0l2.5-2.5a2.002 2.002 0 0 0-2.83-2.83l-1.25 1.25a.751.751 0 0 1-1.042-.018.751.751 0 0 1-.018-1.042Zm-4.69 9.64a1.998 1.998 0 0 0 2.83 0l1.25-1.25a.751.751 0 0 1 1.042.018.751.751 0 0 1 .018 1.042l-1.25 1.25a3.5 3.5 0 1 1-4.95-4.95l2.5-2.5a3.5 3.5 0 0 1 4.95 0 .751.751 0 0 1-.018 1.042.751.751 0 0 1-1.042.018 1.998 1.998 0 0 0-2.83 0l-2.5 2.5a1.998 1.998 0 0 0 0 2.83Z"></path></svg></a></div> <p dir="auto">Although it is possible to explicitly create devices of a particular type (with, e.g., <code>OIDN_DEVICE_TYPE_SYCL</code>), this is often insufficient, especially if the system has multiple devices of the same type, and with GPU support it is very common that there are multiple different types of supported devices in the system (e.g. a CPU and one or more GPUs).</p> <p dir="auto">Open Image Denoise 2 introduces a simple <em>physical device</em> API, which enables the application to query the list of supported physical devices in the system, including their name, type, UUID, LUID, PCI address, etc. (see <code>oidnGetNumPhysicalDevices</code>, <code>oidnGetPhysicalDeviceString</code>, etc.). New logical device (i.e. <code>OIDNDevice</code>) creation functions for have been also introduced, which enable creating a logical device on a specific physical device: <code>oidnNewDeviceByID</code>, <code>oidnNewDeviceByUUID</code>, etc.</p> <p dir="auto">Creating a logical device on a physical device having a particular UUID, LUID or PCI address is particularly important when importing external memory from graphics APIs. However, not all device types support all types of IDs, and some graphics drivers may even report mismatching UUIDs or LUIDs for the same physical device, so applications should try to implement multiple identification methods, or at least assume that identification might fail.</p> <div class="markdown-heading" dir="auto"><h3 tabindex="-1" class="heading-element" dir="auto">Asynchronous Execution</h3><a id="user-content-asynchronous-execution" class="anchor" aria-label="Permalink: Asynchronous Execution" href="#asynchronous-execution"><svg class="octicon octicon-link" viewBox="0 0 16 16" version="1.1" width="16" height="16" aria-hidden="true"><path d="m7.775 3.275 1.25-1.25a3.5 3.5 0 1 1 4.95 4.95l-2.5 2.5a3.5 3.5 0 0 1-4.95 0 .751.751 0 0 1 .018-1.042.751.751 0 0 1 1.042-.018 1.998 1.998 0 0 0 2.83 0l2.5-2.5a2.002 2.002 0 0 0-2.83-2.83l-1.25 1.25a.751.751 0 0 1-1.042-.018.751.751 0 0 1-.018-1.042Zm-4.69 9.64a1.998 1.998 0 0 0 2.83 0l1.25-1.25a.751.751 0 0 1 1.042.018.751.751 0 0 1 .018 1.042l-1.25 1.25a3.5 3.5 0 1 1-4.95-4.95l2.5-2.5a3.5 3.5 0 0 1 4.95 0 .751.751 0 0 1-.018 1.042.751.751 0 0 1-1.042.018 1.998 1.998 0 0 0-2.83 0l-2.5 2.5a1.998 1.998 0 0 0 0 2.83Z"></path></svg></a></div> <p dir="auto">It is now possible to execute some operations asynchronously, most importantly filtering (<code>oidnExecuteFilterAsync</code>, <code>oidnExecuteSYCLFilterAsync</code>) and copying data (the already mentioned <code>oidnReadBufferAsync</code> and <code>oidnWriteBufferAsync</code>).</p> <p dir="auto">When using any asynchronous function it is the responsibility of the application to handle correct synchronization using <code>oidnSyncDevice</code>.</p> <div class="markdown-heading" dir="auto"><h3 tabindex="-1" class="heading-element" dir="auto">Filter Quality</h3><a id="user-content-filter-quality" class="anchor" aria-label="Permalink: Filter Quality" href="#filter-quality"><svg class="octicon octicon-link" viewBox="0 0 16 16" version="1.1" width="16" height="16" aria-hidden="true"><path d="m7.775 3.275 1.25-1.25a3.5 3.5 0 1 1 4.95 4.95l-2.5 2.5a3.5 3.5 0 0 1-4.95 0 .751.751 0 0 1 .018-1.042.751.751 0 0 1 1.042-.018 1.998 1.998 0 0 0 2.83 0l2.5-2.5a2.002 2.002 0 0 0-2.83-2.83l-1.25 1.25a.751.751 0 0 1-1.042-.018.751.751 0 0 1-.018-1.042Zm-4.69 9.64a1.998 1.998 0 0 0 2.83 0l1.25-1.25a.751.751 0 0 1 1.042.018.751.751 0 0 1 .018 1.042l-1.25 1.25a3.5 3.5 0 1 1-4.95-4.95l2.5-2.5a3.5 3.5 0 0 1 4.95 0 .751.751 0 0 1-.018 1.042.751.751 0 0 1-1.042.018 1.998 1.998 0 0 0-2.83 0l-2.5 2.5a1.998 1.998 0 0 0 0 2.83Z"></path></svg></a></div> <p dir="auto">Open Image Denoise still delivers the same high image quality on all device types as before, including on GPUs. But often filtering performance is more important than having the highest possible image quality, so it is now possible to switch between multiple filter quality modes. Filters have a new parameter called <code>quality</code>, which defaults to the existing <em>high</em> image quality (<code>OIDN_QUALITY_HIGH</code>) but <em>balanced</em> (<code>OIDN_QUALITY_BALANCED</code>) and <em>fast</em> (<code>OIDN_QUALITY_FAST</code>) quality modes have been added as well for even higher performance. We recommend using <em>balanced</em> or <em>fast</em> quality for interactive and real-time use cases.</p> <div class="markdown-heading" dir="auto"><h3 tabindex="-1" class="heading-element" dir="auto">Small API Changes</h3><a id="user-content-small-api-changes" class="anchor" aria-label="Permalink: Small API Changes" href="#small-api-changes"><svg class="octicon octicon-link" viewBox="0 0 16 16" version="1.1" width="16" height="16" aria-hidden="true"><path d="m7.775 3.275 1.25-1.25a3.5 3.5 0 1 1 4.95 4.95l-2.5 2.5a3.5 3.5 0 0 1-4.95 0 .751.751 0 0 1 .018-1.042.751.751 0 0 1 1.042-.018 1.998 1.998 0 0 0 2.83 0l2.5-2.5a2.002 2.002 0 0 0-2.83-2.83l-1.25 1.25a.751.751 0 0 1-1.042-.018.751.751 0 0 1-.018-1.042Zm-4.69 9.64a1.998 1.998 0 0 0 2.83 0l1.25-1.25a.751.751 0 0 1 1.042.018.751.751 0 0 1 .018 1.042l-1.25 1.25a3.5 3.5 0 1 1-4.95-4.95l2.5-2.5a3.5 3.5 0 0 1 4.95 0 .751.751 0 0 1-.018 1.042.751.751 0 0 1-1.042.018 1.998 1.998 0 0 0-2.83 0l-2.5 2.5a1.998 1.998 0 0 0 0 2.83Z"></path></svg></a></div> <p dir="auto">A few existing API functions have been renamed to improve clarity (e.g. <code>oidnSetFilter1i</code> to <code>oidnSetFilterInt</code>) but the old function names are still available as deprecated functions. When compiling legacy code, warnings will be emitted for these deprecated functions. To upgrade to the new API, please simply follow the instructions in the warnings.</p> <p dir="auto">Some filter parameters have been also renamed (<code>alignment</code> to <code>tileAlignment</code>, <code>overlap</code> to <code>tileOverlap</code>). When using the old names, warnings will be emitted at runtime.</p> <div class="markdown-heading" dir="auto"><h3 tabindex="-1" class="heading-element" dir="auto">Building as a Static Library</h3><a id="user-content-building-as-a-static-library" class="anchor" aria-label="Permalink: Building as a Static Library" href="#building-as-a-static-library"><svg class="octicon octicon-link" viewBox="0 0 16 16" version="1.1" width="16" height="16" aria-hidden="true"><path d="m7.775 3.275 1.25-1.25a3.5 3.5 0 1 1 4.95 4.95l-2.5 2.5a3.5 3.5 0 0 1-4.95 0 .751.751 0 0 1 .018-1.042.751.751 0 0 1 1.042-.018 1.998 1.998 0 0 0 2.83 0l2.5-2.5a2.002 2.002 0 0 0-2.83-2.83l-1.25 1.25a.751.751 0 0 1-1.042-.018.751.751 0 0 1-.018-1.042Zm-4.69 9.64a1.998 1.998 0 0 0 2.83 0l1.25-1.25a.751.751 0 0 1 1.042.018.751.751 0 0 1 .018 1.042l-1.25 1.25a3.5 3.5 0 1 1-4.95-4.95l2.5-2.5a3.5 3.5 0 0 1 4.95 0 .751.751 0 0 1-.018 1.042.751.751 0 0 1-1.042.018 1.998 1.998 0 0 0-2.83 0l-2.5 2.5a1.998 1.998 0 0 0 0 2.83Z"></path></svg></a></div> <p dir="auto">The support to build Open Image Denoise as a static library (<code>OIDN_STATIC_LIB</code> CMake option) has been limited to CPU-only builds due to switching to a modular library design that was necessary for adding multi-vendor GPU support. If the library is built with GPU support as well, the <code>OIDN_STATIC_LIB</code> option is still available but enabling it results in a hybrid static/shared library.</p> <p dir="auto">If the main reason for building as a static library would be is the ability to use multiple versions of Open Image Denoise in the same process, please use the existing <code>OIDN_API_NAMESPACE</code> CMake option instead. With this feature all symbols of the library will be put into a custom namespace, which can prevent symbol clashes.</p> <div class="markdown-heading" dir="auto"><h2 tabindex="-1" class="heading-element" dir="auto">Physical Devices</h2><a id="user-content-physical-devices-1" class="anchor" aria-label="Permalink: Physical Devices" href="#physical-devices-1"><svg class="octicon octicon-link" viewBox="0 0 16 16" version="1.1" width="16" height="16" aria-hidden="true"><path d="m7.775 3.275 1.25-1.25a3.5 3.5 0 1 1 4.95 4.95l-2.5 2.5a3.5 3.5 0 0 1-4.95 0 .751.751 0 0 1 .018-1.042.751.751 0 0 1 1.042-.018 1.998 1.998 0 0 0 2.83 0l2.5-2.5a2.002 2.002 0 0 0-2.83-2.83l-1.25 1.25a.751.751 0 0 1-1.042-.018.751.751 0 0 1-.018-1.042Zm-4.69 9.64a1.998 1.998 0 0 0 2.83 0l1.25-1.25a.751.751 0 0 1 1.042.018.751.751 0 0 1 .018 1.042l-1.25 1.25a3.5 3.5 0 1 1-4.95-4.95l2.5-2.5a3.5 3.5 0 0 1 4.95 0 .751.751 0 0 1-.018 1.042.751.751 0 0 1-1.042.018 1.998 1.998 0 0 0-2.83 0l-2.5 2.5a1.998 1.998 0 0 0 0 2.83Z"></path></svg></a></div> <p dir="auto">Systems often have multiple different types of devices supported by Open Image Denoise (CPUs and GPUs). The application can get the list of supported <em>physical devices</em> and select which of these to use for denoising.</p> <p dir="auto">The number of supported physical devices can be queried with</p> <div class="highlight highlight-source-c++ notranslate position-relative overflow-auto" dir="auto" data-snippet-clipboard-copy-content="int oidnGetNumPhysicalDevices();"><pre><span class="pl-k">int</span> <span class="pl-en">oidnGetNumPhysicalDevices</span>();</pre></div> <p dir="auto">The physical devices can be identified using IDs between 0 and (<code>oidnGetNumPhysicalDevices()</code> (-) 1), and are ordered <em>approximately</em> from fastest to slowest (e.g., ID of 0 corresponds to the likely fastest physical device). Note that the reported number and order of physical devices may change between application runs, so no assumptions should be made about this list.</p> <p dir="auto">Parameters of these physical devices can be queried using</p> <div class="highlight highlight-source-c++ notranslate position-relative overflow-auto" dir="auto" data-snippet-clipboard-copy-content="bool oidnGetPhysicalDeviceBool (int physicalDeviceID, const char* name); int oidnGetPhysicalDeviceInt (int physicalDeviceID, const char* name); unsigned int oidnGetPhysicalDeviceUInt (int physicalDeviceID, const char* name); const char* oidnGetPhysicalDeviceString(int physicalDeviceID, const char* name); const void* oidnGetPhysicalDeviceData (int physicalDeviceID, const char* name, size_t* byteSize);"><pre><span class="pl-k">bool</span> <span class="pl-en">oidnGetPhysicalDeviceBool</span> (<span class="pl-k">int</span> physicalDeviceID, <span class="pl-k">const</span> <span class="pl-k">char</span>* name); <span class="pl-k">int</span> <span class="pl-en">oidnGetPhysicalDeviceInt</span> (<span class="pl-k">int</span> physicalDeviceID, <span class="pl-k">const</span> <span class="pl-k">char</span>* name); <span class="pl-k">unsigned</span> <span class="pl-k">int</span> <span class="pl-en">oidnGetPhysicalDeviceUInt</span> (<span class="pl-k">int</span> physicalDeviceID, <span class="pl-k">const</span> <span class="pl-k">char</span>* name); <span class="pl-k">const</span> <span class="pl-k">char</span>* <span class="pl-en">oidnGetPhysicalDeviceString</span>(<span class="pl-k">int</span> physicalDeviceID, <span class="pl-k">const</span> <span class="pl-k">char</span>* name); <span class="pl-k">const</span> <span class="pl-k">void</span>* <span class="pl-en">oidnGetPhysicalDeviceData</span> (<span class="pl-k">int</span> physicalDeviceID, <span class="pl-k">const</span> <span class="pl-k">char</span>* name, <span class="pl-c1">size_t</span>* byteSize);</pre></div> <p dir="auto">where <code>name</code> is the name of the parameter, and <code>byteSize</code> is the number of returned bytes for data parameters. The following parameters can be queried:</p> <markdown-accessiblity-table><table> <thead> <tr> <th align="left">Type</th> <th align="left">Name</th> <th align="left">Description</th> </tr> </thead> <tbody> <tr> <td align="left"><code>Int</code></td> <td align="left"><code>type</code></td> <td align="left">device type as an <code>OIDNDeviceType</code> value</td> </tr> <tr> <td align="left"><code>String</code></td> <td align="left"><code>name</code></td> <td align="left">name string</td> </tr> <tr> <td align="left"><code>Bool</code></td> <td align="left"><code>uuidSupported</code></td> <td align="left">device supports universally unique identifier (UUID)</td> </tr> <tr> <td align="left"><code>Data</code></td> <td align="left"><code>uuid</code></td> <td align="left">opaque UUID (<code>OIDN_UUID_SIZE</code> bytes, exists only if <code>uuidSupported</code> is <code>true</code>)</td> </tr> <tr> <td align="left"><code>Bool</code></td> <td align="left"><code>luidSupported</code></td> <td align="left">device supports locally unique identifier (UUID)</td> </tr> <tr> <td align="left"><code>Data</code></td> <td align="left"><code>luid</code></td> <td align="left">opaque LUID (<code>OIDN_LUID_SIZE</code> bytes, exists only if <code>luidSupported</code> is <code>true</code>)</td> </tr> <tr> <td align="left"><code>UInt</code></td> <td align="left"><code>nodeMask</code></td> <td align="left">bitfield identifying the node within a linked device adapter corresponding to the device (exists only if <code>luidSupported</code> is <code>true</code>)</td> </tr> <tr> <td align="left"><code>Bool</code></td> <td align="left"><code>pciAddressSupported</code></td> <td align="left">device supports PCI address</td> </tr> <tr> <td align="left"><code>Int</code></td> <td align="left"><code>pciDomain</code></td> <td align="left">PCI domain (exists only if <code>pciAddressSupported</code> is <code>true</code>)</td> </tr> <tr> <td align="left"><code>Int</code></td> <td align="left"><code>pciBus</code></td> <td align="left">PCI bus (exists only if <code>pciAddressSupported</code> is <code>true</code>)</td> </tr> <tr> <td align="left"><code>Int</code></td> <td align="left"><code>pciDevice</code></td> <td align="left">PCI device (exists only if <code>pciAddressSupported</code> is <code>true</code>)</td> </tr> <tr> <td align="left"><code>Int</code></td> <td align="left"><code>pciFunction</code></td> <td align="left">PCI function (exists only if <code>pciAddressSupported</code> is <code>true</code>)</td> </tr> </tbody> </table></markdown-accessiblity-table> <p dir="auto">Constant parameters supported by physical devices.</p> <p dir="auto">It is also possible to directly query whether a physical device of a particular type is supported, without iterating over all supported physical devices:</p> <div class="highlight highlight-source-c++ notranslate position-relative overflow-auto" dir="auto" data-snippet-clipboard-copy-content="bool oidnIsCPUDeviceSupported(); bool oidnIsSYCLDeviceSupported(const sycl::device* device); bool oidnIsCUDADeviceSupported(int deviceID); bool oidnIsHIPDeviceSupported(int deviceID); bool oidnIsMetalDeviceSupported(MTLDevice_id device);"><pre><span class="pl-k">bool</span> <span class="pl-en">oidnIsCPUDeviceSupported</span>(); <span class="pl-k">bool</span> <span class="pl-en">oidnIsSYCLDeviceSupported</span>(<span class="pl-k">const</span> sycl::device* device); <span class="pl-k">bool</span> <span class="pl-en">oidnIsCUDADeviceSupported</span>(<span class="pl-k">int</span> deviceID); <span class="pl-k">bool</span> <span class="pl-en">oidnIsHIPDeviceSupported</span>(<span class="pl-k">int</span> deviceID); <span class="pl-k">bool</span> <span class="pl-en">oidnIsMetalDeviceSupported</span>(MTLDevice_id device);</pre></div> <div class="markdown-heading" dir="auto"><h2 tabindex="-1" class="heading-element" dir="auto">Devices</h2><a id="user-content-devices" class="anchor" aria-label="Permalink: Devices" href="#devices"><svg class="octicon octicon-link" viewBox="0 0 16 16" version="1.1" width="16" height="16" aria-hidden="true"><path d="m7.775 3.275 1.25-1.25a3.5 3.5 0 1 1 4.95 4.95l-2.5 2.5a3.5 3.5 0 0 1-4.95 0 .751.751 0 0 1 .018-1.042.751.751 0 0 1 1.042-.018 1.998 1.998 0 0 0 2.83 0l2.5-2.5a2.002 2.002 0 0 0-2.83-2.83l-1.25 1.25a.751.751 0 0 1-1.042-.018.751.751 0 0 1-.018-1.042Zm-4.69 9.64a1.998 1.998 0 0 0 2.83 0l1.25-1.25a.751.751 0 0 1 1.042.018.751.751 0 0 1 .018 1.042l-1.25 1.25a3.5 3.5 0 1 1-4.95-4.95l2.5-2.5a3.5 3.5 0 0 1 4.95 0 .751.751 0 0 1-.018 1.042.751.751 0 0 1-1.042.018 1.998 1.998 0 0 0-2.83 0l-2.5 2.5a1.998 1.998 0 0 0 0 2.83Z"></path></svg></a></div> <p dir="auto">Open Image Denoise has a <em>logical</em> device concept as well, or simply referred to as <em>device</em>, which allows different components of the application to use the Open Image Denoise API without interfering with each other. Each physical device may be associated with one ore more logical devices. A basic way to create a device is by calling</p> <div class="highlight highlight-source-c++ notranslate position-relative overflow-auto" dir="auto" data-snippet-clipboard-copy-content="OIDNDevice oidnNewDevice(OIDNDeviceType type);"><pre>OIDNDevice <span class="pl-en">oidnNewDevice</span>(OIDNDeviceType type);</pre></div> <p dir="auto">where the <code>type</code> enumeration maps to a specific device implementation, which can be one of the following:</p> <markdown-accessiblity-table><table> <thead> <tr> <th align="left">Name</th> <th align="left">Description</th> </tr> </thead> <tbody> <tr> <td align="left"><code>OIDN_DEVICE_TYPE_DEFAULT</code></td> <td align="left">select the likely fastest device (same as physical device with ID 0)</td> </tr> <tr> <td align="left"><code>OIDN_DEVICE_TYPE_CPU</code></td> <td align="left">CPU device</td> </tr> <tr> <td align="left"><code>OIDN_DEVICE_TYPE_SYCL</code></td> <td align="left">SYCL device (requires a supported Intel GPU)</td> </tr> <tr> <td align="left"><code>OIDN_DEVICE_TYPE_CUDA</code></td> <td align="left">CUDA device (requires a supported NVIDIA GPU)</td> </tr> <tr> <td align="left"><code>OIDN_DEVICE_TYPE_HIP</code></td> <td align="left">HIP device (requires a supported AMD GPU)</td> </tr> <tr> <td align="left"><code>OIDN_DEVICE_TYPE_METAL</code></td> <td align="left">Metal device (requires a supported Apple GPU)</td> </tr> </tbody> </table></markdown-accessiblity-table> <p dir="auto">Supported device types, i.e., valid constants of type <code>OIDNDeviceType</code>.</p> <p dir="auto">If there are multiple supported devices of the specified type, an implementation-dependent default will be selected.</p> <p dir="auto">A device can be created by specifying a physical device ID as well using</p> <div class="highlight highlight-source-c++ notranslate position-relative overflow-auto" dir="auto" data-snippet-clipboard-copy-content="OIDNDevice oidnNewDeviceByID(int physicalDeviceID);"><pre>OIDNDevice <span class="pl-en">oidnNewDeviceByID</span>(<span class="pl-k">int</span> physicalDeviceID);</pre></div> <p dir="auto">Applications can manually iterate over the list of physical devices and select from them based on their properties but there are also some built-in helper functions as well, which make creating a device by a particular physical device property easier:</p> <div class="highlight highlight-source-c++ notranslate position-relative overflow-auto" dir="auto" data-snippet-clipboard-copy-content="OIDNDevice oidnNewDeviceByUUID(const void* uuid); OIDNDevice oidnNewDeviceByLUID(const void* luid); OIDNDevice oidnNewDeviceByPCIAddress(int pciDomain, int pciBus, int pciDevice, int pciFunction);"><pre>OIDNDevice <span class="pl-en">oidnNewDeviceByUUID</span>(<span class="pl-k">const</span> <span class="pl-k">void</span>* uuid); OIDNDevice <span class="pl-en">oidnNewDeviceByLUID</span>(<span class="pl-k">const</span> <span class="pl-k">void</span>* luid); OIDNDevice <span class="pl-en">oidnNewDeviceByPCIAddress</span>(<span class="pl-k">int</span> pciDomain, <span class="pl-k">int</span> pciBus, <span class="pl-k">int</span> pciDevice, <span class="pl-k">int</span> pciFunction);</pre></div> <p dir="auto">These functions are particularly useful when the application needs interoperability with a graphics API (e.g. DX12, Vulkan). However, not all of these properties may be supported by the intended physical device (or drivers might even report inconsistent identifiers), so it is recommended to select by more than one property, if possible.</p> <p dir="auto">If the application requires interoperability with a particular compute or graphics API (SYCL, CUDA, HIP, Metal), it is recommended to use one of the following dedicated functions instead:</p> <div class="highlight highlight-source-c++ notranslate position-relative overflow-auto" dir="auto" data-snippet-clipboard-copy-content="OIDNDevice oidnNewSYCLDevice(const sycl::queue* queues, int numQueues); OIDNDevice oidnNewCUDADevice(const int* deviceIDs, const cudaStream_t* streams, int numPairs); OIDNDevice oidnNewHIPDevice(const int* deviceIDs, const hipStream_t* streams, int numPairs); OIDNDevice oidnNewMetalDevice(const MTLCommandQueue_id* commandQueues, int numQueues);"><pre>OIDNDevice <span class="pl-en">oidnNewSYCLDevice</span>(<span class="pl-k">const</span> sycl::queue* queues, <span class="pl-k">int</span> numQueues); OIDNDevice <span class="pl-en">oidnNewCUDADevice</span>(<span class="pl-k">const</span> <span class="pl-k">int</span>* deviceIDs, <span class="pl-k">const</span> cudaStream_t* streams, <span class="pl-k">int</span> numPairs); OIDNDevice <span class="pl-en">oidnNewHIPDevice</span>(<span class="pl-k">const</span> <span class="pl-k">int</span>* deviceIDs, <span class="pl-k">const</span> hipStream_t* streams, <span class="pl-k">int</span> numPairs); OIDNDevice <span class="pl-en">oidnNewMetalDevice</span>(<span class="pl-k">const</span> MTLCommandQueue_id* commandQueues, <span class="pl-k">int</span> numQueues);</pre></div> <p dir="auto">For SYCL, it is possible to pass one or more SYCL queues which will be used by Open Image Denoise for all device operations. This is useful when the application wants to use the same queues for both denoising and its own operations (e.g. rendering). Passing multiple queues is not intended to be used for different physical devices but just for a single SYCL root-device which consists of multiple sub-devices (e.g. Intel® Data Center GPU Max Series having multiple Xe-Stacks/tiles). The only supported SYCL backend is oneAPI Level Zero.</p> <p dir="auto">For CUDA and HIP, pairs of CUDA/HIP device IDs and corresponding streams can be specified but the current implementation supports only one pair. A <code>NULL</code> stream corresponds to the default stream on the corresponding device. Open Image Denoise automatically sets and restores the current CUDA/HIP device/context on the calling thread when necessary, thus the current device does not have to be changed manually by the application.</p> <p dir="auto">For Metal, a single command queue is supported.</p> <p dir="auto">Once a device is created, you can call</p> <div class="highlight highlight-source-c++ notranslate position-relative overflow-auto" dir="auto" data-snippet-clipboard-copy-content="bool oidnGetDeviceBool(OIDNDevice device, const char* name); void oidnSetDeviceBool(OIDNDevice device, const char* name, bool value); int oidnGetDeviceInt (OIDNDevice device, const char* name); void oidnSetDeviceInt (OIDNDevice device, const char* name, int value); int oidnGetDeviceUInt(OIDNDevice device, const char* name); void oidnSetDeviceUInt(OIDNDevice device, const char* name, unsigned int value);"><pre><span class="pl-k">bool</span> <span class="pl-en">oidnGetDeviceBool</span>(OIDNDevice device, <span class="pl-k">const</span> <span class="pl-k">char</span>* name); <span class="pl-k">void</span> <span class="pl-en">oidnSetDeviceBool</span>(OIDNDevice device, <span class="pl-k">const</span> <span class="pl-k">char</span>* name, <span class="pl-k">bool</span> value); <span class="pl-k">int</span> <span class="pl-en">oidnGetDeviceInt</span> (OIDNDevice device, <span class="pl-k">const</span> <span class="pl-k">char</span>* name); <span class="pl-k">void</span> <span class="pl-en">oidnSetDeviceInt</span> (OIDNDevice device, <span class="pl-k">const</span> <span class="pl-k">char</span>* name, <span class="pl-k">int</span> value); <span class="pl-k">int</span> <span class="pl-en">oidnGetDeviceUInt</span>(OIDNDevice device, <span class="pl-k">const</span> <span class="pl-k">char</span>* name); <span class="pl-k">void</span> <span class="pl-en">oidnSetDeviceUInt</span>(OIDNDevice device, <span class="pl-k">const</span> <span class="pl-k">char</span>* name, <span class="pl-k">unsigned</span> <span class="pl-k">int</span> value);</pre></div> <p dir="auto">to set and get parameter values on the device. Note that some parameters are constants, thus trying to set them is an error. See the tables below for the parameters supported by devices.</p> <markdown-accessiblity-table><table> <thead> <tr> <th align="left">Type</th> <th align="left">Name</th> <th align="right">Default</th> <th align="left">Description</th> </tr> </thead> <tbody> <tr> <td align="left"><code>Int</code></td> <td align="left"><code>type</code></td> <td align="right"><em>constant</em></td> <td align="left">device type as an <code>OIDNDeviceType</code> value</td> </tr> <tr> <td align="left"><code>Int</code></td> <td align="left"><code>version</code></td> <td align="right"><em>constant</em></td> <td align="left">combined version number (major.minor.patch) with two decimal digits per component</td> </tr> <tr> <td align="left"><code>Int</code></td> <td align="left"><code>versionMajor</code></td> <td align="right"><em>constant</em></td> <td align="left">major version number</td> </tr> <tr> <td align="left"><code>Int</code></td> <td align="left"><code>versionMinor</code></td> <td align="right"><em>constant</em></td> <td align="left">minor version number</td> </tr> <tr> <td align="left"><code>Int</code></td> <td align="left"><code>versionPatch</code></td> <td align="right"><em>constant</em></td> <td align="left">patch version number</td> </tr> <tr> <td align="left"><code>Bool</code></td> <td align="left"><code>systemMemorySupported</code></td> <td align="right"><em>constant</em></td> <td align="left">device can directly access memory allocated with the system allocator (e.g. <code>malloc</code>)</td> </tr> <tr> <td align="left"><code>Bool</code></td> <td align="left"><code>managedMemorySupported</code></td> <td align="right"><em>constant</em></td> <td align="left">device supports buffers created with managed storage (<code>OIDN_STORAGE_MANAGED</code>)</td> </tr> <tr> <td align="left"><code>Int</code></td> <td align="left"><code>externalMemoryTypes</code></td> <td align="right"><em>constant</em></td> <td align="left">bitfield of <code>OIDNExternalMemoryTypeFlag</code> values representing the external memory types supported by the device</td> </tr> <tr> <td align="left"><code>Int</code></td> <td align="left"><code>verbose</code></td> <td align="right">0</td> <td align="left">verbosity level of the console output between 0–4; when set to 0, no output is printed, when set to a higher level more output is printed</td> </tr> </tbody> </table></markdown-accessiblity-table> <p dir="auto">Parameters supported by all devices.</p> <markdown-accessiblity-table><table> <thead> <tr> <th align="left">Type</th> <th align="left">Name</th> <th align="right">Default</th> <th align="left">Description</th> </tr> </thead> <tbody> <tr> <td align="left"><code>Int</code></td> <td align="left"><code>numThreads</code></td> <td align="right">0</td> <td align="left">maximum number of threads which the library should use; 0 will set it automatically to get the best performance</td> </tr> <tr> <td align="left"><code>Bool</code></td> <td align="left"><code>setAffinity</code></td> <td align="right"><code>true</code></td> <td align="left">enables thread affinitization (pinning software threads to hardware threads) if it is necessary for achieving optimal performance</td> </tr> </tbody> </table></markdown-accessiblity-table> <p dir="auto">Additional parameters supported only by CPU devices.</p> <p dir="auto">Note that the CPU device heavily relies on setting the thread affinities to achieve optimal performance, so it is highly recommended to leave this option enabled. However, this may interfere with the application if that also sets the thread affinities, potentially causing performance degradation. In such cases, the recommended solution is to either disable setting the affinities in the application or in Open Image Denoise, or to always set/reset the affinities before/after each parallel region in the application (e.g., if using TBB, with <code>tbb::task_arena</code> and <code>tbb::task_scheduler_observer</code>).</p> <p dir="auto">Once parameters are set on the created device, the device must be committed with</p> <div class="highlight highlight-source-c++ notranslate position-relative overflow-auto" dir="auto" data-snippet-clipboard-copy-content="void oidnCommitDevice(OIDNDevice device);"><pre><span class="pl-k">void</span> <span class="pl-en">oidnCommitDevice</span>(OIDNDevice device);</pre></div> <p dir="auto">This device can then be used to construct further objects, such as buffers and filters. Note that a device can be committed only once during its lifetime.</p> <p dir="auto">Some functions may execute asynchronously with respect to the host. The names of these functions are suffixed with <code>Async</code>. Asynchronous operations are executed <em>in order</em> on the device but may not block on the host. Eventually, it is necessary to wait for all asynchronous operations to complete, which can be done by calling</p> <div class="highlight highlight-source-c++ notranslate position-relative overflow-auto" dir="auto" data-snippet-clipboard-copy-content="void oidnSyncDevice(OIDNDevice device);"><pre><span class="pl-k">void</span> <span class="pl-en">oidnSyncDevice</span>(OIDNDevice device);</pre></div> <p dir="auto">If any errors have occurred during asynchronous operations (e.g., cancellation through a progress monitor callback), those will be reported only when synchronization is triggered explicitly with <code>oidnSyncDevice</code> or implicitly with some other API call (e.g., <code>oidnExecuteFilter</code>, <code>oidnCommitFilter</code>).</p> <p dir="auto">Before the application exits, it should release all devices by invoking</p> <div class="highlight highlight-source-c++ notranslate position-relative overflow-auto" dir="auto" data-snippet-clipboard-copy-content="void oidnReleaseDevice(OIDNDevice device);"><pre><span class="pl-k">void</span> <span class="pl-en">oidnReleaseDevice</span>(OIDNDevice device);</pre></div> <p dir="auto">Note that Open Image Denoise uses reference counting for all object types, so this function decreases the reference count of the device, and if the count reaches 0 the device will automatically get deleted. It is also possible to increase the reference count by calling</p> <div class="highlight highlight-source-c++ notranslate position-relative overflow-auto" dir="auto" data-snippet-clipboard-copy-content="void oidnRetainDevice(OIDNDevice device);"><pre><span class="pl-k">void</span> <span class="pl-en">oidnRetainDevice</span>(OIDNDevice device);</pre></div> <p dir="auto">An application should typically create only a single device object per physical device (one for <em>all</em> CPUs or one per GPU) as creation can be very expensive and additional device objects may incur a significant memory overhead. If required differently, it should only use a small number of device objects at any given time.</p> <div class="markdown-heading" dir="auto"><h3 tabindex="-1" class="heading-element" dir="auto">Error Handling</h3><a id="user-content-error-handling" class="anchor" aria-label="Permalink: Error Handling" href="#error-handling"><svg class="octicon octicon-link" viewBox="0 0 16 16" version="1.1" width="16" height="16" aria-hidden="true"><path d="m7.775 3.275 1.25-1.25a3.5 3.5 0 1 1 4.95 4.95l-2.5 2.5a3.5 3.5 0 0 1-4.95 0 .751.751 0 0 1 .018-1.042.751.751 0 0 1 1.042-.018 1.998 1.998 0 0 0 2.83 0l2.5-2.5a2.002 2.002 0 0 0-2.83-2.83l-1.25 1.25a.751.751 0 0 1-1.042-.018.751.751 0 0 1-.018-1.042Zm-4.69 9.64a1.998 1.998 0 0 0 2.83 0l1.25-1.25a.751.751 0 0 1 1.042.018.751.751 0 0 1 .018 1.042l-1.25 1.25a3.5 3.5 0 1 1-4.95-4.95l2.5-2.5a3.5 3.5 0 0 1 4.95 0 .751.751 0 0 1-.018 1.042.751.751 0 0 1-1.042.018 1.998 1.998 0 0 0-2.83 0l-2.5 2.5a1.998 1.998 0 0 0 0 2.83Z"></path></svg></a></div> <p dir="auto">Each user thread has its own error code per device. If an error occurs when calling an API function, this error code is set to the occurred error if it stores no previous error. The currently stored error can be queried by the application via</p> <div class="highlight highlight-source-c++ notranslate position-relative overflow-auto" dir="auto" data-snippet-clipboard-copy-content="OIDNError oidnGetDeviceError(OIDNDevice device, const char** outMessage);"><pre>OIDNError <span class="pl-en">oidnGetDeviceError</span>(OIDNDevice device, <span class="pl-k">const</span> <span class="pl-k">char</span>** outMessage);</pre></div> <p dir="auto">where <code>outMessage</code> can be a pointer to a C string which will be set to a more descriptive error message, or it can be <code>NULL</code>. This function also clears the error code, which assures that the returned error code is always the first error occurred since the last invocation of <code>oidnGetDeviceError</code> on the current thread. Note that the optionally returned error message string is valid only until the next invocation of the function.</p> <p dir="auto">Alternatively, the application can also register a callback function of type</p> <div class="highlight highlight-source-c++ notranslate position-relative overflow-auto" dir="auto" data-snippet-clipboard-copy-content="typedef void (*OIDNErrorFunction)(void* userPtr, OIDNError code, const char* message);"><pre><span class="pl-k">typedef</span> <span class="pl-en">void</span> (*OIDNErrorFunction)(<span class="pl-k">void</span>* userPtr, OIDNError code, <span class="pl-k">const</span> <span class="pl-k">char</span>* message);</pre></div> <p dir="auto">via</p> <div class="highlight highlight-source-c++ notranslate position-relative overflow-auto" dir="auto" data-snippet-clipboard-copy-content="void oidnSetDeviceErrorFunction(OIDNDevice device, OIDNErrorFunction func, void* userPtr);"><pre><span class="pl-k">void</span> <span class="pl-en">oidnSetDeviceErrorFunction</span>(OIDNDevice device, OIDNErrorFunction func, <span class="pl-k">void</span>* userPtr);</pre></div> <p dir="auto">to get notified when errors occur. Only a single callback function can be registered per device, and further invocations overwrite the previously set callback function, which do <em>not</em> require also calling the <code>oidnCommitDevice</code> function. Passing <code>NULL</code> as function pointer disables the registered callback function. When the registered callback function is invoked, it gets passed the user-defined payload (<code>userPtr</code> argument as specified at registration time), the error code (<code>code</code> argument) of the occurred error, as well as a string (<code>message</code> argument) that further describes the error. The error code is always set even if an error callback function is registered. It is recommended to always set a error callback function, to detect all errors.</p> <p dir="auto">When the device construction fails, <code>oidnNewDevice</code> returns <code>NULL</code> as device. To detect the error code of a such failed device construction, pass <code>NULL</code> as device to the <code>oidnGetDeviceError</code> function. For all other invocations of <code>oidnGetDeviceError</code>, a proper device handle must be specified.</p> <p dir="auto">The following errors are currently used by Open Image Denoise:</p> <markdown-accessiblity-table><table> <thead> <tr> <th align="left">Name</th> <th align="left">Description</th> </tr> </thead> <tbody> <tr> <td align="left"><code>OIDN_ERROR_NONE</code></td> <td align="left">no error occurred</td> </tr> <tr> <td align="left"><code>OIDN_ERROR_UNKNOWN</code></td> <td align="left">an unknown error occurred</td> </tr> <tr> <td align="left"><code>OIDN_ERROR_INVALID_ARGUMENT</code></td> <td align="left">an invalid argument was specified</td> </tr> <tr> <td align="left"><code>OIDN_ERROR_INVALID_OPERATION</code></td> <td align="left">the operation is not allowed</td> </tr> <tr> <td align="left"><code>OIDN_ERROR_OUT_OF_MEMORY</code></td> <td align="left">not enough memory to execute the operation</td> </tr> <tr> <td align="left"><code>OIDN_ERROR_UNSUPPORTED_HARDWARE</code></td> <td align="left">the hardware (CPU/GPU) is not supported</td> </tr> <tr> <td align="left"><code>OIDN_ERROR_CANCELLED</code></td> <td align="left">the operation was cancelled by the user</td> </tr> </tbody> </table></markdown-accessiblity-table> <p dir="auto">Possible error codes, i.e., valid constants of type <code>OIDNError</code>.</p> <div class="markdown-heading" dir="auto"><h3 tabindex="-1" class="heading-element" dir="auto">Environment Variables</h3><a id="user-content-environment-variables" class="anchor" aria-label="Permalink: Environment Variables" href="#environment-variables"><svg class="octicon octicon-link" viewBox="0 0 16 16" version="1.1" width="16" height="16" aria-hidden="true"><path d="m7.775 3.275 1.25-1.25a3.5 3.5 0 1 1 4.95 4.95l-2.5 2.5a3.5 3.5 0 0 1-4.95 0 .751.751 0 0 1 .018-1.042.751.751 0 0 1 1.042-.018 1.998 1.998 0 0 0 2.83 0l2.5-2.5a2.002 2.002 0 0 0-2.83-2.83l-1.25 1.25a.751.751 0 0 1-1.042-.018.751.751 0 0 1-.018-1.042Zm-4.69 9.64a1.998 1.998 0 0 0 2.83 0l1.25-1.25a.751.751 0 0 1 1.042.018.751.751 0 0 1 .018 1.042l-1.25 1.25a3.5 3.5 0 1 1-4.95-4.95l2.5-2.5a3.5 3.5 0 0 1 4.95 0 .751.751 0 0 1-.018 1.042.751.751 0 0 1-1.042.018 1.998 1.998 0 0 0-2.83 0l-2.5 2.5a1.998 1.998 0 0 0 0 2.83Z"></path></svg></a></div> <p dir="auto">Open Image Denoise supports environment variables for overriding certain settings at runtime, which can be useful for debugging and development:</p> <markdown-accessiblity-table><table> <thead> <tr> <th align="left">Name</th> <th align="left">Description</th> </tr> </thead> <tbody> <tr> <td align="left"><code>OIDN_DEFAULT_DEVICE</code></td> <td align="left">overrides what physical device to use with <code>OIDN_DEVICE_TYPE_DEFAULT</code>; can be <code>cpu</code>, <code>sycl</code>, <code>cuda</code>, <code>hip</code>, or a physical device ID</td> </tr> <tr> <td align="left"><code>OIDN_DEVICE_CPU</code></td> <td align="left">value of 0 disables CPU device support</td> </tr> <tr> <td align="left"><code>OIDN_DEVICE_SYCL</code></td> <td align="left">value of 0 disables SYCL device support</td> </tr> <tr> <td align="left"><code>OIDN_DEVICE_CUDA</code></td> <td align="left">value of 0 disables CUDA device support</td> </tr> <tr> <td align="left"><code>OIDN_DEVICE_HIP</code></td> <td align="left">value of 0 disables HIP device support</td> </tr> <tr> <td align="left"><code>OIDN_DEVICE_METAL</code></td> <td align="left">value of 0 disables Metal device support</td> </tr> <tr> <td align="left"><code>OIDN_NUM_THREADS</code></td> <td align="left">overrides <code>numThreads</code> device parameter</td> </tr> <tr> <td align="left"><code>OIDN_SET_AFFINITY</code></td> <td align="left">overrides <code>setAffinity</code> device parameter</td> </tr> <tr> <td align="left"><code>OIDN_NUM_SUBDEVICES</code></td> <td align="left">overrides number of SYCL sub-devices to use (e.g. for Intel® Data Center GPU Max Series)</td> </tr> <tr> <td align="left"><code>OIDN_VERBOSE</code></td> <td align="left">overrides <code>verbose</code> device parameter</td> </tr> </tbody> </table></markdown-accessiblity-table> <p dir="auto">Environment variables supported by Open Image Denoise.</p> <div class="markdown-heading" dir="auto"><h2 tabindex="-1" class="heading-element" dir="auto">Buffers</h2><a id="user-content-buffers-1" class="anchor" aria-label="Permalink: Buffers" href="#buffers-1"><svg class="octicon octicon-link" viewBox="0 0 16 16" version="1.1" width="16" height="16" aria-hidden="true"><path d="m7.775 3.275 1.25-1.25a3.5 3.5 0 1 1 4.95 4.95l-2.5 2.5a3.5 3.5 0 0 1-4.95 0 .751.751 0 0 1 .018-1.042.751.751 0 0 1 1.042-.018 1.998 1.998 0 0 0 2.83 0l2.5-2.5a2.002 2.002 0 0 0-2.83-2.83l-1.25 1.25a.751.751 0 0 1-1.042-.018.751.751 0 0 1-.018-1.042Zm-4.69 9.64a1.998 1.998 0 0 0 2.83 0l1.25-1.25a.751.751 0 0 1 1.042.018.751.751 0 0 1 .018 1.042l-1.25 1.25a3.5 3.5 0 1 1-4.95-4.95l2.5-2.5a3.5 3.5 0 0 1 4.95 0 .751.751 0 0 1-.018 1.042.751.751 0 0 1-1.042.018 1.998 1.998 0 0 0-2.83 0l-2.5 2.5a1.998 1.998 0 0 0 0 2.83Z"></path></svg></a></div> <p dir="auto">Image data can be passed to Open Image Denoise either via pointers to memory allocated and managed by the user or by creating buffer objects. Regardless of which method is used, the data must be allocated in a way that it is accessible by the device (either CPU or GPU). Using buffers is typically the preferred approach because this ensures that the allocation requirements are fulfilled regardless of device type. To create a new data buffer with memory allocated and owned by the device, use</p> <div class="highlight highlight-source-c++ notranslate position-relative overflow-auto" dir="auto" data-snippet-clipboard-copy-content="OIDNBuffer oidnNewBuffer(OIDNDevice device, size_t byteSize);"><pre>OIDNBuffer <span class="pl-en">oidnNewBuffer</span>(OIDNDevice device, <span class="pl-c1">size_t</span> byteSize);</pre></div> <p dir="auto">The created buffer is bound to the specified device (<code>device</code> argument). The specified number of bytes (<code>byteSize</code>) are allocated at buffer construction time and deallocated when the buffer is destroyed. The memory is by default allocated as managed memory automatically migrated between host and device, if supported, or as pinned host memory otherwise.</p> <p dir="auto">If this default buffer allocation is not suitable, a buffer can be created with a manually specified storage mode as well:</p> <div class="highlight highlight-source-c++ notranslate position-relative overflow-auto" dir="auto" data-snippet-clipboard-copy-content="OIDNBuffer oidnNewBufferWithStorage(OIDNDevice device, size_t byteSize, OIDNStorage storage);"><pre>OIDNBuffer <span class="pl-en">oidnNewBufferWithStorage</span>(OIDNDevice device, <span class="pl-c1">size_t</span> byteSize, OIDNStorage storage);</pre></div> <p dir="auto">The supported storage modes are the following:</p> <markdown-accessiblity-table><table> <thead> <tr> <th align="left">Name</th> <th align="left">Description</th> </tr> </thead> <tbody> <tr> <td align="left"><code>OIDN_STORAGE_UNDEFINED</code></td> <td align="left">undefined storage mode</td> </tr> <tr> <td align="left"><code>OIDN_STORAGE_HOST</code></td> <td align="left">pinned host memory, accessible by both host and device</td> </tr> <tr> <td align="left"><code>OIDN_STORAGE_DEVICE</code></td> <td align="left">device memory, <em>not</em> accessible by the host</td> </tr> <tr> <td align="left"><code>OIDN_STORAGE_MANAGED</code></td> <td align="left">automatically migrated between host and device, accessible by both (<em>not</em> supported by all devices, <code>managedMemorySupported</code> device parameter must be checked before use)</td> </tr> </tbody> </table></markdown-accessiblity-table> <p dir="auto">Supported storage modes for buffers, i.e., valid constants of type <code>OIDNStorage</code>.</p> <p dir="auto">Note that the host and device storage modes are supported by all devices but managed storage is an optional feature. Before using managed storage, the <code>managedMemorySupported</code> device parameter should be queried.</p> <p dir="auto">It is also possible to create a “shared” data buffer with memory allocated and managed by the user with</p> <div class="highlight highlight-source-c++ notranslate position-relative overflow-auto" dir="auto" data-snippet-clipboard-copy-content="OIDNBuffer oidnNewSharedBuffer(OIDNDevice device, void* devPtr, size_t byteSize);"><pre>OIDNBuffer <span class="pl-en">oidnNewSharedBuffer</span>(OIDNDevice device, <span class="pl-k">void</span>* devPtr, <span class="pl-c1">size_t</span> byteSize);</pre></div> <p dir="auto">where <code>devPtr</code> points to user-managed device-accessible memory and <code>byteSize</code> is its size in bytes. At buffer construction time no buffer data is allocated, but the buffer data provided by the user is used. The buffer data must remain valid for as long as the buffer may be used, and the user is responsible to free the buffer data when no longer required. The user must also ensure that the memory is accessible to the device by using a supported allocation function (e.g., <code>sycl::malloc_device</code>, <code>cudaMalloc</code>, <code>hipMalloc</code>) and alignment (e.g., Metal requires the allocation to be page-aligned).</p> <p dir="auto">Buffers can be also imported from graphics APIs as external memory, to avoid expensive copying of data through host memory. Different types of external memory can be imported from either POSIX file descriptors or Win32 handles using</p> <div class="highlight highlight-source-c++ notranslate position-relative overflow-auto" dir="auto" data-snippet-clipboard-copy-content="OIDNBuffer oidnNewSharedBufferFromFD(OIDNDevice device, OIDNExternalMemoryTypeFlag fdType, int fd, size_t byteSize); OIDNBuffer oidnNewSharedBufferFromWin32Handle(OIDNDevice device, OIDNExternalMemoryTypeFlag handleType, void* handle, const void* name, size_t byteSize);"><pre>OIDNBuffer <span class="pl-en">oidnNewSharedBufferFromFD</span>(OIDNDevice device, OIDNExternalMemoryTypeFlag fdType, <span class="pl-k">int</span> fd, <span class="pl-c1">size_t</span> byteSize); OIDNBuffer <span class="pl-en">oidnNewSharedBufferFromWin32Handle</span>(OIDNDevice device, OIDNExternalMemoryTypeFlag handleType, <span class="pl-k">void</span>* handle, <span class="pl-k">const</span> <span class="pl-k">void</span>* name, <span class="pl-c1">size_t</span> byteSize);</pre></div> <p dir="auto">Before exporting memory from the graphics API, the application should find a handle type which is supported by both the Open Image Denoise device (see <code>externalMemoryTypes</code> device parameter) and the graphics API. Note that different GPU vendors may support different handle types. To ensure compatibility with all device types, applications should support at least <code>OIDN_EXTERNAL_MEMORY_TYPE_FLAG_OPAQUE_FD</code> on Windows and both <code>OIDN_EXTERNAL_MEMORY_TYPE_FLAG_OPAQUE_FD</code> and <code>OIDN_EXTERNAL_MEMORY_TYPE_FLAG_DMA_BUF</code> on Linux. All possible external memory types are listed in the table below.</p> <markdown-accessiblity-table><table> <thead> <tr> <th align="left">Name</th> <th align="left">Description</th> </tr> </thead> <tbody> <tr> <td align="left"><code>OIDN_EXTERNAL_MEMORY_TYPE_FLAG_NONE</code></td> <td align="left"></td> </tr> <tr> <td align="left"><code>OIDN_EXTERNAL_MEMORY_TYPE_FLAG_OPAQUE_FD</code></td> <td align="left">opaque POSIX file descriptor handle (recommended on Linux)</td> </tr> <tr> <td align="left"><code>OIDN_EXTERNAL_MEMORY_TYPE_FLAG_DMA_BUF</code></td> <td align="left">file descriptor handle for a Linux dma_buf (recommended on Linux)</td> </tr> <tr> <td align="left"><code>OIDN_EXTERNAL_MEMORY_TYPE_FLAG_OPAQUE_WIN32</code></td> <td align="left">NT handle (recommended on Windows)</td> </tr> <tr> <td align="left"><code>OIDN_EXTERNAL_MEMORY_TYPE_FLAG_OPAQUE_WIN32_KMT</code></td> <td align="left">global share (KMT) handle</td> </tr> <tr> <td align="left"><code>OIDN_EXTERNAL_MEMORY_TYPE_FLAG_D3D11_TEXTURE</code></td> <td align="left">NT handle returned by <code>IDXGIResource1::CreateSharedHandle</code> referring to a Direct3D 11 texture resource</td> </tr> <tr> <td align="left"><code>OIDN_EXTERNAL_MEMORY_TYPE_FLAG_D3D11_TEXTURE_KMT</code></td> <td align="left">global share (KMT) handle returned by <code>IDXGIResource::GetSharedHandle</code> referring to a Direct3D 11 texture resource</td> </tr> <tr> <td align="left"><code>OIDN_EXTERNAL_MEMORY_TYPE_FLAG_D3D11_RESOURCE</code></td> <td align="left">NT handle returned by <code>IDXGIResource1::CreateSharedHandle</code> referring to a Direct3D 11 resource</td> </tr> <tr> <td align="left"><code>OIDN_EXTERNAL_MEMORY_TYPE_FLAG_D3D11_RESOURCE_KMT</code></td> <td align="left">global share (KMT) handle returned by <code>IDXGIResource::GetSharedHandle</code> referring to a Direct3D 11 resource</td> </tr> <tr> <td align="left"><code>OIDN_EXTERNAL_MEMORY_TYPE_FLAG_D3D12_HEAP</code></td> <td align="left">NT handle returned by <code>ID3D12Device::CreateSharedHandle</code> referring to a Direct3D 12 heap resource</td> </tr> <tr> <td align="left"><code>OIDN_EXTERNAL_MEMORY_TYPE_FLAG_D3D12_RESOURCE</code></td> <td align="left">NT handle returned by <code>ID3D12Device::CreateSharedHandle</code> referring to a Direct3D 12 committed resource</td> </tr> </tbody> </table></markdown-accessiblity-table> <p dir="auto">Supported external memory type flags, i.e., valid constants of type <code>OIDNExternalMemoryTypeFlag</code>.</p> <p dir="auto">Metal buffers can be imported directly with</p> <div class="highlight highlight-source-c++ notranslate position-relative overflow-auto" dir="auto" data-snippet-clipboard-copy-content="OIDNBuffer oidnNewSharedBufferFromMetal(OIDNDevice device, MTLBuffer_id buffer);"><pre>OIDNBuffer <span class="pl-en">oidnNewSharedBufferFromMetal</span>(OIDNDevice device, MTLBuffer_id buffer);</pre></div> <p dir="auto">Note that if a buffer with an <code>MTLStorageModeManaged</code> storage mode is imported, it is the responsibility of the user to synchronize the contents of the buffer between the host and the device.</p> <p dir="auto">Similar to device objects, buffer objects are also reference-counted and can be retained and released by calling the following functions:</p> <div class="highlight highlight-source-c++ notranslate position-relative overflow-auto" dir="auto" data-snippet-clipboard-copy-content="void oidnRetainBuffer (OIDNBuffer buffer); void oidnReleaseBuffer(OIDNBuffer buffer);"><pre><span class="pl-k">void</span> <span class="pl-en">oidnRetainBuffer</span> (OIDNBuffer buffer); <span class="pl-k">void</span> <span class="pl-en">oidnReleaseBuffer</span>(OIDNBuffer buffer);</pre></div> <p dir="auto">The size of in bytes and storage mode of the buffer can be queried using</p> <div class="highlight highlight-source-c++ notranslate position-relative overflow-auto" dir="auto" data-snippet-clipboard-copy-content="size_t oidnGetBufferSize (OIDNBuffer buffer); OIDNStorage oidnGetBufferStorage(OIDNBuffer buffer);"><pre><span class="pl-c1">size_t</span> <span class="pl-en">oidnGetBufferSize</span> (OIDNBuffer buffer); OIDNStorage <span class="pl-en">oidnGetBufferStorage</span>(OIDNBuffer buffer);</pre></div> <p dir="auto">It is possible to get a pointer directly to the buffer data, which is usually the preferred way to access the data stored in the buffer:</p> <div class="highlight highlight-source-c++ notranslate position-relative overflow-auto" dir="auto" data-snippet-clipboard-copy-content="void* oidnGetBufferData(OIDNBuffer buffer);"><pre><span class="pl-k">void</span>* <span class="pl-en">oidnGetBufferData</span>(OIDNBuffer buffer);</pre></div> <p dir="auto">Accessing the data on the host through this pointer is possible <em>only</em> if the buffer was created with <code>OIDN_STORAGE_HOST</code> or <code>OIDN_STORAGE_MANAGED</code>. Note that a <code>NULL</code> pointer may be returned if the buffer is empty.</p> <p dir="auto">In some cases better performance can be achieved by using device storage for buffers. Such data can be accessed on the host by copying to/from host memory (including pageable system memory) using the following functions:</p> <div class="highlight highlight-source-c++ notranslate position-relative overflow-auto" dir="auto" data-snippet-clipboard-copy-content="void oidnReadBuffer(OIDNBuffer buffer, size_t byteOffset, size_t byteSize, void* dstHostPtr); void oidnWriteBuffer(OIDNBuffer buffer, size_t byteOffset, size_t byteSize, const void* srcHostPtr);"><pre><span class="pl-k">void</span> <span class="pl-en">oidnReadBuffer</span>(OIDNBuffer buffer, <span class="pl-c1">size_t</span> byteOffset, <span class="pl-c1">size_t</span> byteSize, <span class="pl-k">void</span>* dstHostPtr); <span class="pl-k">void</span> <span class="pl-en">oidnWriteBuffer</span>(OIDNBuffer buffer, <span class="pl-c1">size_t</span> byteOffset, <span class="pl-c1">size_t</span> byteSize, <span class="pl-k">const</span> <span class="pl-k">void</span>* srcHostPtr);</pre></div> <p dir="auto">These functions will always block until the read/write operation has been completed, which is often suboptimal. The following functions execute these operations asynchronously:</p> <div class="highlight highlight-source-c++ notranslate position-relative overflow-auto" dir="auto" data-snippet-clipboard-copy-content="void oidnReadBufferAsync(OIDNBuffer buffer, size_t byteOffset, size_t byteSize, void* dstHostPtr); void oidnWriteBufferAsync(OIDNBuffer buffer, size_t byteOffset, size_t byteSize, const void* srcHostPtr);"><pre><span class="pl-k">void</span> <span class="pl-en">oidnReadBufferAsync</span>(OIDNBuffer buffer, <span class="pl-c1">size_t</span> byteOffset, <span class="pl-c1">size_t</span> byteSize, <span class="pl-k">void</span>* dstHostPtr); <span class="pl-k">void</span> <span class="pl-en">oidnWriteBufferAsync</span>(OIDNBuffer buffer, <span class="pl-c1">size_t</span> byteOffset, <span class="pl-c1">size_t</span> byteSize, <span class="pl-k">const</span> <span class="pl-k">void</span>* srcHostPtr);</pre></div> <p dir="auto">When copying asynchronously, the user must ensure correct synchronization with the device by calling <code>oidnSyncDevice</code> before accessing the copied data or releasing the buffer. Failure to do so will result in undefined behavior.</p> <div class="markdown-heading" dir="auto"><h3 tabindex="-1" class="heading-element" dir="auto">Data Format</h3><a id="user-content-data-format" class="anchor" aria-label="Permalink: Data Format" href="#data-format"><svg class="octicon octicon-link" viewBox="0 0 16 16" version="1.1" width="16" height="16" aria-hidden="true"><path d="m7.775 3.275 1.25-1.25a3.5 3.5 0 1 1 4.95 4.95l-2.5 2.5a3.5 3.5 0 0 1-4.95 0 .751.751 0 0 1 .018-1.042.751.751 0 0 1 1.042-.018 1.998 1.998 0 0 0 2.83 0l2.5-2.5a2.002 2.002 0 0 0-2.83-2.83l-1.25 1.25a.751.751 0 0 1-1.042-.018.751.751 0 0 1-.018-1.042Zm-4.69 9.64a1.998 1.998 0 0 0 2.83 0l1.25-1.25a.751.751 0 0 1 1.042.018.751.751 0 0 1 .018 1.042l-1.25 1.25a3.5 3.5 0 1 1-4.95-4.95l2.5-2.5a3.5 3.5 0 0 1 4.95 0 .751.751 0 0 1-.018 1.042.751.751 0 0 1-1.042.018 1.998 1.998 0 0 0-2.83 0l-2.5 2.5a1.998 1.998 0 0 0 0 2.83Z"></path></svg></a></div> <p dir="auto">Buffers store opaque data and thus have no information about the type and format of the data. Other objects, e.g. filters, typically require specifying the format of the data stored in buffers or shared via pointers. This can be done using the <code>OIDNFormat</code> enumeration type:</p> <markdown-accessiblity-table><table> <thead> <tr> <th align="left">Name</th> <th align="left">Description</th> </tr> </thead> <tbody> <tr> <td align="left"><code>OIDN_FORMAT_UNDEFINED</code></td> <td align="left">undefined format</td> </tr> <tr> <td align="left"><code>OIDN_FORMAT_FLOAT</code></td> <td align="left">32-bit floating-point scalar</td> </tr> <tr> <td align="left"><code>OIDN_FORMAT_FLOAT[234]</code></td> <td align="left">32-bit floating-point [234]-element vector</td> </tr> <tr> <td align="left"><code>OIDN_FORMAT_HALF</code></td> <td align="left">16-bit floating-point scalar</td> </tr> <tr> <td align="left"><code>OIDN_FORMAT_HALF[234]</code></td> <td align="left">16-bit floating-point [234]-element vector</td> </tr> </tbody> </table></markdown-accessiblity-table> <p dir="auto">Supported data formats, i.e., valid constants of type <code>OIDNFormat</code>.</p> <div class="markdown-heading" dir="auto"><h2 tabindex="-1" class="heading-element" dir="auto">Filters</h2><a id="user-content-filters" class="anchor" aria-label="Permalink: Filters" href="#filters"><svg class="octicon octicon-link" viewBox="0 0 16 16" version="1.1" width="16" height="16" aria-hidden="true"><path d="m7.775 3.275 1.25-1.25a3.5 3.5 0 1 1 4.95 4.95l-2.5 2.5a3.5 3.5 0 0 1-4.95 0 .751.751 0 0 1 .018-1.042.751.751 0 0 1 1.042-.018 1.998 1.998 0 0 0 2.83 0l2.5-2.5a2.002 2.002 0 0 0-2.83-2.83l-1.25 1.25a.751.751 0 0 1-1.042-.018.751.751 0 0 1-.018-1.042Zm-4.69 9.64a1.998 1.998 0 0 0 2.83 0l1.25-1.25a.751.751 0 0 1 1.042.018.751.751 0 0 1 .018 1.042l-1.25 1.25a3.5 3.5 0 1 1-4.95-4.95l2.5-2.5a3.5 3.5 0 0 1 4.95 0 .751.751 0 0 1-.018 1.042.751.751 0 0 1-1.042.018 1.998 1.998 0 0 0-2.83 0l-2.5 2.5a1.998 1.998 0 0 0 0 2.83Z"></path></svg></a></div> <p dir="auto">Filters are the main objects in Open Image Denoise that are responsible for the actual denoising. The library ships with a collection of filters which are optimized for different types of images and use cases. To create a filter object, call</p> <div class="highlight highlight-source-c++ notranslate position-relative overflow-auto" dir="auto" data-snippet-clipboard-copy-content="OIDNFilter oidnNewFilter(OIDNDevice device, const char* type);"><pre>OIDNFilter <span class="pl-en">oidnNewFilter</span>(OIDNDevice device, <span class="pl-k">const</span> <span class="pl-k">char</span>* type);</pre></div> <p dir="auto">where <code>type</code> is the name of the filter type to create. The supported filter types are documented later in this section.</p> <p dir="auto">Creating filter objects can be very expensive, therefore it is <em>strongly</em> recommended to reuse the same filter for denoising as many images as possible, as long as the these images have the same same size, format, and features (i.e., only the memory locations and pixel values may be different). Otherwise (e.g. for images with different resolutions), reusing the same filter would not have any benefits.</p> <p dir="auto">Once created, filter objects can be retained and released with</p> <div class="highlight highlight-source-c++ notranslate position-relative overflow-auto" dir="auto" data-snippet-clipboard-copy-content="void oidnRetainFilter (OIDNFilter filter); void oidnReleaseFilter(OIDNFilter filter);"><pre><span class="pl-k">void</span> <span class="pl-en">oidnRetainFilter</span> (OIDNFilter filter); <span class="pl-k">void</span> <span class="pl-en">oidnReleaseFilter</span>(OIDNFilter filter);</pre></div> <p dir="auto">After creating a filter, it needs to be set up by specifying the input and output images, and potentially setting other parameter values as well.</p> <p dir="auto">To set image parameters of a filter, you can use one of the following functions:</p> <div class="highlight highlight-source-c++ notranslate position-relative overflow-auto" dir="auto" data-snippet-clipboard-copy-content="void oidnSetFilterImage(OIDNFilter filter, const char* name, OIDNBuffer buffer, OIDNFormat format, size_t width, size_t height, size_t byteOffset, size_t pixelByteStride, size_t rowByteStride); void oidnSetSharedFilterImage(OIDNFilter filter, const char* name, void* devPtr, OIDNFormat format, size_t width, size_t height, size_t byteOffset, size_t pixelByteStride, size_t rowByteStride);"><pre><span class="pl-k">void</span> <span class="pl-en">oidnSetFilterImage</span>(OIDNFilter filter, <span class="pl-k">const</span> <span class="pl-k">char</span>* name, OIDNBuffer buffer, OIDNFormat format, <span class="pl-c1">size_t</span> width, <span class="pl-c1">size_t</span> height, <span class="pl-c1">size_t</span> byteOffset, <span class="pl-c1">size_t</span> pixelByteStride, <span class="pl-c1">size_t</span> rowByteStride); <span class="pl-k">void</span> <span class="pl-en">oidnSetSharedFilterImage</span>(OIDNFilter filter, <span class="pl-k">const</span> <span class="pl-k">char</span>* name, <span class="pl-k">void</span>* devPtr, OIDNFormat format, <span class="pl-c1">size_t</span> width, <span class="pl-c1">size_t</span> height, <span class="pl-c1">size_t</span> byteOffset, <span class="pl-c1">size_t</span> pixelByteStride, <span class="pl-c1">size_t</span> rowByteStride);</pre></div> <p dir="auto">It is possible to specify either a data buffer object (<code>buffer</code> argument) with the <code>oidnSetFilterImage</code> function, or directly a pointer to user-managed device-accessible data (<code>devPtr</code> argument) with the <code>oidnSetSharedFilterImage</code> function. Regardless of whether a buffer or a pointer is specified, the data <em>must</em> be accessible to the device. The easiest way to guarantee this regardless of the device type (CPU or GPU) is using buffer objects.</p> <p dir="auto">In both cases, you must also specify the name of the image parameter to set (<code>name</code> argument, e.g. <code>"color"</code>, <code>"output"</code>), the pixel format (<code>format</code> argument), the width and height of the image in number of pixels (<code>width</code> and <code>height</code> arguments), the starting offset of the image data (<code>byteOffset</code> argument), the pixel stride (<code>pixelByteStride</code> argument) and the row stride (<code>rowByteStride</code> argument), in number of bytes.</p> <p dir="auto">If the pixels and/or rows are stored contiguously (tightly packed without any gaps), you can set <code>pixelByteStride</code> and/or <code>rowByteStride</code> to 0 to let the library compute the actual strides automatically, as a convenience.</p> <p dir="auto">Images support only <code>FLOAT</code> and <code>HALF</code> pixel formats with up to 3 channels. Custom image layouts with extra channels (e.g. alpha channel) or other data are supported as well by specifying a non-zero pixel stride. This way, expensive image layout conversion and copying can be avoided but the extra channels will be ignored by the filter. If these channels also need to be denoised, separate filters can be used.</p> <p dir="auto">To unset a previously set image parameter, returning it to a state as if it had not been set, call</p> <div class="highlight highlight-source-c++ notranslate position-relative overflow-auto" dir="auto" data-snippet-clipboard-copy-content="void oidnRemoveFilterImage(OIDNFilter filter, const char* name);"><pre><span class="pl-k">void</span> <span class="pl-en">oidnRemoveFilterImage</span>(OIDNFilter filter, <span class="pl-k">const</span> <span class="pl-k">char</span>* name);</pre></div> <p dir="auto">Some special data used by filters are opaque/untyped (e.g. trained model weights blobs), which can be specified with the <code>oidnSetSharedFilterData</code> function:</p> <div class="highlight highlight-source-c++ notranslate position-relative overflow-auto" dir="auto" data-snippet-clipboard-copy-content="void oidnSetSharedFilterData(OIDNFilter filter, const char* name, void* hostPtr, size_t byteSize);"><pre><span class="pl-k">void</span> <span class="pl-en">oidnSetSharedFilterData</span>(OIDNFilter filter, <span class="pl-k">const</span> <span class="pl-k">char</span>* name, <span class="pl-k">void</span>* hostPtr, <span class="pl-c1">size_t</span> byteSize);</pre></div> <p dir="auto">This data (<code>hostPtr</code>) must be accessible to the <em>host</em>, therefore system memory allocation is suitable (i.e., there is no reason to use buffer objects for allocation).</p> <p dir="auto">Modifying the contents of an opaque data parameter after setting it as a filter parameter is allowed but the filter needs to be notified that the data has been updated by calling</p> <div class="highlight highlight-source-c++ notranslate position-relative overflow-auto" dir="auto" data-snippet-clipboard-copy-content="void oidnUpdateFilterData(OIDNFilter filter, const char* name);"><pre><span class="pl-k">void</span> <span class="pl-en">oidnUpdateFilterData</span>(OIDNFilter filter, <span class="pl-k">const</span> <span class="pl-k">char</span>* name);</pre></div> <p dir="auto">Unsetting an opaque data parameter can be performed with</p> <div class="highlight highlight-source-c++ notranslate position-relative overflow-auto" dir="auto" data-snippet-clipboard-copy-content="void oidnRemoveFilterData(OIDNFilter filter, const char* name);"><pre><span class="pl-k">void</span> <span class="pl-en">oidnRemoveFilterData</span>(OIDNFilter filter, <span class="pl-k">const</span> <span class="pl-k">char</span>* name);</pre></div> <p dir="auto">Filters may have parameters other than buffers as well, which you can set and get using the following functions:</p> <div class="highlight highlight-source-c++ notranslate position-relative overflow-auto" dir="auto" data-snippet-clipboard-copy-content="bool oidnGetFilterBool (OIDNFilter filter, const char* name); void oidnSetFilterBool (OIDNFilter filter, const char* name, bool value); int oidnGetFilterInt (OIDNFilter filter, const char* name); void oidnSetFilterInt (OIDNFilter filter, const char* name, int value); float oidnGetFilterFloat(OIDNFilter filter, const char* name); void oidnSetFilterFloat(OIDNFilter filter, const char* name, float value);"><pre><span class="pl-k">bool</span> <span class="pl-en">oidnGetFilterBool</span> (OIDNFilter filter, <span class="pl-k">const</span> <span class="pl-k">char</span>* name); <span class="pl-k">void</span> <span class="pl-en">oidnSetFilterBool</span> (OIDNFilter filter, <span class="pl-k">const</span> <span class="pl-k">char</span>* name, <span class="pl-k">bool</span> value); <span class="pl-k">int</span> <span class="pl-en">oidnGetFilterInt</span> (OIDNFilter filter, <span class="pl-k">const</span> <span class="pl-k">char</span>* name); <span class="pl-k">void</span> <span class="pl-en">oidnSetFilterInt</span> (OIDNFilter filter, <span class="pl-k">const</span> <span class="pl-k">char</span>* name, <span class="pl-k">int</span> value); <span class="pl-k">float</span> <span class="pl-en">oidnGetFilterFloat</span>(OIDNFilter filter, <span class="pl-k">const</span> <span class="pl-k">char</span>* name); <span class="pl-k">void</span> <span class="pl-en">oidnSetFilterFloat</span>(OIDNFilter filter, <span class="pl-k">const</span> <span class="pl-k">char</span>* name, <span class="pl-k">float</span> value);</pre></div> <p dir="auto">Filters support a progress monitor callback mechanism that can be used to report progress of filter operations and to cancel them as well. Calling <code>oidnSetFilterProgressMonitorFunction</code> registers a progress monitor callback function (<code>func</code> argument) with payload (<code>userPtr</code> argument) for the specified filter (<code>filter</code> argument):</p> <div class="highlight highlight-source-c++ notranslate position-relative overflow-auto" dir="auto" data-snippet-clipboard-copy-content="typedef bool (*OIDNProgressMonitorFunction)(void* userPtr, double n); void oidnSetFilterProgressMonitorFunction(OIDNFilter filter, OIDNProgressMonitorFunction func, void* userPtr);"><pre><span class="pl-k">typedef</span> <span class="pl-en">bool</span> (*OIDNProgressMonitorFunction)(<span class="pl-k">void</span>* userPtr, <span class="pl-k">double</span> n); <span class="pl-k">void</span> <span class="pl-en">oidnSetFilterProgressMonitorFunction</span>(OIDNFilter filter, OIDNProgressMonitorFunction func, <span class="pl-k">void</span>* userPtr);</pre></div> <p dir="auto">Only a single callback function can be registered per filter, and further invocations overwrite the previously set callback function. Passing <code>NULL</code> as function pointer disables the registered callback function. Once registered, Open Image Denoise will invoke the callback function multiple times during filter operations, by passing the payload as set at registration time (<code>userPtr</code> argument), and a <code>double</code> in the range [0, 1] which estimates the progress of the operation (<code>n</code> argument). When returning <code>true</code> from the callback function, Open Image Denoise will continue the filter operation normally. When returning <code>false</code>, the library will attempt to cancel the filter operation as soon as possible, and if that is fulfilled, it will raise an <code>OIDN_ERROR_CANCELLED</code> error. Note that cancellation is not guaranteed.</p> <p dir="auto">Using a progress monitor callback function introduces some overhead, which may be significant on GPU devices, hurting performance. Therefore we strongly recommend progress monitoring only for offline denoising, when denoising an image is expected to take several seconds.</p> <p dir="auto">After setting all necessary parameters for the filter, the changes must be committed by calling</p> <div class="highlight highlight-source-c++ notranslate position-relative overflow-auto" dir="auto" data-snippet-clipboard-copy-content="void oidnCommitFilter(OIDNFilter filter);"><pre><span class="pl-k">void</span> <span class="pl-en">oidnCommitFilter</span>(OIDNFilter filter);</pre></div> <p dir="auto">The parameters can be updated after committing the filter, but it must be re-committed for any new changes to take effect. Committing major changes to the filter (e.g. setting new image parameters, changing the image resolution) can be expensive, and thus should not be done frequently (e.g. per frame).</p> <p dir="auto">Finally, an image can be filtered by executing the filter with</p> <div class="highlight highlight-source-c++ notranslate position-relative overflow-auto" dir="auto" data-snippet-clipboard-copy-content="void oidnExecuteFilter(OIDNFilter filter);"><pre><span class="pl-k">void</span> <span class="pl-en">oidnExecuteFilter</span>(OIDNFilter filter);</pre></div> <p dir="auto">which will read the input image data from the specified buffers and produce the denoised output image.</p> <p dir="auto">This function will always block until the filtering operation has been completed. The following function executes the operation asynchronously:</p> <div class="highlight highlight-source-c++ notranslate position-relative overflow-auto" dir="auto" data-snippet-clipboard-copy-content="void oidnExecuteFilterAsync(OIDNFilter filter);"><pre><span class="pl-k">void</span> <span class="pl-en">oidnExecuteFilterAsync</span>(OIDNFilter filter);</pre></div> <p dir="auto">For filters created on a SYCL device it is also possible to specify dependent SYCL events (<code>depEvents</code> and <code>numDepEvents</code> arguments, may be <code>NULL</code>/0) and get a completion event as well (<code>doneEvent</code> argument, may be <code>NULL</code>):</p> <div class="highlight highlight-source-c++ notranslate position-relative overflow-auto" dir="auto" data-snippet-clipboard-copy-content="void oidnExecuteSYCLFilterAsync(OIDNFilter filter, const sycl::event* depEvents, int numDepEvents, sycl::event* doneEvent);"><pre><span class="pl-k">void</span> <span class="pl-en">oidnExecuteSYCLFilterAsync</span>(OIDNFilter filter, <span class="pl-k">const</span> sycl::event* depEvents, <span class="pl-k">int</span> numDepEvents, sycl::event* doneEvent);</pre></div> <p dir="auto">When filtering asynchronously, the user must ensure correct synchronization with the device by calling <code>oidnSyncDevice</code> before accessing the output image data or releasing the filter. Failure to do so will result in undefined behavior.</p> <p dir="auto">In the following we describe the different filters that are currently implemented in Open Image Denoise.</p> <div class="markdown-heading" dir="auto"><h3 tabindex="-1" class="heading-element" dir="auto">RT</h3><a id="user-content-rt" class="anchor" aria-label="Permalink: RT" href="#rt"><svg class="octicon octicon-link" viewBox="0 0 16 16" version="1.1" width="16" height="16" aria-hidden="true"><path d="m7.775 3.275 1.25-1.25a3.5 3.5 0 1 1 4.95 4.95l-2.5 2.5a3.5 3.5 0 0 1-4.95 0 .751.751 0 0 1 .018-1.042.751.751 0 0 1 1.042-.018 1.998 1.998 0 0 0 2.83 0l2.5-2.5a2.002 2.002 0 0 0-2.83-2.83l-1.25 1.25a.751.751 0 0 1-1.042-.018.751.751 0 0 1-.018-1.042Zm-4.69 9.64a1.998 1.998 0 0 0 2.83 0l1.25-1.25a.751.751 0 0 1 1.042.018.751.751 0 0 1 .018 1.042l-1.25 1.25a3.5 3.5 0 1 1-4.95-4.95l2.5-2.5a3.5 3.5 0 0 1 4.95 0 .751.751 0 0 1-.018 1.042.751.751 0 0 1-1.042.018 1.998 1.998 0 0 0-2.83 0l-2.5 2.5a1.998 1.998 0 0 0 0 2.83Z"></path></svg></a></div> <p dir="auto">The <code>RT</code> (<strong>r</strong>ay <strong>t</strong>racing) filter is a generic ray tracing denoising filter which is suitable for denoising images rendered with Monte Carlo ray tracing methods like unidirectional and bidirectional path tracing. It supports depth of field and motion blur as well, but it is <em>not</em> temporally stable. The filter is based on a convolutional neural network (CNN) and comes with a set of pre-trained models that work well with a wide range of ray tracing based renderers and noise levels.</p> <p dir="auto"><a target="_blank" rel="noopener noreferrer nofollow" href="https://camo.githubusercontent.com/ec5113117dca1ec160636955052f4bb9c6173d75bdd4b9280740d1b3d21f223a/68747470733a2f2f6f70656e696d61676564656e6f6973652e6769746875622e696f2f696d616765732f6d617a64615f347370705f696e7075742e6a7067"><img src="https://camo.githubusercontent.com/ec5113117dca1ec160636955052f4bb9c6173d75bdd4b9280740d1b3d21f223a/68747470733a2f2f6f70656e696d61676564656e6f6973652e6769746875622e696f2f696d616765732f6d617a64615f347370705f696e7075742e6a7067" alt="" data-canonical-src="https://openimagedenoise.github.io/images/mazda_4spp_input.jpg" style="max-width: 100%;"></a> Example noisy beauty image rendered using unidirectional path tracing (4 samples per pixel). <em>Scene by Evermotion.</em></p> <p dir="auto"><a target="_blank" rel="noopener noreferrer nofollow" href="https://camo.githubusercontent.com/c9438a5ea9212119de2784f1b32d75da72c15246a52883c99a10580f2f4dd23e/68747470733a2f2f6f70656e696d61676564656e6f6973652e6769746875622e696f2f696d616765732f6d617a64615f347370705f6f69646e2e6a7067"><img src="https://camo.githubusercontent.com/c9438a5ea9212119de2784f1b32d75da72c15246a52883c99a10580f2f4dd23e/68747470733a2f2f6f70656e696d61676564656e6f6973652e6769746875622e696f2f696d616765732f6d617a64615f347370705f6f69646e2e6a7067" alt="" data-canonical-src="https://openimagedenoise.github.io/images/mazda_4spp_oidn.jpg" style="max-width: 100%;"></a> Example output beauty image denoised using prefiltered auxiliary feature images (albedo and normal) too.</p> <p dir="auto">For denoising <em>beauty</em> images, it accepts either a low dynamic range (LDR) or high dynamic range (HDR) image (<code>color</code>) as the main input image. In addition to this, it also accepts <em>auxiliary feature</em> images, <code>albedo</code> and <code>normal</code>, which are optional inputs that usually improve the denoising quality significantly, preserving more details.</p> <p dir="auto">It is possible to denoise auxiliary images as well, in which case only the respective auxiliary image has to be specified as input, instead of the beauty image. This can be done as a <em>prefiltering</em> step to further improve the quality of the denoised beauty image.</p> <p dir="auto">The <code>RT</code> filter has certain limitations regarding the supported input images. Most notably, it cannot denoise images that were not rendered with ray tracing. Another important limitation is related to anti-aliasing filters. Most renderers use a high-quality pixel reconstruction filter instead of a trivial box filter to minimize aliasing artifacts (e.g. Gaussian, Blackman-Harris). The <code>RT</code> filter does support such pixel filters but only if implemented with importance sampling. Weighted pixel sampling (sometimes called <em>splatting</em>) introduces correlation between neighboring pixels, which causes the denoising to fail (the noise will not be filtered), thus it is not supported.</p> <p dir="auto">The filter can be created by passing <code>"RT"</code> to the <code>oidnNewFilter</code> function as the filter type. The filter supports the parameters listed in the table below. All specified images must have the same dimensions. The output image can be one of the input images (i.e. in-place denoising is supported). See section <a href="#examples">Examples</a> for simple code snippets that demonstrate the usage of the filter.</p> <markdown-accessiblity-table><table> <thead> <tr> <th align="left">Type</th> <th align="left">Name</th> <th align="right">Default</th> <th align="left">Description</th> </tr> </thead> <tbody> <tr> <td align="left"><code>Image</code></td> <td align="left"><code>color</code></td> <td align="right"><em>optional</em></td> <td align="left">input beauty image (1–3 channels, LDR values in [0, 1] or HDR values in [0, +∞), values being interpreted such that, after scaling with the <code>inputScale</code> parameter, a value of 1 corresponds to a luminance level of 100 cd/m²)</td> </tr> <tr> <td align="left"><code>Image</code></td> <td align="left"><code>albedo</code></td> <td align="right"><em>optional</em></td> <td align="left">input auxiliary image containing the albedo per pixel (1–3 channels, values in [0, 1])</td> </tr> <tr> <td align="left"><code>Image</code></td> <td align="left"><code>normal</code></td> <td align="right"><em>optional</em></td> <td align="left">input auxiliary image containing the shading normal per pixel (1–3 channels, world-space or view-space vectors with arbitrary length, values in [-1, 1])</td> </tr> <tr> <td align="left"><code>Image</code></td> <td align="left"><code>output</code></td> <td align="right"><em>required</em></td> <td align="left">output image (1–3 channels); can be one of the input images</td> </tr> <tr> <td align="left"><code>Bool</code></td> <td align="left"><code>hdr</code></td> <td align="right"><code>false</code></td> <td align="left">the main input image is HDR</td> </tr> <tr> <td align="left"><code>Bool</code></td> <td align="left"><code>srgb</code></td> <td align="right"><code>false</code></td> <td align="left">the main input image is encoded with the sRGB (or 2.2 gamma) curve (LDR only) or is linear; the output will be encoded with the same curve</td> </tr> <tr> <td align="left"><code>Float</code></td> <td align="left"><code>inputScale</code></td> <td align="right">NaN</td> <td align="left">scales values in the main input image before filtering, without scaling the output too, which can be used to map color or auxiliary feature values to the expected range, e.g. for mapping HDR values to physical units (which affects the quality of the output but <em>not</em> the range of the output values); if set to NaN, the scale is computed implicitly for HDR images or set to 1 otherwise</td> </tr> <tr> <td align="left"><code>Bool</code></td> <td align="left"><code>cleanAux</code></td> <td align="right"><code>false</code></td> <td align="left">the auxiliary feature (albedo, normal) images are noise-free; recommended for highest quality but should <em>not</em> be enabled for noisy auxiliary images to avoid residual noise</td> </tr> <tr> <td align="left"><code>Int</code></td> <td align="left"><code>quality</code></td> <td align="right">high</td> <td align="left">image quality mode as an <code>OIDNQuality</code> value</td> </tr> <tr> <td align="left"><code>Data</code></td> <td align="left"><code>weights</code></td> <td align="right"><em>optional</em></td> <td align="left">trained model weights blob</td> </tr> <tr> <td align="left"><code>Int</code></td> <td align="left"><code>maxMemoryMB</code></td> <td align="right">-1</td> <td align="left">if set to >= 0, a request is made to limit the memory usage below the specified amount in megabytes at the potential cost of slower performance, but actual memory usage may be higher (the target may not be achievable or there may be additional allocations beyond the control of the library); otherwise, memory usage will be limited to an unspecified device-dependent amount; in both cases, filters on the same device share almost all of their allocated memory to minimize total memory usage</td> </tr> <tr> <td align="left"><code>Int</code></td> <td align="left"><code>tileAlignment</code></td> <td align="right"><em>constant</em></td> <td align="left">when manually denoising in tiles, the tile size and offsets should be multiples of this amount of pixels to avoid artifacts; when denoising HDR images <code>inputScale</code> <em>must</em> be set by the user to avoid seam artifacts</td> </tr> <tr> <td align="left"><code>Int</code></td> <td align="left"><code>tileOverlap</code></td> <td align="right"><em>constant</em></td> <td align="left">when manually denoising in tiles, the tiles should overlap by this amount of pixels</td> </tr> </tbody> </table></markdown-accessiblity-table> <p dir="auto">Parameters supported by the <code>RT</code> filter.</p> <p dir="auto">Using auxiliary feature images like albedo and normal helps preserving fine details and textures in the image thus can significantly improve denoising quality. These images should typically contain feature values for the first hit (i.e. the surface which is directly visible) per pixel. This works well for most surfaces but does not provide any benefits for reflections and objects visible through transparent surfaces (compared to just using the color as input). However, this issue can be usually fixed by storing feature values for a subsequent hit (i.e. the reflection and/or refraction) instead of the first hit. For example, it usually works well to follow perfect specular (<em>delta</em>) paths and store features for the first diffuse or glossy surface hit instead (e.g. for perfect specular dielectrics and mirrors). This can greatly improve the quality of reflections and transmission. We will describe this approach in more detail in the following subsections.</p> <p dir="auto">The auxiliary feature images should be as noise-free as possible. It is not a strict requirement but too much noise in the feature images may cause residual noise in the output. Ideally, these should be completely noise-free. If this is the case, this should be hinted to the filter using the <code>cleanAux</code> parameter to ensure the highest possible image quality. But this parameter should be used with care: if enabled, any noise present in the auxiliary images will end up in the denoised image as well, as residual noise. Thus, <code>cleanAux</code> should be enabled only if the auxiliary images are guaranteed to be noise-free.</p> <p dir="auto">Usually it is difficult to provide clean feature images, and some residual noise might be present in the output even with <code>cleanAux</code> being disabled. To eliminate this noise and to even improve the sharpness of texture details, the auxiliary images should be first denoised in a prefiltering step, as mentioned earlier. Then, these denoised auxiliary images could be used for denoising the beauty image. Since these are now noise-free, the <code>cleanAux</code> parameter should be enabled. See section <a href="#denoising-with-prefiltering-c11-api">Denoising with prefiltering (C++11 API)</a> for a simple code example. Prefiltering makes denoising much more expensive but if there are multiple color AOVs to denoise, the prefiltered auxiliary images can be reused for denoising multiple AOVs, amortizing the cost of the prefiltering step.</p> <p dir="auto">Thus, for final-frame denoising, where the best possible image quality is required, it is recommended to prefilter the auxiliary features if they are noisy and enable the <code>cleanAux</code> parameter. Denoising with noisy auxiliary features should be reserved for previews and interactive rendering.</p> <p dir="auto">All auxiliary images should use the same pixel reconstruction filter as the beauty image. Using a properly anti-aliased beauty image but aliased albedo or normal images will likely introduce artifacts around edges.</p> <div class="markdown-heading" dir="auto"><h4 tabindex="-1" class="heading-element" dir="auto">Albedos</h4><a id="user-content-albedos" class="anchor" aria-label="Permalink: Albedos" href="#albedos"><svg class="octicon octicon-link" viewBox="0 0 16 16" version="1.1" width="16" height="16" aria-hidden="true"><path d="m7.775 3.275 1.25-1.25a3.5 3.5 0 1 1 4.95 4.95l-2.5 2.5a3.5 3.5 0 0 1-4.95 0 .751.751 0 0 1 .018-1.042.751.751 0 0 1 1.042-.018 1.998 1.998 0 0 0 2.83 0l2.5-2.5a2.002 2.002 0 0 0-2.83-2.83l-1.25 1.25a.751.751 0 0 1-1.042-.018.751.751 0 0 1-.018-1.042Zm-4.69 9.64a1.998 1.998 0 0 0 2.83 0l1.25-1.25a.751.751 0 0 1 1.042.018.751.751 0 0 1 .018 1.042l-1.25 1.25a3.5 3.5 0 1 1-4.95-4.95l2.5-2.5a3.5 3.5 0 0 1 4.95 0 .751.751 0 0 1-.018 1.042.751.751 0 0 1-1.042.018 1.998 1.998 0 0 0-2.83 0l-2.5 2.5a1.998 1.998 0 0 0 0 2.83Z"></path></svg></a></div> <p dir="auto">The albedo image is the feature image that usually provides the biggest quality improvement. It should contain the approximate color of the surfaces independent of illumination and viewing angle.</p> <p dir="auto"><a target="_blank" rel="noopener noreferrer nofollow" href="https://camo.githubusercontent.com/ad1ffa480911274ec2a463587ab074b3f7c25fd2d82c14adf93d43029859b623/68747470733a2f2f6f70656e696d61676564656e6f6973652e6769746875622e696f2f696d616765732f6d617a64615f66697273746869745f3531327370705f616c6265646f2e6a7067"><img src="https://camo.githubusercontent.com/ad1ffa480911274ec2a463587ab074b3f7c25fd2d82c14adf93d43029859b623/68747470733a2f2f6f70656e696d61676564656e6f6973652e6769746875622e696f2f696d616765732f6d617a64615f66697273746869745f3531327370705f616c6265646f2e6a7067" alt="" data-canonical-src="https://openimagedenoise.github.io/images/mazda_firsthit_512spp_albedo.jpg" style="max-width: 100%;"></a> Example albedo image obtained using the first hit. Note that the albedos of all transparent surfaces are 1.</p> <p dir="auto"><a target="_blank" rel="noopener noreferrer nofollow" href="https://camo.githubusercontent.com/9220e70484a2e0b91f6c7ffea2d5326781bf59a1df73cf296df1425a0e9bba38/68747470733a2f2f6f70656e696d61676564656e6f6973652e6769746875622e696f2f696d616765732f6d617a64615f6e6f6e64656c74616869745f3531327370705f616c6265646f2e6a7067"><img src="https://camo.githubusercontent.com/9220e70484a2e0b91f6c7ffea2d5326781bf59a1df73cf296df1425a0e9bba38/68747470733a2f2f6f70656e696d61676564656e6f6973652e6769746875622e696f2f696d616765732f6d617a64615f6e6f6e64656c74616869745f3531327370705f616c6265646f2e6a7067" alt="" data-canonical-src="https://openimagedenoise.github.io/images/mazda_nondeltahit_512spp_albedo.jpg" style="max-width: 100%;"></a> Example albedo image obtained using the first diffuse or glossy (non-delta) hit. Note that the albedos of perfect specular (delta) transparent surfaces are computed as the Fresnel blend of the reflected and transmitted albedos.</p> <p dir="auto">For simple matte surfaces this means using the diffuse color/texture as the albedo. For other, more complex surfaces it is not always obvious what is the best way to compute the albedo, but the denoising filter is flexible to a certain extent and works well with differently computed albedos. Thus it is not necessary to compute the strict, exact albedo values but must be always between 0 and 1.</p> <p dir="auto">For metallic surfaces the albedo should be either the reflectivity at normal incidence (e.g. from the artist friendly metallic Fresnel model) or the average reflectivity; or if these are constant (not textured) or unknown, the albedo can be simply 1 as well.</p> <p dir="auto">The albedo for dielectric surfaces (e.g. glass) should be either 1 or, if the surface is perfect specular (i.e. has a delta BSDF), the Fresnel blend of the reflected and transmitted albedos. The latter usually works better but only if it does not introduce too much noise or the albedo is prefiltered. If noise is an issue, we recommend to split the path into a reflected and a transmitted path at the first hit, and perhaps fall back to an albedo of 1 for subsequent dielectric hits. The reflected albedo in itself can be used for mirror-like surfaces as well.</p> <p dir="auto">The albedo for layered surfaces can be computed as the weighted sum of the albedos of the individual layers. Non-absorbing clear coat layers can be simply ignored (or the albedo of the perfect specular reflection can be used as well) but absorption should be taken into account.</p> <div class="markdown-heading" dir="auto"><h4 tabindex="-1" class="heading-element" dir="auto">Normals</h4><a id="user-content-normals" class="anchor" aria-label="Permalink: Normals" href="#normals"><svg class="octicon octicon-link" viewBox="0 0 16 16" version="1.1" width="16" height="16" aria-hidden="true"><path d="m7.775 3.275 1.25-1.25a3.5 3.5 0 1 1 4.95 4.95l-2.5 2.5a3.5 3.5 0 0 1-4.95 0 .751.751 0 0 1 .018-1.042.751.751 0 0 1 1.042-.018 1.998 1.998 0 0 0 2.83 0l2.5-2.5a2.002 2.002 0 0 0-2.83-2.83l-1.25 1.25a.751.751 0 0 1-1.042-.018.751.751 0 0 1-.018-1.042Zm-4.69 9.64a1.998 1.998 0 0 0 2.83 0l1.25-1.25a.751.751 0 0 1 1.042.018.751.751 0 0 1 .018 1.042l-1.25 1.25a3.5 3.5 0 1 1-4.95-4.95l2.5-2.5a3.5 3.5 0 0 1 4.95 0 .751.751 0 0 1-.018 1.042.751.751 0 0 1-1.042.018 1.998 1.998 0 0 0-2.83 0l-2.5 2.5a1.998 1.998 0 0 0 0 2.83Z"></path></svg></a></div> <p dir="auto">The normal image should contain the shading normals of the surfaces either in world-space or view-space. It is recommended to include normal maps to preserve as much detail as possible.</p> <p dir="auto"><a target="_blank" rel="noopener noreferrer nofollow" href="https://camo.githubusercontent.com/4b24ee03052a87fa8133a93218029f2baf78e9f6dd34c2b8713e43857a875e59/68747470733a2f2f6f70656e696d61676564656e6f6973652e6769746875622e696f2f696d616765732f6d617a64615f66697273746869745f3531327370705f6e6f726d616c2e6a7067"><img src="https://camo.githubusercontent.com/4b24ee03052a87fa8133a93218029f2baf78e9f6dd34c2b8713e43857a875e59/68747470733a2f2f6f70656e696d61676564656e6f6973652e6769746875622e696f2f696d616765732f6d617a64615f66697273746869745f3531327370705f6e6f726d616c2e6a7067" alt="" data-canonical-src="https://openimagedenoise.github.io/images/mazda_firsthit_512spp_normal.jpg" style="max-width: 100%;"></a> Example normal image obtained using the first hit (the values are actually in [−1, 1] but were mapped to [0, 1] for illustration purposes).</p> <p dir="auto"><a target="_blank" rel="noopener noreferrer nofollow" href="https://camo.githubusercontent.com/9f6ea3c920a82ff058d2f4e0065c5ac2507bb093f8a92f9bcfb9887159835850/68747470733a2f2f6f70656e696d61676564656e6f6973652e6769746875622e696f2f696d616765732f6d617a64615f6e6f6e64656c74616869745f3531327370705f6e6f726d616c2e6a7067"><img src="https://camo.githubusercontent.com/9f6ea3c920a82ff058d2f4e0065c5ac2507bb093f8a92f9bcfb9887159835850/68747470733a2f2f6f70656e696d61676564656e6f6973652e6769746875622e696f2f696d616765732f6d617a64615f6e6f6e64656c74616869745f3531327370705f6e6f726d616c2e6a7067" alt="" data-canonical-src="https://openimagedenoise.github.io/images/mazda_nondeltahit_512spp_normal.jpg" style="max-width: 100%;"></a> Example normal image obtained using the first diffuse or glossy (non-delta) hit. Note that the normals of perfect specular (delta) transparent surfaces are computed as the Fresnel blend of the reflected and transmitted normals.</p> <p dir="auto">Just like any other input image, the normal image should be anti-aliased (i.e. by accumulating the normalized normals per pixel). The final accumulated normals do not have to be normalized but must be in the [-1, 1] range (i.e. normals mapped to [0, 1] are <em>not</em> acceptable and must be remapped to [−1, 1]).</p> <p dir="auto">Similar to the albedo, the normal can be stored for either the first or a subsequent hit (if the first hit has a perfect specular/delta BSDF).</p> <div class="markdown-heading" dir="auto"><h4 tabindex="-1" class="heading-element" dir="auto">Quality</h4><a id="user-content-quality" class="anchor" aria-label="Permalink: Quality" href="#quality"><svg class="octicon octicon-link" viewBox="0 0 16 16" version="1.1" width="16" height="16" aria-hidden="true"><path d="m7.775 3.275 1.25-1.25a3.5 3.5 0 1 1 4.95 4.95l-2.5 2.5a3.5 3.5 0 0 1-4.95 0 .751.751 0 0 1 .018-1.042.751.751 0 0 1 1.042-.018 1.998 1.998 0 0 0 2.83 0l2.5-2.5a2.002 2.002 0 0 0-2.83-2.83l-1.25 1.25a.751.751 0 0 1-1.042-.018.751.751 0 0 1-.018-1.042Zm-4.69 9.64a1.998 1.998 0 0 0 2.83 0l1.25-1.25a.751.751 0 0 1 1.042.018.751.751 0 0 1 .018 1.042l-1.25 1.25a3.5 3.5 0 1 1-4.95-4.95l2.5-2.5a3.5 3.5 0 0 1 4.95 0 .751.751 0 0 1-.018 1.042.751.751 0 0 1-1.042.018 1.998 1.998 0 0 0-2.83 0l-2.5 2.5a1.998 1.998 0 0 0 0 2.83Z"></path></svg></a></div> <p dir="auto">The filter supports setting an image quality mode, which determines whether to favor quality, performance, or have a balanced solution between the two. The supported quality modes are listed in the following table.</p> <markdown-accessiblity-table><table> <thead> <tr> <th align="left">Name</th> <th align="left">Description</th> </tr> </thead> <tbody> <tr> <td align="left"><code>OIDN_QUALITY_DEFAULT</code></td> <td align="left">default quality</td> </tr> <tr> <td align="left"><code>OIDN_QUALITY_FAST</code></td> <td align="left">high performance (for interactive/real-time preview rendering)</td> </tr> <tr> <td align="left"><code>OIDN_QUALITY_BALANCED</code></td> <td align="left">balanced quality/performance (for interactive/real-time rendering)</td> </tr> <tr> <td align="left"><code>OIDN_QUALITY_HIGH</code></td> <td align="left">high quality (for final-frame rendering); <em>default</em></td> </tr> </tbody> </table></markdown-accessiblity-table> <p dir="auto">Supported image quality modes, i.e., valid constants of type <code>OIDNQuality</code>.</p> <p dir="auto">By default, filtering is performed in <em>high</em> quality mode, which is recommended for final-frame rendering. Using this setting the results have the same high quality regardless of what kind of device (CPU or GPU) is used. However, due to significant hardware architecture differences between devices, there might be small numerical differences between the produced outputs.</p> <p dir="auto">The <em>balanced</em> quality mode may provide somewhat lower image quality but higher performance and lower default memory usage, and is thus recommended for interactive and real-time rendering. For even higher performance and lower memory usage, a <em>fast</em> quality mode is also available but has noticeably lower image quality, making it suitable mainly for fast previews. Note that in the <em>balanced</em> and <em>fast</em> quality modes larger numerical differences should be expected across devices compared to the <em>high</em> quality mode.</p> <p dir="auto">The difference in quality and performance between quality modes depends on the combination of input features, parameters (e.g. <code>cleanAux</code>), and the device architecture. In some cases the difference may be small or even none.</p> <div class="markdown-heading" dir="auto"><h4 tabindex="-1" class="heading-element" dir="auto">Weights</h4><a id="user-content-weights" class="anchor" aria-label="Permalink: Weights" href="#weights"><svg class="octicon octicon-link" viewBox="0 0 16 16" version="1.1" width="16" height="16" aria-hidden="true"><path d="m7.775 3.275 1.25-1.25a3.5 3.5 0 1 1 4.95 4.95l-2.5 2.5a3.5 3.5 0 0 1-4.95 0 .751.751 0 0 1 .018-1.042.751.751 0 0 1 1.042-.018 1.998 1.998 0 0 0 2.83 0l2.5-2.5a2.002 2.002 0 0 0-2.83-2.83l-1.25 1.25a.751.751 0 0 1-1.042-.018.751.751 0 0 1-.018-1.042Zm-4.69 9.64a1.998 1.998 0 0 0 2.83 0l1.25-1.25a.751.751 0 0 1 1.042.018.751.751 0 0 1 .018 1.042l-1.25 1.25a3.5 3.5 0 1 1-4.95-4.95l2.5-2.5a3.5 3.5 0 0 1 4.95 0 .751.751 0 0 1-.018 1.042.751.751 0 0 1-1.042.018 1.998 1.998 0 0 0-2.83 0l-2.5 2.5a1.998 1.998 0 0 0 0 2.83Z"></path></svg></a></div> <p dir="auto">Instead of using the built-in trained models for filtering, it is also possible to specify user-trained models at runtime. This can be achieved by passing the model <em>weights</em> blob corresponding to the specified set of features and other filter parameters, produced by the included training tool. See Section <a href="#training">Training</a> for details.</p> <div class="markdown-heading" dir="auto"><h3 tabindex="-1" class="heading-element" dir="auto">RTLightmap</h3><a id="user-content-rtlightmap" class="anchor" aria-label="Permalink: RTLightmap" href="#rtlightmap"><svg class="octicon octicon-link" viewBox="0 0 16 16" version="1.1" width="16" height="16" aria-hidden="true"><path d="m7.775 3.275 1.25-1.25a3.5 3.5 0 1 1 4.95 4.95l-2.5 2.5a3.5 3.5 0 0 1-4.95 0 .751.751 0 0 1 .018-1.042.751.751 0 0 1 1.042-.018 1.998 1.998 0 0 0 2.83 0l2.5-2.5a2.002 2.002 0 0 0-2.83-2.83l-1.25 1.25a.751.751 0 0 1-1.042-.018.751.751 0 0 1-.018-1.042Zm-4.69 9.64a1.998 1.998 0 0 0 2.83 0l1.25-1.25a.751.751 0 0 1 1.042.018.751.751 0 0 1 .018 1.042l-1.25 1.25a3.5 3.5 0 1 1-4.95-4.95l2.5-2.5a3.5 3.5 0 0 1 4.95 0 .751.751 0 0 1-.018 1.042.751.751 0 0 1-1.042.018 1.998 1.998 0 0 0-2.83 0l-2.5 2.5a1.998 1.998 0 0 0 0 2.83Z"></path></svg></a></div> <p dir="auto">The <code>RTLightmap</code> filter is a variant of the <code>RT</code> filter optimized for denoising HDR and normalized directional (e.g. spherical harmonics) lightmaps. It does not support LDR images.</p> <p dir="auto">The filter can be created by passing <code>"RTLightmap"</code> to the <code>oidnNewFilter</code> function as the filter type. The filter supports the following parameters:</p> <markdown-accessiblity-table><table> <thead> <tr> <th align="left">Type</th> <th align="left">Name</th> <th align="right">Default</th> <th align="left">Description</th> </tr> </thead> <tbody> <tr> <td align="left"><code>Image</code></td> <td align="left"><code>color</code></td> <td align="right"><em>required</em></td> <td align="left">input beauty image (1–3 channels, HDR values in [0, +∞), interpreted such that, after scaling with the <code>inputScale</code> parameter, a value of 1 corresponds to a luminance level of 100 cd/m²; directional values in [-1, 1])</td> </tr> <tr> <td align="left"><code>Image</code></td> <td align="left"><code>output</code></td> <td align="right"><em>required</em></td> <td align="left">output image (1–3 channels); can be one of the input images</td> </tr> <tr> <td align="left"><code>Bool</code></td> <td align="left"><code>directional</code></td> <td align="right"><code>false</code></td> <td align="left">whether the input contains normalized coefficients (in [-1, 1]) of a directional lightmap (e.g. normalized L1 or higher spherical harmonics band with the L0 band divided out); if the range of the coefficients is different from [-1, 1], the <code>inputScale</code> parameter can be used to adjust the range without changing the stored values</td> </tr> <tr> <td align="left"><code>Float</code></td> <td align="left"><code>inputScale</code></td> <td align="right">NaN</td> <td align="left">scales input color values before filtering, without scaling the output too, which can be used to map color values to the expected range, e.g. for mapping HDR values to physical units (which affects the quality of the output but <em>not</em> the range of the output values); if set to NaN, the scale is computed implicitly for HDR images or set to 1 otherwise</td> </tr> <tr> <td align="left"><code>Int</code></td> <td align="left"><code>quality</code></td> <td align="right">high</td> <td align="left">image quality mode as an <code>OIDNQuality</code> value</td> </tr> <tr> <td align="left"><code>Data</code></td> <td align="left"><code>weights</code></td> <td align="right"><em>optional</em></td> <td align="left">trained model weights blob</td> </tr> <tr> <td align="left"><code>Int</code></td> <td align="left"><code>maxMemoryMB</code></td> <td align="right">-1</td> <td align="left">if set to >= 0, a request is made to limit the memory usage below the specified amount in megabytes at the potential cost of slower performance, but actual memory usage may be higher (the target may not be achievable or there may be additional allocations beyond the control of the library); otherwise, memory usage will be limited to an unspecified device-dependent amount; in both cases, filters on the same device share almost all of their allocated memory to minimize total memory usage</td> </tr> <tr> <td align="left"><code>Int</code></td> <td align="left"><code>tileAlignment</code></td> <td align="right"><em>constant</em></td> <td align="left">when manually denoising in tiles, the tile size and offsets should be multiples of this amount of pixels to avoid artifacts; when denoising HDR images <code>inputScale</code> <em>must</em> be set by the user to avoid seam artifacts</td> </tr> <tr> <td align="left"><code>Int</code></td> <td align="left"><code>tileOverlap</code></td> <td align="right"><em>constant</em></td> <td align="left">when manually denoising in tiles, the tiles should overlap by this amount of pixels</td> </tr> </tbody> </table></markdown-accessiblity-table> <p dir="auto">Parameters supported by the <code>RTLightmap</code> filter.</p> <div class="markdown-heading" dir="auto"><h1 tabindex="-1" class="heading-element" dir="auto">Examples</h1><a id="user-content-examples-1" class="anchor" aria-label="Permalink: Examples" href="#examples-1"><svg class="octicon octicon-link" viewBox="0 0 16 16" version="1.1" width="16" height="16" aria-hidden="true"><path d="m7.775 3.275 1.25-1.25a3.5 3.5 0 1 1 4.95 4.95l-2.5 2.5a3.5 3.5 0 0 1-4.95 0 .751.751 0 0 1 .018-1.042.751.751 0 0 1 1.042-.018 1.998 1.998 0 0 0 2.83 0l2.5-2.5a2.002 2.002 0 0 0-2.83-2.83l-1.25 1.25a.751.751 0 0 1-1.042-.018.751.751 0 0 1-.018-1.042Zm-4.69 9.64a1.998 1.998 0 0 0 2.83 0l1.25-1.25a.751.751 0 0 1 1.042.018.751.751 0 0 1 .018 1.042l-1.25 1.25a3.5 3.5 0 1 1-4.95-4.95l2.5-2.5a3.5 3.5 0 0 1 4.95 0 .751.751 0 0 1-.018 1.042.751.751 0 0 1-1.042.018 1.998 1.998 0 0 0-2.83 0l-2.5 2.5a1.998 1.998 0 0 0 0 2.83Z"></path></svg></a></div> <p dir="auto">Intel Open Image Denoise ships with a couple of simple example applications.</p> <div class="markdown-heading" dir="auto"><h2 tabindex="-1" class="heading-element" dir="auto">oidnDenoise</h2><a id="user-content-oidndenoise" class="anchor" aria-label="Permalink: oidnDenoise" href="#oidndenoise"><svg class="octicon octicon-link" viewBox="0 0 16 16" version="1.1" width="16" height="16" aria-hidden="true"><path d="m7.775 3.275 1.25-1.25a3.5 3.5 0 1 1 4.95 4.95l-2.5 2.5a3.5 3.5 0 0 1-4.95 0 .751.751 0 0 1 .018-1.042.751.751 0 0 1 1.042-.018 1.998 1.998 0 0 0 2.83 0l2.5-2.5a2.002 2.002 0 0 0-2.83-2.83l-1.25 1.25a.751.751 0 0 1-1.042-.018.751.751 0 0 1-.018-1.042Zm-4.69 9.64a1.998 1.998 0 0 0 2.83 0l1.25-1.25a.751.751 0 0 1 1.042.018.751.751 0 0 1 .018 1.042l-1.25 1.25a3.5 3.5 0 1 1-4.95-4.95l2.5-2.5a3.5 3.5 0 0 1 4.95 0 .751.751 0 0 1-.018 1.042.751.751 0 0 1-1.042.018 1.998 1.998 0 0 0-2.83 0l-2.5 2.5a1.998 1.998 0 0 0 0 2.83Z"></path></svg></a></div> <p dir="auto"><code>oidnDenoise</code> is a minimal working example demonstrating how to use Intel Open Image Denoise, which can be found at <code>apps/oidnDenoise.cpp</code>. It uses the C++11 convenience wrappers of the C99 API.</p> <p dir="auto">This example is a simple command-line application that denoises the provided image, which can optionally have auxiliary feature images as well (e.g. albedo and normal). By default the images must be stored in the <a href="http://www.pauldebevec.com/Research/HDR/PFM/" rel="nofollow">Portable FloatMap</a> (PFM) format, and the color values must be encoded in little-endian format. To enable other image formats (e.g. OpenEXR, PNG) as well, the project has to be rebuilt with OpenImageIO support enabled.</p> <p dir="auto">Running <code>oidnDenoise</code> without any arguments or the <code>-h</code> argument will bring up a list of command-line options.</p> <div class="markdown-heading" dir="auto"><h2 tabindex="-1" class="heading-element" dir="auto">oidnBenchmark</h2><a id="user-content-oidnbenchmark" class="anchor" aria-label="Permalink: oidnBenchmark" href="#oidnbenchmark"><svg class="octicon octicon-link" viewBox="0 0 16 16" version="1.1" width="16" height="16" aria-hidden="true"><path d="m7.775 3.275 1.25-1.25a3.5 3.5 0 1 1 4.95 4.95l-2.5 2.5a3.5 3.5 0 0 1-4.95 0 .751.751 0 0 1 .018-1.042.751.751 0 0 1 1.042-.018 1.998 1.998 0 0 0 2.83 0l2.5-2.5a2.002 2.002 0 0 0-2.83-2.83l-1.25 1.25a.751.751 0 0 1-1.042-.018.751.751 0 0 1-.018-1.042Zm-4.69 9.64a1.998 1.998 0 0 0 2.83 0l1.25-1.25a.751.751 0 0 1 1.042.018.751.751 0 0 1 .018 1.042l-1.25 1.25a3.5 3.5 0 1 1-4.95-4.95l2.5-2.5a3.5 3.5 0 0 1 4.95 0 .751.751 0 0 1-.018 1.042.751.751 0 0 1-1.042.018 1.998 1.998 0 0 0-2.83 0l-2.5 2.5a1.998 1.998 0 0 0 0 2.83Z"></path></svg></a></div> <p dir="auto"><code>oidnBenchmark</code> is a basic command-line benchmarking application for measuring denoising speed, which can be found at <code>apps/oidnBenchmark.cpp</code>.</p> <p dir="auto">Running <code>oidnBenchmark</code> with the <code>-h</code> argument will bring up a list of command-line options.</p> <div class="markdown-heading" dir="auto"><h1 tabindex="-1" class="heading-element" dir="auto">Training</h1><a id="user-content-training" class="anchor" aria-label="Permalink: Training" href="#training"><svg class="octicon octicon-link" viewBox="0 0 16 16" version="1.1" width="16" height="16" aria-hidden="true"><path d="m7.775 3.275 1.25-1.25a3.5 3.5 0 1 1 4.95 4.95l-2.5 2.5a3.5 3.5 0 0 1-4.95 0 .751.751 0 0 1 .018-1.042.751.751 0 0 1 1.042-.018 1.998 1.998 0 0 0 2.83 0l2.5-2.5a2.002 2.002 0 0 0-2.83-2.83l-1.25 1.25a.751.751 0 0 1-1.042-.018.751.751 0 0 1-.018-1.042Zm-4.69 9.64a1.998 1.998 0 0 0 2.83 0l1.25-1.25a.751.751 0 0 1 1.042.018.751.751 0 0 1 .018 1.042l-1.25 1.25a3.5 3.5 0 1 1-4.95-4.95l2.5-2.5a3.5 3.5 0 0 1 4.95 0 .751.751 0 0 1-.018 1.042.751.751 0 0 1-1.042.018 1.998 1.998 0 0 0-2.83 0l-2.5 2.5a1.998 1.998 0 0 0 0 2.83Z"></path></svg></a></div> <p dir="auto">The Intel Open Image Denoise source distribution includes a Python-based neural network training toolkit (located in the <code>training</code> directory), which can be used to train the denoising filter models with image datasets provided by the user. This is an advanced feature of the library which usage requires some background knowledge of machine learning and basic familiarity with deep learning frameworks and toolkits (e.g. PyTorch or TensorFlow, TensorBoard).</p> <p dir="auto">The training toolkit consists of the following command-line scripts:</p> <ul dir="auto"> <li> <p dir="auto"><code>preprocess.py</code>: Preprocesses training and validation datasets.</p> </li> <li> <p dir="auto"><code>train.py</code>: Trains a model using preprocessed datasets.</p> </li> <li> <p dir="auto"><code>infer.py</code>: Performs inference on a dataset using the specified training result.</p> </li> <li> <p dir="auto"><code>export.py</code>: Exports a training result to the runtime model weights format.</p> </li> <li> <p dir="auto"><code>find_lr.py</code>: Tool for finding the optimal minimum and maximum learning rates.</p> </li> <li> <p dir="auto"><code>visualize.py</code>: Invokes TensorBoard for visualizing statistics of a training result.</p> </li> <li> <p dir="auto"><code>split_exr.py</code>: Splits a multi-channel EXR image into multiple feature images.</p> </li> <li> <p dir="auto"><code>convert_image.py</code>: Converts a feature image to a different image format.</p> </li> <li> <p dir="auto"><code>compare_image.py</code>: Compares two feature images using the specified quality metrics.</p> </li> </ul> <div class="markdown-heading" dir="auto"><h2 tabindex="-1" class="heading-element" dir="auto">Prerequisites</h2><a id="user-content-prerequisites-1" class="anchor" aria-label="Permalink: Prerequisites" href="#prerequisites-1"><svg class="octicon octicon-link" viewBox="0 0 16 16" version="1.1" width="16" height="16" aria-hidden="true"><path d="m7.775 3.275 1.25-1.25a3.5 3.5 0 1 1 4.95 4.95l-2.5 2.5a3.5 3.5 0 0 1-4.95 0 .751.751 0 0 1 .018-1.042.751.751 0 0 1 1.042-.018 1.998 1.998 0 0 0 2.83 0l2.5-2.5a2.002 2.002 0 0 0-2.83-2.83l-1.25 1.25a.751.751 0 0 1-1.042-.018.751.751 0 0 1-.018-1.042Zm-4.69 9.64a1.998 1.998 0 0 0 2.83 0l1.25-1.25a.751.751 0 0 1 1.042.018.751.751 0 0 1 .018 1.042l-1.25 1.25a3.5 3.5 0 1 1-4.95-4.95l2.5-2.5a3.5 3.5 0 0 1 4.95 0 .751.751 0 0 1-.018 1.042.751.751 0 0 1-1.042.018 1.998 1.998 0 0 0-2.83 0l-2.5 2.5a1.998 1.998 0 0 0 0 2.83Z"></path></svg></a></div> <p dir="auto">Before you can run the training toolkit you need the following prerequisites:</p> <ul dir="auto"> <li> <p dir="auto">Linux (other operating systems are currently not supported)</p> </li> <li> <p dir="auto">Python 3.7 or later</p> </li> <li> <p dir="auto"><a href="https://pytorch.org/" rel="nofollow">PyTorch</a> 2.4 or later</p> </li> <li> <p dir="auto"><a href="https://numpy.org/" rel="nofollow">NumPy</a> 1.19 or later</p> </li> <li> <p dir="auto"><a href="http://openimageio.org/" rel="nofollow">OpenImageIO</a> 2.1 or later</p> </li> <li> <p dir="auto"><a href="https://www.tensorflow.org/tensorboard" rel="nofollow">TensorBoard</a> 2.4 or later</p> </li> </ul> <div class="markdown-heading" dir="auto"><h2 tabindex="-1" class="heading-element" dir="auto">Devices</h2><a id="user-content-devices-1" class="anchor" aria-label="Permalink: Devices" href="#devices-1"><svg class="octicon octicon-link" viewBox="0 0 16 16" version="1.1" width="16" height="16" aria-hidden="true"><path d="m7.775 3.275 1.25-1.25a3.5 3.5 0 1 1 4.95 4.95l-2.5 2.5a3.5 3.5 0 0 1-4.95 0 .751.751 0 0 1 .018-1.042.751.751 0 0 1 1.042-.018 1.998 1.998 0 0 0 2.83 0l2.5-2.5a2.002 2.002 0 0 0-2.83-2.83l-1.25 1.25a.751.751 0 0 1-1.042-.018.751.751 0 0 1-.018-1.042Zm-4.69 9.64a1.998 1.998 0 0 0 2.83 0l1.25-1.25a.751.751 0 0 1 1.042.018.751.751 0 0 1 .018 1.042l-1.25 1.25a3.5 3.5 0 1 1-4.95-4.95l2.5-2.5a3.5 3.5 0 0 1 4.95 0 .751.751 0 0 1-.018 1.042.751.751 0 0 1-1.042.018 1.998 1.998 0 0 0-2.83 0l-2.5 2.5a1.998 1.998 0 0 0 0 2.83Z"></path></svg></a></div> <p dir="auto">Most scripts in the training toolkit support selecting what kind of device (e.g. CPU, GPU) to use for the computations (<code>--device</code> or <code>-d</code> option). If multiple devices of the same kind are available (e.g. multiple GPUs), the user can specify which one of these to use (<code>--device_id</code> or <code>-k</code> option). Additionally, some scripts, like <code>train.py</code>, support data-parallel execution on multiple devices for faster performance (<code>--num_devices</code> or <code>-n</code> option).</p> <div class="markdown-heading" dir="auto"><h2 tabindex="-1" class="heading-element" dir="auto">Datasets</h2><a id="user-content-datasets" class="anchor" aria-label="Permalink: Datasets" href="#datasets"><svg class="octicon octicon-link" viewBox="0 0 16 16" version="1.1" width="16" height="16" aria-hidden="true"><path d="m7.775 3.275 1.25-1.25a3.5 3.5 0 1 1 4.95 4.95l-2.5 2.5a3.5 3.5 0 0 1-4.95 0 .751.751 0 0 1 .018-1.042.751.751 0 0 1 1.042-.018 1.998 1.998 0 0 0 2.83 0l2.5-2.5a2.002 2.002 0 0 0-2.83-2.83l-1.25 1.25a.751.751 0 0 1-1.042-.018.751.751 0 0 1-.018-1.042Zm-4.69 9.64a1.998 1.998 0 0 0 2.83 0l1.25-1.25a.751.751 0 0 1 1.042.018.751.751 0 0 1 .018 1.042l-1.25 1.25a3.5 3.5 0 1 1-4.95-4.95l2.5-2.5a3.5 3.5 0 0 1 4.95 0 .751.751 0 0 1-.018 1.042.751.751 0 0 1-1.042.018 1.998 1.998 0 0 0-2.83 0l-2.5 2.5a1.998 1.998 0 0 0 0 2.83Z"></path></svg></a></div> <p dir="auto">A dataset should consist of a collection of noisy and corresponding noise-free reference images. It is possible to have more than one noisy version of the same image in the dataset, e.g. rendered at different samples per pixel and/or using different seeds.</p> <p dir="auto">The training toolkit expects to have all datasets (e.g. training, validation) in the same parent directory (e.g. <code>data</code>). Each dataset is stored in its own subdirectory (e.g. <code>train</code>, <code>valid</code>), which can have an arbitrary name.</p> <p dir="auto">The images must be stored in <a href="https://www.openexr.com/" rel="nofollow">OpenEXR</a> format (<code>.exr</code> files), and the filenames must have a specific format but the files can be stored in an arbitrary directory structure inside the dataset directory. The only restriction is that all versions of an image (noisy images and the reference image) must be located in the same subdirectory. Each feature of an image (e.g. color, albedo) must be stored in a separate image file, i.e. multi-channel EXR image files are not supported. If you have multi-channel EXRs, you can split them into separate images per feature using the included <code>split_exr.py</code> tool.</p> <p dir="auto">An image filename must consist of a base name, a suffix with the number of samples per pixel or whether it is the reference image (e.g. <code>_0128spp</code>, <code>_ref</code>), the feature type extension (e.g. <code>.hdr</code>, <code>.alb</code>), and the image format extension (<code>.exr</code>). The exact filename format as a regular expression is the following:</p> <div class="highlight highlight-source-regexp notranslate position-relative overflow-auto" dir="auto" data-snippet-clipboard-copy-content=".+_([0-9]+(spp)?|ref|reference|gt|target)\.(hdr|ldr|sh1[xyz]|alb|nrm)\.exr"><pre>.<span class="pl-c1">+</span><span class="pl-s">_</span><span class="pl-kos">(</span><span class="pl-kos">[</span><span class="pl-c1">0</span><span class="pl-c1">-</span><span class="pl-c1">9</span><span class="pl-kos">]</span><span class="pl-c1">+</span><span class="pl-kos">(</span><span class="pl-s">s</span><span class="pl-s">p</span><span class="pl-s">p</span><span class="pl-kos">)</span><span class="pl-c1">?</span><span class="pl-c1">|</span><span class="pl-s">r</span><span class="pl-s">e</span><span class="pl-s">f</span><span class="pl-c1">|</span><span class="pl-s">r</span><span class="pl-s">e</span><span class="pl-s">f</span><span class="pl-s">e</span><span class="pl-s">r</span><span class="pl-s">e</span><span class="pl-s">n</span><span class="pl-s">c</span><span class="pl-s">e</span><span class="pl-c1">|</span><span class="pl-s">g</span><span class="pl-s">t</span><span class="pl-c1">|</span><span class="pl-s">t</span><span class="pl-s">a</span><span class="pl-s">r</span><span class="pl-s">g</span><span class="pl-s">e</span><span class="pl-s">t</span><span class="pl-kos">)</span><span class="pl-cce">\.</span><span class="pl-kos">(</span><span class="pl-s">h</span><span class="pl-s">d</span><span class="pl-s">r</span><span class="pl-c1">|</span><span class="pl-s">l</span><span class="pl-s">d</span><span class="pl-s">r</span><span class="pl-c1">|</span><span class="pl-s">s</span><span class="pl-s">h</span><span class="pl-s">1</span><span class="pl-kos">[</span><span class="pl-c1">x</span><span class="pl-c1">y</span><span class="pl-c1">z</span><span class="pl-kos">]</span><span class="pl-c1">|</span><span class="pl-s">a</span><span class="pl-s">l</span><span class="pl-s">b</span><span class="pl-c1">|</span><span class="pl-s">n</span><span class="pl-s">r</span><span class="pl-s">m</span><span class="pl-kos">)</span><span class="pl-cce">\.</span><span class="pl-s">e</span><span class="pl-s">x</span><span class="pl-s">r</span></pre></div> <p dir="auto">The number of samples per pixel should be padded with leading zeros to have a fixed number of digits. If the reference image is not explicitly named as such (i.e. has the number of samples instead), the image with the most samples per pixel will be considered the reference.</p> <p dir="auto">The following image features are supported:</p> <markdown-accessiblity-table><table> <thead> <tr> <th>Feature</th> <th align="left">Description</th> <th align="left">Channels</th> <th align="left">File extension</th> </tr> </thead> <tbody> <tr> <td><code>hdr</code></td> <td align="left">color (HDR)</td> <td align="left">3</td> <td align="left"><code>.hdr.exr</code></td> </tr> <tr> <td><code>ldr</code></td> <td align="left">color (LDR)</td> <td align="left">3</td> <td align="left"><code>.ldr.exr</code></td> </tr> <tr> <td><code>sh1</code></td> <td align="left">color (normalized L1 spherical harmonics)</td> <td align="left">3 × 3 images</td> <td align="left"><code>.sh1x.exr</code>, <code>.sh1y.exr</code>, <code>.sh1z.exr</code></td> </tr> <tr> <td><code>alb</code></td> <td align="left">albedo</td> <td align="left">3</td> <td align="left"><code>.alb.exr</code></td> </tr> <tr> <td><code>nrm</code></td> <td align="left">normal</td> <td align="left">3</td> <td align="left"><code>.nrm.exr</code></td> </tr> </tbody> </table></markdown-accessiblity-table> <p dir="auto">Image features supported by the training toolkit.</p> <p dir="auto">The following directory tree demonstrates an example root dataset directory (<code>data</code>) containing one dataset (<code>rt_train</code>) with HDR color and albedo feature images:</p> <div class="snippet-clipboard-content notranslate position-relative overflow-auto" data-snippet-clipboard-copy-content="data `-- rt_train |-- scene1 | |-- view1_0001.alb.exr | |-- view1_0001.hdr.exr | |-- view1_0004.alb.exr | |-- view1_0004.hdr.exr | |-- view1_8192.alb.exr | |-- view1_8192.hdr.exr | |-- view2_0001.alb.exr | |-- view2_0001.hdr.exr | |-- view2_8192.alb.exr | `-- view2_8192.hdr.exr |-- scene2_000008spp.alb.exr |-- scene2_000008spp.hdr.exr |-- scene2_000064spp.alb.exr |-- scene2_000064spp.hdr.exr |-- scene2_reference.alb.exr `-- scene2_reference.hdr.exr"><pre class="notranslate"><code>data `-- rt_train |-- scene1 | |-- view1_0001.alb.exr | |-- view1_0001.hdr.exr | |-- view1_0004.alb.exr | |-- view1_0004.hdr.exr | |-- view1_8192.alb.exr | |-- view1_8192.hdr.exr | |-- view2_0001.alb.exr | |-- view2_0001.hdr.exr | |-- view2_8192.alb.exr | `-- view2_8192.hdr.exr |-- scene2_000008spp.alb.exr |-- scene2_000008spp.hdr.exr |-- scene2_000064spp.alb.exr |-- scene2_000064spp.hdr.exr |-- scene2_reference.alb.exr `-- scene2_reference.hdr.exr </code></pre></div> <div class="markdown-heading" dir="auto"><h2 tabindex="-1" class="heading-element" dir="auto">Preprocessing (preprocess.py)</h2><a id="user-content-preprocessing-preprocesspy" class="anchor" aria-label="Permalink: Preprocessing (preprocess.py)" href="#preprocessing-preprocesspy"><svg class="octicon octicon-link" viewBox="0 0 16 16" version="1.1" width="16" height="16" aria-hidden="true"><path d="m7.775 3.275 1.25-1.25a3.5 3.5 0 1 1 4.95 4.95l-2.5 2.5a3.5 3.5 0 0 1-4.95 0 .751.751 0 0 1 .018-1.042.751.751 0 0 1 1.042-.018 1.998 1.998 0 0 0 2.83 0l2.5-2.5a2.002 2.002 0 0 0-2.83-2.83l-1.25 1.25a.751.751 0 0 1-1.042-.018.751.751 0 0 1-.018-1.042Zm-4.69 9.64a1.998 1.998 0 0 0 2.83 0l1.25-1.25a.751.751 0 0 1 1.042.018.751.751 0 0 1 .018 1.042l-1.25 1.25a3.5 3.5 0 1 1-4.95-4.95l2.5-2.5a3.5 3.5 0 0 1 4.95 0 .751.751 0 0 1-.018 1.042.751.751 0 0 1-1.042.018 1.998 1.998 0 0 0-2.83 0l-2.5 2.5a1.998 1.998 0 0 0 0 2.83Z"></path></svg></a></div> <p dir="auto">Training and validation datasets can be used only after preprocessing them using the <code>preprocess.py</code> script. This will convert the specified training (<code>--train_data</code> or <code>-t</code> option) and validation datasets (<code>--valid_data</code> or <code>-v</code> option) located in the root dataset directory (<code>--data_dir</code> or <code>-D</code> option) to a format that can be loaded more efficiently during training. All preprocessed datasets will be stored in a root preprocessed dataset directory (<code>--preproc_dir</code> or <code>-P</code> option).</p> <p dir="auto">The preprocessing script requires the set of image features to include in the preprocessed dataset as command-line arguments. Only these specified features will be available for training but it is not required to use all of them at the same time. Thus, a single preprocessed dataset can be reused for training multiple models with different combinations of the preprocessed features.</p> <p dir="auto">By default, all input features are assumed to be noisy, including the auxiliary features (e.g. albedo, normal), each having versions at different samples per pixel. It is also possible to train with noise-free auxiliary features, in which case the reference auxiliary features are used instead of the various noisy ones (<code>--clean_aux</code> option). This improves quality significantly if the auxiliary features used for inference will be either originally noise-free or prefiltered with separately trained auxiliary feature denoising models. If inference will be done only with prefiltered features, even higher quality can be achieved by training with prefiltered features instead of the reference onces. This can be achieved by first training the auxiliary feature models and then specifying the list of these results when preprocessing the dataset for the main feature (<code>--aux_results</code> or <code>-a</code> option).</p> <p dir="auto">Preprocessing also depends on the filter that will be trained (e.g. determines which HDR/LDR transfer function has to be used), which should be also specified (<code>--filter</code> or <code>-f</code> option). The alternative is to manually specify the transfer function (<code>--transfer</code> or <code>-x</code> option) and other filter-specific parameters, which could be useful for training custom filters.</p> <p dir="auto">For example, to preprocess the training and validation datasets (<code>rt_train</code> and <code>rt_valid</code>) with HDR color, albedo, and normal image features, for training the <code>RT</code> filter, the following command can be used:</p> <div class="snippet-clipboard-content notranslate position-relative overflow-auto" data-snippet-clipboard-copy-content="./preprocess.py hdr alb nrm --filter RT --train_data rt_train --valid_data rt_valid"><pre class="notranslate"><code>./preprocess.py hdr alb nrm --filter RT --train_data rt_train --valid_data rt_valid </code></pre></div> <p dir="auto">It is possible to preprocess the same dataset multiple times, with possibly different combinations of features and options. The training script will use the most suitable and most recent preprocessed version depending on the training parameters.</p> <p dir="auto">For more details about using the preprocessing script, including other options, please have a look at the help message:</p> <div class="snippet-clipboard-content notranslate position-relative overflow-auto" data-snippet-clipboard-copy-content="./preprocess.py -h"><pre class="notranslate"><code>./preprocess.py -h </code></pre></div> <div class="markdown-heading" dir="auto"><h2 tabindex="-1" class="heading-element" dir="auto">Training (train.py)</h2><a id="user-content-training-trainpy" class="anchor" aria-label="Permalink: Training (train.py)" href="#training-trainpy"><svg class="octicon octicon-link" viewBox="0 0 16 16" version="1.1" width="16" height="16" aria-hidden="true"><path d="m7.775 3.275 1.25-1.25a3.5 3.5 0 1 1 4.95 4.95l-2.5 2.5a3.5 3.5 0 0 1-4.95 0 .751.751 0 0 1 .018-1.042.751.751 0 0 1 1.042-.018 1.998 1.998 0 0 0 2.83 0l2.5-2.5a2.002 2.002 0 0 0-2.83-2.83l-1.25 1.25a.751.751 0 0 1-1.042-.018.751.751 0 0 1-.018-1.042Zm-4.69 9.64a1.998 1.998 0 0 0 2.83 0l1.25-1.25a.751.751 0 0 1 1.042.018.751.751 0 0 1 .018 1.042l-1.25 1.25a3.5 3.5 0 1 1-4.95-4.95l2.5-2.5a3.5 3.5 0 0 1 4.95 0 .751.751 0 0 1-.018 1.042.751.751 0 0 1-1.042.018 1.998 1.998 0 0 0-2.83 0l-2.5 2.5a1.998 1.998 0 0 0 0 2.83Z"></path></svg></a></div> <p dir="auto">The filters require separate trained models for each supported combination of input features. Thus, depending on which combinations of features the user wants to support for a particular filter, one or more models have to be trained.</p> <p dir="auto">After preprocessing the datasets, it is possible to start training a model using the <code>train.py</code> script. Similar to the preprocessing script, the input features must be specified (could be a subset of the preprocessed features), and the dataset names, directory paths, and the filter can be also passed. If the <code>--clean_aux</code> or <code>--aux_results</code> options were specified for preprocessing, these must be passed identically to the training script as well.</p> <p dir="auto">Open Image Denoise uses models of different sizes for different quality modes (high, balanced, fast). Specifying the quality mode (<code>--quality</code> or <code>-q</code> option) will cause the model to be implicitly selected, or the model can be specified explicitly as well (<code>--model</code> or <code>-m</code> option).</p> <p dir="auto">The tool will produce a training <em>result</em>, the name of which can be either specified (<code>--result</code> or <code>-r</code> option) or automatically generated (by default). Each result is stored in its own subdirectory, and these are located in a common parent directory (<code>--results_dir</code> or <code>-R</code> option). If a training result already exists, the tool will resume training that result from the latest checkpoint.</p> <p dir="auto">The default training hyperparameters should work reasonably well in general, but some adjustments might be necessary for certain datasets to attain optimal performance, most importantly: the number of epochs (<code>--num_epochs</code> or <code>-e</code> option), the global mini-batch size (<code>--batch_size</code> or <code>-b</code> option), and the learning rate. The training tool uses a one-cycle learning rate schedule with cosine annealing, which can be configured by setting the base learning rate (<code>--learning_rate</code> or <code>--lr</code> option), the maximum learning rate (<code>--max_learning_rate</code> or <code>--max_lr</code> option), and the percentage of the cycle spent increasing the learning rate (<code>--learning_rate_warmup</code> or <code>--lr_warmup</code> option).</p> <p dir="auto">Example usage:</p> <div class="snippet-clipboard-content notranslate position-relative overflow-auto" data-snippet-clipboard-copy-content="./train.py hdr alb --filter RT --train_data rt_train --valid_data rt_valid --result rt_hdr_alb"><pre class="notranslate"><code>./train.py hdr alb --filter RT --train_data rt_train --valid_data rt_valid --result rt_hdr_alb </code></pre></div> <p dir="auto">For finding the optimal learning rate range, we recommend using the included <code>find_lr.py</code> script, which trains one epoch using an increasing learning rate and logs the resulting losses in a comma-separated values (CSV) file. Plotting the loss curve can show when the model starts to learn (the base learning rate) and when it starts to diverge (the maximum learning rate).</p> <p dir="auto">The model is evaluated with the validation dataset at regular intervals (<code>--num_valid_epochs</code> option), and checkpoints are also regularly created (<code>--num_save_epochs</code> option) to save training progress. Also, some statistics are logged (e.g. training and validation losses, learning rate) per epoch, which can be later visualized with TensorBoard by running the <code>visualize.py</code> script, e.g.:</p> <div class="snippet-clipboard-content notranslate position-relative overflow-auto" data-snippet-clipboard-copy-content="./visualize.py --result rt_hdr_alb"><pre class="notranslate"><code>./visualize.py --result rt_hdr_alb </code></pre></div> <p dir="auto">Training is performed with mixed precision (FP16 and FP32) by default, if it supported by the hardware, which makes training faster and use less memory. However, in some rare cases this might cause some convergence issues. The training precision can be manually set to FP32 if necessary (<code>--precision</code> or <code>-p</code> option).</p> <div class="markdown-heading" dir="auto"><h2 tabindex="-1" class="heading-element" dir="auto">Inference (infer.py)</h2><a id="user-content-inference-inferpy" class="anchor" aria-label="Permalink: Inference (infer.py)" href="#inference-inferpy"><svg class="octicon octicon-link" viewBox="0 0 16 16" version="1.1" width="16" height="16" aria-hidden="true"><path d="m7.775 3.275 1.25-1.25a3.5 3.5 0 1 1 4.95 4.95l-2.5 2.5a3.5 3.5 0 0 1-4.95 0 .751.751 0 0 1 .018-1.042.751.751 0 0 1 1.042-.018 1.998 1.998 0 0 0 2.83 0l2.5-2.5a2.002 2.002 0 0 0-2.83-2.83l-1.25 1.25a.751.751 0 0 1-1.042-.018.751.751 0 0 1-.018-1.042Zm-4.69 9.64a1.998 1.998 0 0 0 2.83 0l1.25-1.25a.751.751 0 0 1 1.042.018.751.751 0 0 1 .018 1.042l-1.25 1.25a3.5 3.5 0 1 1-4.95-4.95l2.5-2.5a3.5 3.5 0 0 1 4.95 0 .751.751 0 0 1-.018 1.042.751.751 0 0 1-1.042.018 1.998 1.998 0 0 0-2.83 0l-2.5 2.5a1.998 1.998 0 0 0 0 2.83Z"></path></svg></a></div> <p dir="auto">A training result can be tested by performing inference on an image dataset (<code>--input_data</code> or <code>-i</code> option) using the <code>infer.py</code> script. The dataset does <em>not</em> have to be preprocessed. In addition to the result to use, it is possible to specify which checkpoint to load as well (<code>-e</code> or <code>--num_epochs</code> option). By default the latest checkpoint is loaded.</p> <p dir="auto">The tool saves the output images in a separate directory (<code>--output_dir</code> or <code>-O</code> option) in the requested formats (<code>--format</code> or <code>-F</code> option). It also evaluates a set of image quality metrics (<code>--metric</code> or <code>-M</code> option), e.g. PSNR, SSIM, for images that have reference images available. All metrics are computed in tonemapped non-linear sRGB space. Thus, HDR images are first tonemapped (with Naughty Dog’s Filmic Tonemapper from John Hable’s <em>Uncharted 2: HDR Lighting</em> presentation) and converted to sRGB before evaluating the metrics.</p> <p dir="auto">Example usage:</p> <div class="snippet-clipboard-content notranslate position-relative overflow-auto" data-snippet-clipboard-copy-content="./infer.py --result rt_hdr_alb --input_data rt_test --format exr png --metric ssim"><pre class="notranslate"><code>./infer.py --result rt_hdr_alb --input_data rt_test --format exr png --metric ssim </code></pre></div> <p dir="auto">The inference tool supports prefiltering of auxiliary features as well, which can be performed by specifying the list of training results for each feature to prefilter (<code>--aux_results</code> or <code>-a</code> option).</p> <div class="markdown-heading" dir="auto"><h2 tabindex="-1" class="heading-element" dir="auto">Exporting Results (export.py)</h2><a id="user-content-exporting-results-exportpy" class="anchor" aria-label="Permalink: Exporting Results (export.py)" href="#exporting-results-exportpy"><svg class="octicon octicon-link" viewBox="0 0 16 16" version="1.1" width="16" height="16" aria-hidden="true"><path d="m7.775 3.275 1.25-1.25a3.5 3.5 0 1 1 4.95 4.95l-2.5 2.5a3.5 3.5 0 0 1-4.95 0 .751.751 0 0 1 .018-1.042.751.751 0 0 1 1.042-.018 1.998 1.998 0 0 0 2.83 0l2.5-2.5a2.002 2.002 0 0 0-2.83-2.83l-1.25 1.25a.751.751 0 0 1-1.042-.018.751.751 0 0 1-.018-1.042Zm-4.69 9.64a1.998 1.998 0 0 0 2.83 0l1.25-1.25a.751.751 0 0 1 1.042.018.751.751 0 0 1 .018 1.042l-1.25 1.25a3.5 3.5 0 1 1-4.95-4.95l2.5-2.5a3.5 3.5 0 0 1 4.95 0 .751.751 0 0 1-.018 1.042.751.751 0 0 1-1.042.018 1.998 1.998 0 0 0-2.83 0l-2.5 2.5a1.998 1.998 0 0 0 0 2.83Z"></path></svg></a></div> <p dir="auto">The training result produced by the <code>train.py</code> script cannot be immediately used by the main library. It has to be first exported to the runtime model weights format, a <em>Tensor Archive</em> (TZA) file. Running the <code>export.py</code> script for a training result (and optionally a checkpoint epoch) will create a binary <code>.tza</code> file in the directory of the result, which can be either used at runtime through the API or it can be included in the library build by replacing one of the built-in weights files.</p> <p dir="auto">Example usage:</p> <div class="snippet-clipboard-content notranslate position-relative overflow-auto" data-snippet-clipboard-copy-content="./export.py --result rt_hdr_alb"><pre class="notranslate"><code>./export.py --result rt_hdr_alb </code></pre></div> <div class="markdown-heading" dir="auto"><h2 tabindex="-1" class="heading-element" dir="auto">Image Conversion and Comparison</h2><a id="user-content-image-conversion-and-comparison" class="anchor" aria-label="Permalink: Image Conversion and Comparison" href="#image-conversion-and-comparison"><svg class="octicon octicon-link" viewBox="0 0 16 16" version="1.1" width="16" height="16" aria-hidden="true"><path d="m7.775 3.275 1.25-1.25a3.5 3.5 0 1 1 4.95 4.95l-2.5 2.5a3.5 3.5 0 0 1-4.95 0 .751.751 0 0 1 .018-1.042.751.751 0 0 1 1.042-.018 1.998 1.998 0 0 0 2.83 0l2.5-2.5a2.002 2.002 0 0 0-2.83-2.83l-1.25 1.25a.751.751 0 0 1-1.042-.018.751.751 0 0 1-.018-1.042Zm-4.69 9.64a1.998 1.998 0 0 0 2.83 0l1.25-1.25a.751.751 0 0 1 1.042.018.751.751 0 0 1 .018 1.042l-1.25 1.25a3.5 3.5 0 1 1-4.95-4.95l2.5-2.5a3.5 3.5 0 0 1 4.95 0 .751.751 0 0 1-.018 1.042.751.751 0 0 1-1.042.018 1.998 1.998 0 0 0-2.83 0l-2.5 2.5a1.998 1.998 0 0 0 0 2.83Z"></path></svg></a></div> <p dir="auto">In addition to the already mentioned <code>split_exr.py</code> script, the toolkit contains a few other image utilities as well.</p> <p dir="auto"><code>convert_image.py</code> converts a feature image to a different image format (and/or a different feature, e.g. HDR color to LDR), performing tonemapping and other transforms as well if needed. For HDR images the exposure can be adjusted by passing a linear exposure scale (<code>--exposure</code> or <code>-E</code> option). Example usage:</p> <div class="snippet-clipboard-content notranslate position-relative overflow-auto" data-snippet-clipboard-copy-content="./convert_image.py view1_0004.hdr.exr view1_0004.png --exposure 2.5"><pre class="notranslate"><code>./convert_image.py view1_0004.hdr.exr view1_0004.png --exposure 2.5 </code></pre></div> <p dir="auto">The <code>compare_image.py</code> script compares two feature images (preferably having the dataset filename format to correctly detect the feature) using the specified image quality metrics, similar to the <code>infer.py</code> tool. Example usage:</p> <div class="snippet-clipboard-content notranslate position-relative overflow-auto" data-snippet-clipboard-copy-content="./compare_image.py view1_0004.hdr.exr view1_8192.hdr.exr --exposure 2.5 --metric mse ssim"><pre class="notranslate"><code>./compare_image.py view1_0004.hdr.exr view1_8192.hdr.exr --exposure 2.5 --metric mse ssim </code></pre></div> </article></div></div></div></div></div> <!-- --> <!-- --> <script type="application/json" id="__PRIMER_DATA_:R0:__">{"resolvedServerColorMode":"day"}</script></div> </react-partial> <input type="hidden" data-csrf="true" value="vv3WlFFaOJwpX4bp9IEPkm/B86LUEyMA0q8J7aUP5aRiOCbRVEo7mTHprfhpWe4DKNxPLdYJy6B+rkEqFzz19w==" /> </div> <div data-view-component="true" class="Layout-sidebar"> <div class="BorderGrid about-margin" data-pjax> <div class="BorderGrid-row"> <div class="BorderGrid-cell"> <div class="hide-sm hide-md"> <h2 class="mb-3 h4">About</h2> <p class="f4 my-3"> Intel® Open Image Denoise library </p> <div class="my-3 d-flex flex-items-center"> <svg aria-hidden="true" height="16" viewBox="0 0 16 16" version="1.1" width="16" data-view-component="true" class="octicon octicon-link flex-shrink-0 mr-2"> <path d="m7.775 3.275 1.25-1.25a3.5 3.5 0 1 1 4.95 4.95l-2.5 2.5a3.5 3.5 0 0 1-4.95 0 .751.751 0 0 1 .018-1.042.751.751 0 0 1 1.042-.018 1.998 1.998 0 0 0 2.83 0l2.5-2.5a2.002 2.002 0 0 0-2.83-2.83l-1.25 1.25a.751.751 0 0 1-1.042-.018.751.751 0 0 1-.018-1.042Zm-4.69 9.64a1.998 1.998 0 0 0 2.83 0l1.25-1.25a.751.751 0 0 1 1.042.018.751.751 0 0 1 .018 1.042l-1.25 1.25a3.5 3.5 0 1 1-4.95-4.95l2.5-2.5a3.5 3.5 0 0 1 4.95 0 .751.751 0 0 1-.018 1.042.751.751 0 0 1-1.042.018 1.998 1.998 0 0 0-2.83 0l-2.5 2.5a1.998 1.998 0 0 0 0 2.83Z"></path> </svg> <span class="flex-auto min-width-0 css-truncate css-truncate-target width-fit"> <a title="https://www.openimagedenoise.org/" role="link" target="_blank" rel="noopener noreferrer nofollow" class="text-bold" href="https://www.openimagedenoise.org/">www.openimagedenoise.org/</a> </span> </div> <h3 class="sr-only">Resources</h3> <div class="mt-2"> <a class="Link--muted" data-analytics-event="{"category":"Repository Overview","action":"click","label":"location:sidebar;file:readme"}" href="#readme-ov-file"> <svg aria-hidden="true" height="16" viewBox="0 0 16 16" version="1.1" width="16" data-view-component="true" class="octicon octicon-book mr-2"> <path d="M0 1.75A.75.75 0 0 1 .75 1h4.253c1.227 0 2.317.59 3 1.501A3.743 3.743 0 0 1 11.006 1h4.245a.75.75 0 0 1 .75.75v10.5a.75.75 0 0 1-.75.75h-4.507a2.25 2.25 0 0 0-1.591.659l-.622.621a.75.75 0 0 1-1.06 0l-.622-.621A2.25 2.25 0 0 0 5.258 13H.75a.75.75 0 0 1-.75-.75Zm7.251 10.324.004-5.073-.002-2.253A2.25 2.25 0 0 0 5.003 2.5H1.5v9h3.757a3.75 3.75 0 0 1 1.994.574ZM8.755 4.75l-.004 7.322a3.752 3.752 0 0 1 1.992-.572H14.5v-9h-3.495a2.25 2.25 0 0 0-2.25 2.25Z"></path> </svg> Readme </a> </div> <h3 class="sr-only">License</h3> <div class="mt-2"> <a href="#Apache-2.0-1-ov-file" class="Link--muted" data-analytics-event="{"category":"Repository Overview","action":"click","label":"location:sidebar;file:license"}" > <svg aria-hidden="true" height="16" viewBox="0 0 16 16" version="1.1" width="16" data-view-component="true" class="octicon octicon-law mr-2"> <path d="M8.75.75V2h.985c.304 0 .603.08.867.231l1.29.736c.038.022.08.033.124.033h2.234a.75.75 0 0 1 0 1.5h-.427l2.111 4.692a.75.75 0 0 1-.154.838l-.53-.53.529.531-.001.002-.002.002-.006.006-.006.005-.01.01-.045.04c-.21.176-.441.327-.686.45C14.556 10.78 13.88 11 13 11a4.498 4.498 0 0 1-2.023-.454 3.544 3.544 0 0 1-.686-.45l-.045-.04-.016-.015-.006-.006-.004-.004v-.001a.75.75 0 0 1-.154-.838L12.178 4.5h-.162c-.305 0-.604-.079-.868-.231l-1.29-.736a.245.245 0 0 0-.124-.033H8.75V13h2.5a.75.75 0 0 1 0 1.5h-6.5a.75.75 0 0 1 0-1.5h2.5V3.5h-.984a.245.245 0 0 0-.124.033l-1.289.737c-.265.15-.564.23-.869.23h-.162l2.112 4.692a.75.75 0 0 1-.154.838l-.53-.53.529.531-.001.002-.002.002-.006.006-.016.015-.045.04c-.21.176-.441.327-.686.45C4.556 10.78 3.88 11 3 11a4.498 4.498 0 0 1-2.023-.454 3.544 3.544 0 0 1-.686-.45l-.045-.04-.016-.015-.006-.006-.004-.004v-.001a.75.75 0 0 1-.154-.838L2.178 4.5H1.75a.75.75 0 0 1 0-1.5h2.234a.249.249 0 0 0 .125-.033l1.288-.737c.265-.15.564-.23.869-.23h.984V.75a.75.75 0 0 1 1.5 0Zm2.945 8.477c.285.135.718.273 1.305.273s1.02-.138 1.305-.273L13 6.327Zm-10 0c.285.135.718.273 1.305.273s1.02-.138 1.305-.273L3 6.327Z"></path> </svg> Apache-2.0 license </a> </div> <h3 class="sr-only">Security policy</h3> <div class="mt-2"> <a href="#security-ov-file" class="Link--muted" data-analytics-event="{"category":"Repository Overview","action":"click","label":"location:sidebar;file:security policy"}" > <svg aria-hidden="true" height="16" viewBox="0 0 16 16" version="1.1" width="16" data-view-component="true" class="octicon octicon-law mr-2"> <path d="M8.75.75V2h.985c.304 0 .603.08.867.231l1.29.736c.038.022.08.033.124.033h2.234a.75.75 0 0 1 0 1.5h-.427l2.111 4.692a.75.75 0 0 1-.154.838l-.53-.53.529.531-.001.002-.002.002-.006.006-.006.005-.01.01-.045.04c-.21.176-.441.327-.686.45C14.556 10.78 13.88 11 13 11a4.498 4.498 0 0 1-2.023-.454 3.544 3.544 0 0 1-.686-.45l-.045-.04-.016-.015-.006-.006-.004-.004v-.001a.75.75 0 0 1-.154-.838L12.178 4.5h-.162c-.305 0-.604-.079-.868-.231l-1.29-.736a.245.245 0 0 0-.124-.033H8.75V13h2.5a.75.75 0 0 1 0 1.5h-6.5a.75.75 0 0 1 0-1.5h2.5V3.5h-.984a.245.245 0 0 0-.124.033l-1.289.737c-.265.15-.564.23-.869.23h-.162l2.112 4.692a.75.75 0 0 1-.154.838l-.53-.53.529.531-.001.002-.002.002-.006.006-.016.015-.045.04c-.21.176-.441.327-.686.45C4.556 10.78 3.88 11 3 11a4.498 4.498 0 0 1-2.023-.454 3.544 3.544 0 0 1-.686-.45l-.045-.04-.016-.015-.006-.006-.004-.004v-.001a.75.75 0 0 1-.154-.838L2.178 4.5H1.75a.75.75 0 0 1 0-1.5h2.234a.249.249 0 0 0 .125-.033l1.288-.737c.265-.15.564-.23.869-.23h.984V.75a.75.75 0 0 1 1.5 0Zm2.945 8.477c.285.135.718.273 1.305.273s1.02-.138 1.305-.273L13 6.327Zm-10 0c.285.135.718.273 1.305.273s1.02-.138 1.305-.273L3 6.327Z"></path> </svg> Security policy </a> </div> <include-fragment src="/RenderKit/oidn/hovercards/citation/sidebar_partial?tree_name=master"> </include-fragment> <div class="mt-2"> <a href="/RenderKit/oidn/activity" data-view-component="true" class="Link Link--muted"> <svg text="gray" aria-hidden="true" height="16" viewBox="0 0 16 16" version="1.1" width="16" data-view-component="true" class="octicon octicon-pulse mr-2"> <path d="M6 2c.306 0 .582.187.696.471L10 10.731l1.304-3.26A.751.751 0 0 1 12 7h3.25a.75.75 0 0 1 0 1.5h-2.742l-1.812 4.528a.751.751 0 0 1-1.392 0L6 4.77 4.696 8.03A.75.75 0 0 1 4 8.5H.75a.75.75 0 0 1 0-1.5h2.742l1.812-4.529A.751.751 0 0 1 6 2Z"></path> </svg> <span class="color-fg-muted">Activity</span> </a> </div> <div class="mt-2"> <a href="/RenderKit/oidn/custom-properties" data-view-component="true" class="Link Link--muted"> <svg text="gray" aria-hidden="true" height="16" viewBox="0 0 16 16" version="1.1" width="16" data-view-component="true" class="octicon octicon-note mr-2"> <path d="M0 3.75C0 2.784.784 2 1.75 2h12.5c.966 0 1.75.784 1.75 1.75v8.5A1.75 1.75 0 0 1 14.25 14H1.75A1.75 1.75 0 0 1 0 12.25Zm1.75-.25a.25.25 0 0 0-.25.25v8.5c0 .138.112.25.25.25h12.5a.25.25 0 0 0 .25-.25v-8.5a.25.25 0 0 0-.25-.25ZM3.5 6.25a.75.75 0 0 1 .75-.75h7a.75.75 0 0 1 0 1.5h-7a.75.75 0 0 1-.75-.75Zm.75 2.25h4a.75.75 0 0 1 0 1.5h-4a.75.75 0 0 1 0-1.5Z"></path> </svg> <span class="color-fg-muted">Custom properties</span> </a> </div> <h3 class="sr-only">Stars</h3> <div class="mt-2"> <a href="/RenderKit/oidn/stargazers" data-view-component="true" class="Link Link--muted"> <svg aria-hidden="true" height="16" viewBox="0 0 16 16" version="1.1" width="16" data-view-component="true" class="octicon octicon-star mr-2"> <path d="M8 .25a.75.75 0 0 1 .673.418l1.882 3.815 4.21.612a.75.75 0 0 1 .416 1.279l-3.046 2.97.719 4.192a.751.751 0 0 1-1.088.791L8 12.347l-3.766 1.98a.75.75 0 0 1-1.088-.79l.72-4.194L.818 6.374a.75.75 0 0 1 .416-1.28l4.21-.611L7.327.668A.75.75 0 0 1 8 .25Zm0 2.445L6.615 5.5a.75.75 0 0 1-.564.41l-3.097.45 2.24 2.184a.75.75 0 0 1 .216.664l-.528 3.084 2.769-1.456a.75.75 0 0 1 .698 0l2.77 1.456-.53-3.084a.75.75 0 0 1 .216-.664l2.24-2.183-3.096-.45a.75.75 0 0 1-.564-.41L8 2.694Z"></path> </svg> <strong>1.8k</strong> stars </a> </div> <h3 class="sr-only">Watchers</h3> <div class="mt-2"> <a href="/RenderKit/oidn/watchers" data-view-component="true" class="Link Link--muted"> <svg aria-hidden="true" height="16" viewBox="0 0 16 16" version="1.1" width="16" data-view-component="true" class="octicon octicon-eye mr-2"> <path d="M8 2c1.981 0 3.671.992 4.933 2.078 1.27 1.091 2.187 2.345 2.637 3.023a1.62 1.62 0 0 1 0 1.798c-.45.678-1.367 1.932-2.637 3.023C11.67 13.008 9.981 14 8 14c-1.981 0-3.671-.992-4.933-2.078C1.797 10.83.88 9.576.43 8.898a1.62 1.62 0 0 1 0-1.798c.45-.677 1.367-1.931 2.637-3.022C4.33 2.992 6.019 2 8 2ZM1.679 7.932a.12.12 0 0 0 0 .136c.411.622 1.241 1.75 2.366 2.717C5.176 11.758 6.527 12.5 8 12.5c1.473 0 2.825-.742 3.955-1.715 1.124-.967 1.954-2.096 2.366-2.717a.12.12 0 0 0 0-.136c-.412-.621-1.242-1.75-2.366-2.717C10.824 4.242 9.473 3.5 8 3.5c-1.473 0-2.825.742-3.955 1.715-1.124.967-1.954 2.096-2.366 2.717ZM8 10a2 2 0 1 1-.001-3.999A2 2 0 0 1 8 10Z"></path> </svg> <strong>49</strong> watching </a> </div> <h3 class="sr-only">Forks</h3> <div class="mt-2"> <a href="/RenderKit/oidn/forks" data-view-component="true" class="Link Link--muted"> <svg aria-hidden="true" height="16" viewBox="0 0 16 16" version="1.1" width="16" data-view-component="true" class="octicon octicon-repo-forked mr-2"> <path d="M5 5.372v.878c0 .414.336.75.75.75h4.5a.75.75 0 0 0 .75-.75v-.878a2.25 2.25 0 1 1 1.5 0v.878a2.25 2.25 0 0 1-2.25 2.25h-1.5v2.128a2.251 2.251 0 1 1-1.5 0V8.5h-1.5A2.25 2.25 0 0 1 3.5 6.25v-.878a2.25 2.25 0 1 1 1.5 0ZM5 3.25a.75.75 0 1 0-1.5 0 .75.75 0 0 0 1.5 0Zm6.75.75a.75.75 0 1 0 0-1.5.75.75 0 0 0 0 1.5Zm-3 8.75a.75.75 0 1 0-1.5 0 .75.75 0 0 0 1.5 0Z"></path> </svg> <strong>164</strong> forks </a> </div> <div class="mt-2"> <a class="Link--muted" href="/contact/report-content?content_url=https%3A%2F%2Fgithub.com%2FRenderKit%2Foidn&report=RenderKit+%28user%29"> Report repository </a> </div> </div> </div> </div> <div class="BorderGrid-row"> <div class="BorderGrid-cell"> <h2 class="h4 mb-3" data-pjax="#repo-content-pjax-container" data-turbo-frame="repo-content-turbo-frame"> <a href="/RenderKit/oidn/releases" data-view-component="true" class="Link--primary no-underline Link"> Releases <span title="27" data-view-component="true" class="Counter">27</span> </a></h2> <a class="Link--primary d-flex no-underline" data-pjax="#repo-content-pjax-container" data-turbo-frame="repo-content-turbo-frame" href="/RenderKit/oidn/releases/tag/v2.3.1"> <svg aria-hidden="true" height="16" viewBox="0 0 16 16" version="1.1" width="16" data-view-component="true" class="octicon octicon-tag flex-shrink-0 mt-1 color-fg-success"> <path d="M1 7.775V2.75C1 1.784 1.784 1 2.75 1h5.025c.464 0 .91.184 1.238.513l6.25 6.25a1.75 1.75 0 0 1 0 2.474l-5.026 5.026a1.75 1.75 0 0 1-2.474 0l-6.25-6.25A1.752 1.752 0 0 1 1 7.775Zm1.5 0c0 .066.026.13.073.177l6.25 6.25a.25.25 0 0 0 .354 0l5.025-5.025a.25.25 0 0 0 0-.354l-6.25-6.25a.25.25 0 0 0-.177-.073H2.75a.25.25 0 0 0-.25.25ZM6 5a1 1 0 1 1 0 2 1 1 0 0 1 0-2Z"></path> </svg> <div class="ml-2 min-width-0"> <div class="d-flex"> <span class="css-truncate css-truncate-target text-bold mr-2" style="max-width: none;">Open Image Denoise v2.3.1</span> <span title="Label: Latest" data-view-component="true" class="Label Label--success flex-shrink-0"> Latest </span> </div> <div class="text-small color-fg-muted"><relative-time datetime="2024-11-11T23:22:38Z" class="no-wrap">Nov 11, 2024</relative-time></div> </div> </a> <div data-view-component="true" class="mt-3"> <a text="small" data-pjax="#repo-content-pjax-container" data-turbo-frame="repo-content-turbo-frame" href="/RenderKit/oidn/releases" data-view-component="true" class="Link"> + 26 releases </a></div> </div> </div> <div class="BorderGrid-row"> <div class="BorderGrid-cell"> <h2 class="h4 mb-3"> <a href="/orgs/RenderKit/packages?repo_name=oidn" data-view-component="true" class="Link--primary no-underline Link d-flex flex-items-center"> Packages <span title="0" hidden="hidden" data-view-component="true" class="Counter ml-1">0</span> </a></h2> <div class="text-small color-fg-muted" > No packages published <br> </div> </div> </div> <div class="BorderGrid-row" hidden> <div class="BorderGrid-cell"> <include-fragment src="/RenderKit/oidn/used_by_list" accept="text/fragment+html"> </include-fragment> </div> </div> <div class="BorderGrid-row"> <div class="BorderGrid-cell"> <h2 class="h4 mb-3"> <a href="/RenderKit/oidn/graphs/contributors" data-view-component="true" class="Link--primary no-underline Link d-flex flex-items-center"> Contributors <span title="13" data-view-component="true" class="Counter ml-1">13</span> </a></h2> <ul class="list-style-none d-flex flex-wrap mb-n2"> <li class="mb-2 mr-2" > <a href="https://github.com/atafra" class="" data-hovercard-type="user" data-hovercard-url="/users/atafra/hovercard" data-octo-click="hovercard-link-click" data-octo-dimensions="link_type:self" > <img src="https://avatars.githubusercontent.com/u/4058111?s=64&v=4" alt="@atafra" size="32" height="32" width="32" data-view-component="true" class="avatar circle" /> </a> </li> <li class="mb-2 mr-2" > <a href="https://github.com/jmengintel" class="" data-hovercard-type="user" data-hovercard-url="/users/jmengintel/hovercard" data-octo-click="hovercard-link-click" data-octo-dimensions="link_type:self" > <img src="https://avatars.githubusercontent.com/u/49227394?s=64&v=4" alt="@jmengintel" size="32" height="32" width="32" data-view-component="true" class="avatar circle" /> </a> </li> <li class="mb-2 mr-2" > <a href="https://github.com/TrevorThomson" class="" data-hovercard-type="user" data-hovercard-url="/users/TrevorThomson/hovercard" data-octo-click="hovercard-link-click" data-octo-dimensions="link_type:self" > <img src="https://avatars.githubusercontent.com/u/4493168?s=64&v=4" alt="@TrevorThomson" size="32" height="32" width="32" data-view-component="true" class="avatar circle" /> </a> </li> <li class="mb-2 mr-2" > <a href="https://github.com/johguenther" class="" data-hovercard-type="user" data-hovercard-url="/users/johguenther/hovercard" data-octo-click="hovercard-link-click" data-octo-dimensions="link_type:self" > <img src="https://avatars.githubusercontent.com/u/9035336?s=64&v=4" alt="@johguenther" size="32" height="32" width="32" data-view-component="true" class="avatar circle" /> </a> </li> <li class="mb-2 mr-2" > <a href="https://github.com/kraszkow" class="" data-hovercard-type="user" data-hovercard-url="/users/kraszkow/hovercard" data-octo-click="hovercard-link-click" data-octo-dimensions="link_type:self" > <img src="https://avatars.githubusercontent.com/u/31285540?s=64&v=4" alt="@kraszkow" size="32" height="32" width="32" data-view-component="true" class="avatar circle" /> </a> </li> <li class="mb-2 mr-2" > <a href="https://github.com/Twinklebear" class="" data-hovercard-type="user" data-hovercard-url="/users/Twinklebear/hovercard" data-octo-click="hovercard-link-click" data-octo-dimensions="link_type:self" > <img src="https://avatars.githubusercontent.com/u/1522476?s=64&v=4" alt="@Twinklebear" size="32" height="32" width="32" data-view-component="true" class="avatar circle" /> </a> </li> <li class="mb-2 mr-2" > <a href="https://github.com/rscohn2" class="" data-hovercard-type="user" data-hovercard-url="/users/rscohn2/hovercard" data-octo-click="hovercard-link-click" data-octo-dimensions="link_type:self" > <img src="https://avatars.githubusercontent.com/u/1936730?s=64&v=4" alt="@rscohn2" size="32" height="32" width="32" data-view-component="true" class="avatar circle" /> </a> </li> <li class="mb-2 mr-2" > <a href="https://github.com/Vertexwahn" class="" data-hovercard-type="user" data-hovercard-url="/users/Vertexwahn/hovercard" data-octo-click="hovercard-link-click" data-octo-dimensions="link_type:self" > <img src="https://avatars.githubusercontent.com/u/3775001?s=64&v=4" alt="@Vertexwahn" size="32" height="32" width="32" data-view-component="true" class="avatar circle" /> </a> </li> <li class="mb-2 mr-2" > <a href="https://github.com/cbenthin" class="" data-hovercard-type="user" data-hovercard-url="/users/cbenthin/hovercard" data-octo-click="hovercard-link-click" data-octo-dimensions="link_type:self" > <img src="https://avatars.githubusercontent.com/u/5039049?s=64&v=4" alt="@cbenthin" size="32" height="32" width="32" data-view-component="true" class="avatar circle" /> </a> </li> <li class="mb-2 mr-2" > <a href="https://github.com/madmiraal" class="" data-hovercard-type="user" data-hovercard-url="/users/madmiraal/hovercard" data-octo-click="hovercard-link-click" data-octo-dimensions="link_type:self" > <img src="https://avatars.githubusercontent.com/u/9253928?s=64&v=4" alt="@madmiraal" size="32" height="32" width="32" data-view-component="true" class="avatar circle" /> </a> </li> <li class="mb-2 mr-2" > <a href="https://github.com/adellari" class="" data-hovercard-type="user" data-hovercard-url="/users/adellari/hovercard" data-octo-click="hovercard-link-click" data-octo-dimensions="link_type:self" > <img src="https://avatars.githubusercontent.com/u/13017691?s=64&v=4" alt="@adellari" size="32" height="32" width="32" data-view-component="true" class="avatar circle" /> </a> </li> <li class="mb-2 mr-2" > <a href="https://github.com/miroslawpawlowski" class="" data-hovercard-type="user" data-hovercard-url="/users/miroslawpawlowski/hovercard" data-octo-click="hovercard-link-click" data-octo-dimensions="link_type:self" > <img src="https://avatars.githubusercontent.com/u/45656675?s=64&v=4" alt="@miroslawpawlowski" size="32" height="32" width="32" data-view-component="true" class="avatar circle" /> </a> </li> <li class="mb-2 mr-2" > <a href="https://github.com/dmnemshi" class="" data-hovercard-type="user" data-hovercard-url="/users/dmnemshi/hovercard" data-octo-click="hovercard-link-click" data-octo-dimensions="link_type:self" > <img src="https://avatars.githubusercontent.com/u/63740440?s=64&v=4" alt="@dmnemshi" size="32" height="32" width="32" data-view-component="true" class="avatar circle" /> </a> </li> </ul> </div> </div> <div class="BorderGrid-row"> <div class="BorderGrid-cell"> <h2 class="h4 mb-3">Languages</h2> <div class="mb-2"> <span data-view-component="true" class="Progress"> <span style="background-color:#f34b7d !important;;width: 68.0%;" itemprop="keywords" aria-label="C++ 68.0" data-view-component="true" class="Progress-item color-bg-success-emphasis"></span> <span style="background-color:#3572A5 !important;;width: 14.2%;" itemprop="keywords" aria-label="Python 14.2" data-view-component="true" class="Progress-item color-bg-success-emphasis"></span> <span style="background-color:#DA3434 !important;;width: 10.7%;" itemprop="keywords" aria-label="CMake 10.7" data-view-component="true" class="Progress-item color-bg-success-emphasis"></span> <span style="background-color:#6866fb !important;;width: 2.8%;" itemprop="keywords" aria-label="Objective-C++ 2.8" data-view-component="true" class="Progress-item color-bg-success-emphasis"></span> <span style="background-color:#438eff !important;;width: 2.1%;" itemprop="keywords" aria-label="Objective-C 2.1" data-view-component="true" class="Progress-item color-bg-success-emphasis"></span> <span style="background-color:#3A4E3A !important;;width: 0.8%;" itemprop="keywords" aria-label="Cuda 0.8" data-view-component="true" class="Progress-item color-bg-success-emphasis"></span> <span style="background-color:#ededed !important;;width: 1.4%;" itemprop="keywords" aria-label="Other 1.4" data-view-component="true" class="Progress-item color-bg-success-emphasis"></span> </span></div> <ul class="list-style-none"> <li class="d-inline"> <a class="d-inline-flex flex-items-center flex-nowrap Link--secondary no-underline text-small mr-3" href="/RenderKit/oidn/search?l=c%2B%2B" data-ga-click="Repository, language stats search click, location:repo overview"> <svg style="color:#f34b7d;" aria-hidden="true" height="16" viewBox="0 0 16 16" version="1.1" width="16" data-view-component="true" class="octicon octicon-dot-fill mr-2"> <path d="M8 4a4 4 0 1 1 0 8 4 4 0 0 1 0-8Z"></path> </svg> <span class="color-fg-default text-bold mr-1">C++</span> <span>68.0%</span> </a> </li> <li class="d-inline"> <a class="d-inline-flex flex-items-center flex-nowrap Link--secondary no-underline text-small mr-3" href="/RenderKit/oidn/search?l=python" data-ga-click="Repository, language stats search click, location:repo overview"> <svg style="color:#3572A5;" aria-hidden="true" height="16" viewBox="0 0 16 16" version="1.1" width="16" data-view-component="true" class="octicon octicon-dot-fill mr-2"> <path d="M8 4a4 4 0 1 1 0 8 4 4 0 0 1 0-8Z"></path> </svg> <span class="color-fg-default text-bold mr-1">Python</span> <span>14.2%</span> </a> </li> <li class="d-inline"> <a class="d-inline-flex flex-items-center flex-nowrap Link--secondary no-underline text-small mr-3" href="/RenderKit/oidn/search?l=cmake" data-ga-click="Repository, language stats search click, location:repo overview"> <svg style="color:#DA3434;" aria-hidden="true" height="16" viewBox="0 0 16 16" version="1.1" width="16" data-view-component="true" class="octicon octicon-dot-fill mr-2"> <path d="M8 4a4 4 0 1 1 0 8 4 4 0 0 1 0-8Z"></path> </svg> <span class="color-fg-default text-bold mr-1">CMake</span> <span>10.7%</span> </a> </li> <li class="d-inline"> <a class="d-inline-flex flex-items-center flex-nowrap Link--secondary no-underline text-small mr-3" href="/RenderKit/oidn/search?l=objective-c%2B%2B" data-ga-click="Repository, language stats search click, location:repo overview"> <svg style="color:#6866fb;" aria-hidden="true" height="16" viewBox="0 0 16 16" version="1.1" width="16" data-view-component="true" class="octicon octicon-dot-fill mr-2"> <path d="M8 4a4 4 0 1 1 0 8 4 4 0 0 1 0-8Z"></path> </svg> <span class="color-fg-default text-bold mr-1">Objective-C++</span> <span>2.8%</span> </a> </li> <li class="d-inline"> <a class="d-inline-flex flex-items-center flex-nowrap Link--secondary no-underline text-small mr-3" href="/RenderKit/oidn/search?l=objective-c" data-ga-click="Repository, language stats search click, location:repo overview"> <svg style="color:#438eff;" aria-hidden="true" height="16" viewBox="0 0 16 16" version="1.1" width="16" data-view-component="true" class="octicon octicon-dot-fill mr-2"> <path d="M8 4a4 4 0 1 1 0 8 4 4 0 0 1 0-8Z"></path> </svg> <span class="color-fg-default text-bold mr-1">Objective-C</span> <span>2.1%</span> </a> </li> <li class="d-inline"> <a class="d-inline-flex flex-items-center flex-nowrap Link--secondary no-underline text-small mr-3" href="/RenderKit/oidn/search?l=cuda" data-ga-click="Repository, language stats search click, location:repo overview"> <svg style="color:#3A4E3A;" aria-hidden="true" height="16" viewBox="0 0 16 16" version="1.1" width="16" data-view-component="true" class="octicon octicon-dot-fill mr-2"> <path d="M8 4a4 4 0 1 1 0 8 4 4 0 0 1 0-8Z"></path> </svg> <span class="color-fg-default text-bold mr-1">Cuda</span> <span>0.8%</span> </a> </li> <li class="d-inline"> <span class="d-inline-flex flex-items-center flex-nowrap text-small mr-3"> <svg style="color:#ededed;" aria-hidden="true" height="16" viewBox="0 0 16 16" version="1.1" width="16" data-view-component="true" class="octicon octicon-dot-fill mr-2"> <path d="M8 4a4 4 0 1 1 0 8 4 4 0 0 1 0-8Z"></path> </svg> <span class="color-fg-default text-bold mr-1">Other</span> <span>1.4%</span> </span> </li> </ul> </div> </div> </div> </div> </div></div> </div> </div> </turbo-frame> </main> </div> </div> <footer class="footer pt-8 pb-6 f6 color-fg-muted p-responsive" role="contentinfo" > <h2 class='sr-only'>Footer</h2> <div class="d-flex flex-justify-center flex-items-center flex-column-reverse flex-lg-row flex-wrap flex-lg-nowrap"> <div class="d-flex flex-items-center flex-shrink-0 mx-2"> <a aria-label="Homepage" title="GitHub" class="footer-octicon mr-2" href="https://github.com"> <svg aria-hidden="true" height="24" viewBox="0 0 24 24" version="1.1" width="24" data-view-component="true" class="octicon octicon-mark-github"> <path d="M12.5.75C6.146.75 1 5.896 1 12.25c0 5.089 3.292 9.387 7.863 10.91.575.101.79-.244.79-.546 0-.273-.014-1.178-.014-2.142-2.889.532-3.636-.704-3.866-1.35-.13-.331-.69-1.352-1.18-1.625-.402-.216-.977-.748-.014-.762.906-.014 1.553.834 1.769 1.179 1.035 1.74 2.688 1.25 3.349.948.1-.747.402-1.25.733-1.538-2.559-.287-5.232-1.279-5.232-5.678 0-1.25.445-2.285 1.178-3.09-.115-.288-.517-1.467.115-3.048 0 0 .963-.302 3.163 1.179.92-.259 1.897-.388 2.875-.388.977 0 1.955.13 2.875.388 2.2-1.495 3.162-1.179 3.162-1.179.633 1.581.23 2.76.115 3.048.733.805 1.179 1.825 1.179 3.09 0 4.413-2.688 5.39-5.247 5.678.417.36.776 1.05.776 2.128 0 1.538-.014 2.774-.014 3.162 0 .302.216.662.79.547C20.709 21.637 24 17.324 24 12.25 24 5.896 18.854.75 12.5.75Z"></path> </svg> </a> <span> © 2024 GitHub, Inc. </span> </div> <nav aria-label="Footer"> <h3 class="sr-only" id="sr-footer-heading">Footer navigation</h3> <ul class="list-style-none d-flex flex-justify-center flex-wrap mb-2 mb-lg-0" aria-labelledby="sr-footer-heading"> <li class="mx-2"> <a data-analytics-event="{"category":"Footer","action":"go to Terms","label":"text:terms"}" href="https://docs.github.com/site-policy/github-terms/github-terms-of-service" data-view-component="true" class="Link--secondary Link">Terms</a> </li> <li class="mx-2"> <a data-analytics-event="{"category":"Footer","action":"go to privacy","label":"text:privacy"}" href="https://docs.github.com/site-policy/privacy-policies/github-privacy-statement" data-view-component="true" class="Link--secondary Link">Privacy</a> </li> <li class="mx-2"> <a data-analytics-event="{"category":"Footer","action":"go to security","label":"text:security"}" href="https://github.com/security" data-view-component="true" class="Link--secondary Link">Security</a> </li> <li class="mx-2"> <a data-analytics-event="{"category":"Footer","action":"go to status","label":"text:status"}" href="https://www.githubstatus.com/" data-view-component="true" class="Link--secondary Link">Status</a> </li> <li class="mx-2"> <a data-analytics-event="{"category":"Footer","action":"go to docs","label":"text:docs"}" href="https://docs.github.com/" data-view-component="true" class="Link--secondary Link">Docs</a> </li> <li class="mx-2"> <a data-analytics-event="{"category":"Footer","action":"go to contact","label":"text:contact"}" href="https://support.github.com?tags=dotcom-footer" data-view-component="true" class="Link--secondary Link">Contact</a> </li> <li class="mx-2" > <cookie-consent-link> <button type="button" class="Link--secondary underline-on-hover border-0 p-0 color-bg-transparent" data-action="click:cookie-consent-link#showConsentManagement" data-analytics-event="{"location":"footer","action":"cookies","context":"subfooter","tag":"link","label":"cookies_link_subfooter_footer"}" > Manage cookies </button> </cookie-consent-link> </li> <li class="mx-2"> <cookie-consent-link> <button type="button" class="Link--secondary underline-on-hover border-0 p-0 color-bg-transparent" data-action="click:cookie-consent-link#showConsentManagement" data-analytics-event="{"location":"footer","action":"dont_share_info","context":"subfooter","tag":"link","label":"dont_share_info_link_subfooter_footer"}" > Do not share my personal information </button> </cookie-consent-link> </li> </ul> </nav> </div> </footer> <ghcc-consent id="ghcc" class="position-fixed bottom-0 left-0" style="z-index: 999999" data-initial-cookie-consent-allowed="" data-cookie-consent-required="false"></ghcc-consent> <div id="ajax-error-message" class="ajax-error-message flash flash-error" hidden> <svg aria-hidden="true" height="16" viewBox="0 0 16 16" version="1.1" width="16" data-view-component="true" class="octicon octicon-alert"> <path d="M6.457 1.047c.659-1.234 2.427-1.234 3.086 0l6.082 11.378A1.75 1.75 0 0 1 14.082 15H1.918a1.75 1.75 0 0 1-1.543-2.575Zm1.763.707a.25.25 0 0 0-.44 0L1.698 13.132a.25.25 0 0 0 .22.368h12.164a.25.25 0 0 0 .22-.368Zm.53 3.996v2.5a.75.75 0 0 1-1.5 0v-2.5a.75.75 0 0 1 1.5 0ZM9 11a1 1 0 1 1-2 0 1 1 0 0 1 2 0Z"></path> </svg> <button type="button" class="flash-close js-ajax-error-dismiss" aria-label="Dismiss error"> <svg aria-hidden="true" height="16" viewBox="0 0 16 16" version="1.1" width="16" data-view-component="true" class="octicon octicon-x"> <path d="M3.72 3.72a.75.75 0 0 1 1.06 0L8 6.94l3.22-3.22a.749.749 0 0 1 1.275.326.749.749 0 0 1-.215.734L9.06 8l3.22 3.22a.749.749 0 0 1-.326 1.275.749.749 0 0 1-.734-.215L8 9.06l-3.22 3.22a.751.751 0 0 1-1.042-.018.751.751 0 0 1-.018-1.042L6.94 8 3.72 4.78a.75.75 0 0 1 0-1.06Z"></path> </svg> </button> You can’t perform that action at this time. </div> <template id="site-details-dialog"> <details class="details-reset details-overlay details-overlay-dark lh-default color-fg-default hx_rsm" open> <summary role="button" aria-label="Close dialog"></summary> <details-dialog class="Box Box--overlay d-flex flex-column anim-fade-in fast hx_rsm-dialog hx_rsm-modal"> <button class="Box-btn-octicon m-0 btn-octicon position-absolute right-0 top-0" type="button" aria-label="Close dialog" data-close-dialog> <svg aria-hidden="true" height="16" viewBox="0 0 16 16" version="1.1" width="16" data-view-component="true" class="octicon octicon-x"> <path d="M3.72 3.72a.75.75 0 0 1 1.06 0L8 6.94l3.22-3.22a.749.749 0 0 1 1.275.326.749.749 0 0 1-.215.734L9.06 8l3.22 3.22a.749.749 0 0 1-.326 1.275.749.749 0 0 1-.734-.215L8 9.06l-3.22 3.22a.751.751 0 0 1-1.042-.018.751.751 0 0 1-.018-1.042L6.94 8 3.72 4.78a.75.75 0 0 1 0-1.06Z"></path> </svg> </button> <div class="octocat-spinner my-6 js-details-dialog-spinner"></div> </details-dialog> </details> </template> <div class="Popover js-hovercard-content position-absolute" style="display: none; outline: none;"> <div class="Popover-message Popover-message--bottom-left Popover-message--large Box color-shadow-large" style="width:360px;"> </div> </div> <template id="snippet-clipboard-copy-button"> <div class="zeroclipboard-container position-absolute right-0 top-0"> <clipboard-copy aria-label="Copy" class="ClipboardButton btn js-clipboard-copy m-2 p-0" data-copy-feedback="Copied!" data-tooltip-direction="w"> <svg aria-hidden="true" height="16" viewBox="0 0 16 16" version="1.1" width="16" data-view-component="true" class="octicon octicon-copy js-clipboard-copy-icon m-2"> <path d="M0 6.75C0 5.784.784 5 1.75 5h1.5a.75.75 0 0 1 0 1.5h-1.5a.25.25 0 0 0-.25.25v7.5c0 .138.112.25.25.25h7.5a.25.25 0 0 0 .25-.25v-1.5a.75.75 0 0 1 1.5 0v1.5A1.75 1.75 0 0 1 9.25 16h-7.5A1.75 1.75 0 0 1 0 14.25Z"></path><path d="M5 1.75C5 .784 5.784 0 6.75 0h7.5C15.216 0 16 .784 16 1.75v7.5A1.75 1.75 0 0 1 14.25 11h-7.5A1.75 1.75 0 0 1 5 9.25Zm1.75-.25a.25.25 0 0 0-.25.25v7.5c0 .138.112.25.25.25h7.5a.25.25 0 0 0 .25-.25v-7.5a.25.25 0 0 0-.25-.25Z"></path> </svg> <svg aria-hidden="true" height="16" viewBox="0 0 16 16" version="1.1" width="16" data-view-component="true" class="octicon octicon-check js-clipboard-check-icon color-fg-success d-none m-2"> <path d="M13.78 4.22a.75.75 0 0 1 0 1.06l-7.25 7.25a.75.75 0 0 1-1.06 0L2.22 9.28a.751.751 0 0 1 .018-1.042.751.751 0 0 1 1.042-.018L6 10.94l6.72-6.72a.75.75 0 0 1 1.06 0Z"></path> </svg> </clipboard-copy> </div> </template> <template id="snippet-clipboard-copy-button-unpositioned"> <div class="zeroclipboard-container"> <clipboard-copy aria-label="Copy" class="ClipboardButton btn btn-invisible js-clipboard-copy m-2 p-0 d-flex flex-justify-center flex-items-center" data-copy-feedback="Copied!" data-tooltip-direction="w"> <svg aria-hidden="true" height="16" viewBox="0 0 16 16" version="1.1" width="16" data-view-component="true" class="octicon octicon-copy js-clipboard-copy-icon"> <path d="M0 6.75C0 5.784.784 5 1.75 5h1.5a.75.75 0 0 1 0 1.5h-1.5a.25.25 0 0 0-.25.25v7.5c0 .138.112.25.25.25h7.5a.25.25 0 0 0 .25-.25v-1.5a.75.75 0 0 1 1.5 0v1.5A1.75 1.75 0 0 1 9.25 16h-7.5A1.75 1.75 0 0 1 0 14.25Z"></path><path d="M5 1.75C5 .784 5.784 0 6.75 0h7.5C15.216 0 16 .784 16 1.75v7.5A1.75 1.75 0 0 1 14.25 11h-7.5A1.75 1.75 0 0 1 5 9.25Zm1.75-.25a.25.25 0 0 0-.25.25v7.5c0 .138.112.25.25.25h7.5a.25.25 0 0 0 .25-.25v-7.5a.25.25 0 0 0-.25-.25Z"></path> </svg> <svg aria-hidden="true" height="16" viewBox="0 0 16 16" version="1.1" width="16" data-view-component="true" class="octicon octicon-check js-clipboard-check-icon color-fg-success d-none"> <path d="M13.78 4.22a.75.75 0 0 1 0 1.06l-7.25 7.25a.75.75 0 0 1-1.06 0L2.22 9.28a.751.751 0 0 1 .018-1.042.751.751 0 0 1 1.042-.018L6 10.94l6.72-6.72a.75.75 0 0 1 1.06 0Z"></path> </svg> </clipboard-copy> </div> </template> </div> <div id="js-global-screen-reader-notice" class="sr-only mt-n1" aria-live="polite" aria-atomic="true" ></div> <div id="js-global-screen-reader-notice-assertive" class="sr-only mt-n1" aria-live="assertive" aria-atomic="true"></div> </body> </html>