Skip encoder reprobing if no GPU changes have occurred
This commit is contained in:
@@ -558,6 +558,13 @@ namespace platf {
|
||||
std::vector<std::string>
|
||||
display_names(mem_type_e hwdevice_type);
|
||||
|
||||
/**
|
||||
* @brief Returns if GPUs/drivers have changed since the last call to this function.
|
||||
* @return `true` if a change has occurred or if it is unknown whether a change occurred.
|
||||
*/
|
||||
bool
|
||||
needs_encoder_reenumeration();
|
||||
|
||||
boost::process::child
|
||||
run_command(bool elevated, bool interactive, const std::string &cmd, boost::filesystem::path &working_dir, const boost::process::environment &env, FILE *file, std::error_code &ec, boost::process::group *group);
|
||||
|
||||
|
||||
@@ -773,6 +773,16 @@ namespace platf {
|
||||
return {};
|
||||
}
|
||||
|
||||
/**
|
||||
* @brief Returns if GPUs/drivers have changed since the last call to this function.
|
||||
* @return `true` if a change has occurred or if it is unknown whether a change occurred.
|
||||
*/
|
||||
bool
|
||||
needs_encoder_reenumeration() {
|
||||
// We don't track GPU state, so we will always reenumerate. Fortunately, it is fast on Linux.
|
||||
return true;
|
||||
}
|
||||
|
||||
std::shared_ptr<display_t>
|
||||
display(mem_type_e hwdevice_type, const std::string &display_name, const video::config_t &config) {
|
||||
#ifdef SUNSHINE_BUILD_CUDA
|
||||
|
||||
@@ -181,4 +181,14 @@ namespace platf {
|
||||
|
||||
return display_names;
|
||||
}
|
||||
|
||||
/**
|
||||
* @brief Returns if GPUs/drivers have changed since the last call to this function.
|
||||
* @return `true` if a change has occurred or if it is unknown whether a change occurred.
|
||||
*/
|
||||
bool
|
||||
needs_encoder_reenumeration() {
|
||||
// We don't track GPU state, so we will always reenumerate. Fortunately, it is fast on macOS.
|
||||
return true;
|
||||
}
|
||||
} // namespace platf
|
||||
|
||||
@@ -1124,4 +1124,35 @@ namespace platf {
|
||||
return display_names;
|
||||
}
|
||||
|
||||
/**
|
||||
* @brief Returns if GPUs/drivers have changed since the last call to this function.
|
||||
* @return `true` if a change has occurred or if it is unknown whether a change occurred.
|
||||
*/
|
||||
bool
|
||||
needs_encoder_reenumeration() {
|
||||
// Serialize access to the static DXGI factory
|
||||
static std::mutex reenumeration_state_lock;
|
||||
auto lg = std::lock_guard(reenumeration_state_lock);
|
||||
|
||||
// Keep a reference to the DXGI factory, which will keep track of changes internally.
|
||||
static dxgi::factory1_t factory;
|
||||
if (!factory || !factory->IsCurrent()) {
|
||||
factory.reset();
|
||||
|
||||
auto status = CreateDXGIFactory1(IID_IDXGIFactory1, (void **) &factory);
|
||||
if (FAILED(status)) {
|
||||
BOOST_LOG(error) << "Failed to create DXGIFactory1 [0x"sv << util::hex(status).to_string_view() << ']';
|
||||
factory.release();
|
||||
}
|
||||
|
||||
// Always request reenumeration on the first streaming session just to ensure we
|
||||
// can deal with any initialization races that may occur when the system is booting.
|
||||
BOOST_LOG(info) << "Encoder reenumeration is required"sv;
|
||||
return true;
|
||||
}
|
||||
else {
|
||||
// The DXGI factory from last time is still current, so no encoder changes have occurred.
|
||||
return false;
|
||||
}
|
||||
}
|
||||
} // namespace platf
|
||||
|
||||
Reference in New Issue
Block a user