69 lines
1.8 KiB
C++
69 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(nullptr, FALSE, FALSE, nullptr);
|
|
}
|
|
|
|
nvenc_d3d11::~nvenc_d3d11() {
|
|
if (dll) {
|
|
FreeLibrary(dll);
|
|
dll = nullptr;
|
|
}
|
|
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, nullptr, 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 = nullptr;
|
|
}
|
|
|
|
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
|