mirror of
https://github.com/LizardByte/Sunshine.git
synced 2025-08-10 00:52:16 +00:00
Some checks failed
CI / GitHub Env Debug (push) Waiting to run
CI / Setup Release (push) Waiting to run
CI / Setup Flatpak Matrix (push) Waiting to run
CI / Linux Flatpak (push) Blocked by required conditions
CI / Linux ${{ matrix.type }} (--appimage-build, 22.04, AppImage) (push) Blocked by required conditions
CI / Homebrew (${{ matrix.os_name }}-${{ matrix.os_version }}${{ matrix.release == true && ' (Release)' || '' }}) (macos, 13) (push) Blocked by required conditions
CI / Homebrew (${{ matrix.os_name }}-${{ matrix.os_version }}${{ matrix.release == true && ' (Release)' || '' }}) (macos, 14) (push) Blocked by required conditions
CI / Homebrew (${{ matrix.os_name }}-${{ matrix.os_version }}${{ matrix.release == true && ' (Release)' || '' }}) (ubuntu, latest) (push) Blocked by required conditions
CI / Homebrew (${{ matrix.os_name }}-${{ matrix.os_version }}${{ matrix.release == true && ' (Release)' || '' }}) (ubuntu, latest, true) (push) Blocked by required conditions
CI / Windows (push) Blocked by required conditions
CI Docker / Check Dockerfiles (push) Waiting to run
CI Docker / Setup Release (push) Blocked by required conditions
CI Docker / Docker${{ matrix.tag }} (push) Blocked by required conditions
CodeQL / Get language matrix (push) Waiting to run
CodeQL / Analyze (${{ matrix.name }}) (push) Blocked by required conditions
Build GH-Pages / prep (push) Waiting to run
Build GH-Pages / call-jekyll-build (push) Blocked by required conditions
localize / Update Localization (push) Has been cancelled
* feat(nvenc): implement async encode * fix(video): allow NVENC to complete teardown asynchronously
70 lines
1.8 KiB
C++
70 lines
1.8 KiB
C++
/**
|
|
* @file src/nvenc/nvenc_d3d11.cpp
|
|
* @brief Definitions for abstract Direct3D11 NVENC encoder.
|
|
*/
|
|
// local includes
|
|
#include "src/logging.h"
|
|
|
|
#ifdef _WIN32
|
|
#include "nvenc_d3d11.h"
|
|
|
|
namespace nvenc {
|
|
|
|
nvenc_d3d11::nvenc_d3d11(NV_ENC_DEVICE_TYPE device_type):
|
|
nvenc_base(device_type) {
|
|
async_event_handle = CreateEvent(NULL, FALSE, FALSE, NULL);
|
|
}
|
|
|
|
nvenc_d3d11::~nvenc_d3d11() {
|
|
if (dll) {
|
|
FreeLibrary(dll);
|
|
dll = NULL;
|
|
}
|
|
if (async_event_handle) {
|
|
CloseHandle(async_event_handle);
|
|
}
|
|
}
|
|
|
|
bool nvenc_d3d11::init_library() {
|
|
if (dll) {
|
|
return true;
|
|
}
|
|
|
|
#ifdef _WIN64
|
|
constexpr auto dll_name = "nvEncodeAPI64.dll";
|
|
#else
|
|
constexpr auto dll_name = "nvEncodeAPI.dll";
|
|
#endif
|
|
|
|
if ((dll = LoadLibraryEx(dll_name, NULL, LOAD_LIBRARY_SEARCH_SYSTEM32))) {
|
|
if (auto create_instance = (decltype(NvEncodeAPICreateInstance) *) GetProcAddress(dll, "NvEncodeAPICreateInstance")) {
|
|
auto new_nvenc = std::make_unique<NV_ENCODE_API_FUNCTION_LIST>();
|
|
new_nvenc->version = min_struct_version(NV_ENCODE_API_FUNCTION_LIST_VER);
|
|
if (nvenc_failed(create_instance(new_nvenc.get()))) {
|
|
BOOST_LOG(error) << "NvEnc: NvEncodeAPICreateInstance() failed: " << last_nvenc_error_string;
|
|
} else {
|
|
nvenc = std::move(new_nvenc);
|
|
return true;
|
|
}
|
|
} else {
|
|
BOOST_LOG(error) << "NvEnc: No NvEncodeAPICreateInstance() in " << dll_name;
|
|
}
|
|
} else {
|
|
BOOST_LOG(debug) << "NvEnc: Couldn't load NvEnc library " << dll_name;
|
|
}
|
|
|
|
if (dll) {
|
|
FreeLibrary(dll);
|
|
dll = NULL;
|
|
}
|
|
|
|
return false;
|
|
}
|
|
|
|
bool nvenc_d3d11::wait_for_async_event(uint32_t timeout_ms) {
|
|
return WaitForSingleObject(async_event_handle, timeout_ms) == WAIT_OBJECT_0;
|
|
}
|
|
|
|
} // namespace nvenc
|
|
#endif
|