modify duplicator state handling.

This commit is contained in:
hecomi
2017-01-07 13:26:28 +09:00
parent f5a8a83c7e
commit c0e1967e2e
4 changed files with 19 additions and 13 deletions
@@ -162,7 +162,12 @@ void Duplicator::Start()
});
const auto timeout = static_cast<UINT>(frameMilliSeconds);
if (!Duplicate(timeout)) break;
Duplicate(timeout);
if (state_ != State::Running)
{
break;
}
}
if (state_ == State::Running)
@@ -229,9 +234,9 @@ const Duplicator::Frame& Duplicator::GetLastFrame() const
}
bool Duplicator::Duplicate(UINT timeout)
void Duplicator::Duplicate(UINT timeout)
{
if (!dupl_ || !device_) return false;
if (!dupl_ || !device_) return;
ComPtr<IDXGIResource> resource;
DXGI_OUTDUPL_FRAME_INFO frameInfo;
@@ -247,31 +252,32 @@ bool Duplicator::Duplicate(UINT timeout)
// it is necessary to re-initialize monitors.
Debug::Log("Duplicator::Duplicate() => DXGI_ERROR_ACCESS_LOST.");
state_ = State::AccessLost;
return false;
break;
}
case DXGI_ERROR_WAIT_TIMEOUT:
{
// This often occurs when timeout value is small and it is not problem.
// Debug::Log("Duplicator::Duplicate() => DXGI_ERROR_WAIT_TIMEOUT.");
return true;
break;
}
case DXGI_ERROR_INVALID_CALL:
{
Debug::Error("Duplicator::Duplicate() => DXGI_ERROR_INVALID_CALL.");
return false;
break;
}
case E_INVALIDARG:
{
Debug::Error("Duplicator::Duplicate() => E_INVALIDARG.");
return false;
break;
}
default:
{
state_ = State::Unknown;
Debug::Error("Duplicator::Duplicate() => Unknown Error.");
return false;
break;
}
}
return;
}
ScopedReleaser releaser([this]
@@ -305,13 +311,15 @@ bool Duplicator::Duplicate(UINT timeout)
ComPtr<ID3D11Texture2D> texture;
if (FAILED(resource.As(&texture)))
{
return false;
Debug::Error("Duplicator::Duplicate() => IDXGIResource could not be converted to ID3D11Texture2D.");
return;
}
auto sharedTexture = device_->GetCompatibleSharedTexture(texture, lastFrameId_ % 2);
if (!sharedTexture)
{
return false;
Debug::Error("Duplicator::Duplicate() => Shared Texture was null.");
return;
}
ComPtr<ID3D11DeviceContext> context;
@@ -331,8 +339,6 @@ bool Duplicator::Duplicate(UINT timeout)
metaData_
};
}
return true;
}
@@ -67,7 +67,7 @@ private:
void InitializeDuplication();
void CheckUnityAdapter();
bool Duplicate(UINT timeout);
void Duplicate(UINT timeout);
void UpdateCursor(
const Microsoft::WRL::ComPtr<ID3D11Texture2D>& texture,