[c-host] dxgi: add more robust error handling on cursor shape failure

Closes #264 - Credit to https://github.com/DataBeaver
This commit is contained in:
Geoffrey McRae 2020-04-12 14:43:50 +10:00
parent 75bc038144
commit 3538e7f6f4
2 changed files with 31 additions and 18 deletions

View File

@ -1 +1 @@
B1-169-g7018a3e737+1 B1-170-g75bc038144+1

View File

@ -644,6 +644,25 @@ static unsigned int dxgi_getMaxFrameSize()
return this->height * this->pitch; return this->height * this->pitch;
} }
static CaptureResult dxgi_hResultToCaptureResult(const HRESULT status)
{
switch(status)
{
case S_OK:
return CAPTURE_RESULT_OK;
case DXGI_ERROR_WAIT_TIMEOUT:
return CAPTURE_RESULT_TIMEOUT;
case WAIT_ABANDONED:
case DXGI_ERROR_ACCESS_LOST:
return CAPTURE_RESULT_REINIT;
default:
return CAPTURE_RESULT_ERROR;
}
}
static CaptureResult dxgi_capture() static CaptureResult dxgi_capture()
{ {
assert(this); assert(this);
@ -669,24 +688,16 @@ static CaptureResult dxgi_capture()
else else
status = IDXGIOutputDuplication_AcquireNextFrame(this->dup, 1000, &frameInfo, &res); status = IDXGIOutputDuplication_AcquireNextFrame(this->dup, 1000, &frameInfo, &res);
switch(status) result = dxgi_hResultToCaptureResult(status);
if (result != CAPTURE_RESULT_OK)
{ {
case S_OK: if (result == CAPTURE_RESULT_ERROR)
this->needsRelease = true;
break;
case DXGI_ERROR_WAIT_TIMEOUT:
return CAPTURE_RESULT_TIMEOUT;
case WAIT_ABANDONED:
case DXGI_ERROR_ACCESS_LOST:
return CAPTURE_RESULT_REINIT;
default:
DEBUG_WINERROR("AcquireNextFrame failed", status); DEBUG_WINERROR("AcquireNextFrame failed", status);
return CAPTURE_RESULT_ERROR; return result;
} }
this->needsRelease = true;
if (frameInfo.LastPresentTime.QuadPart != 0) if (frameInfo.LastPresentTime.QuadPart != 0)
{ {
tex = &this->texture[this->texWIndex]; tex = &this->texture[this->texWIndex];
@ -768,10 +779,12 @@ static CaptureResult dxgi_capture()
DXGI_OUTDUPL_POINTER_SHAPE_INFO shapeInfo; DXGI_OUTDUPL_POINTER_SHAPE_INFO shapeInfo;
LOCKED({status = IDXGIOutputDuplication_GetFramePointerShape(this->dup, bufferSize, pointerShape, &pointerShapeSize, &shapeInfo);}); LOCKED({status = IDXGIOutputDuplication_GetFramePointerShape(this->dup, bufferSize, pointerShape, &pointerShapeSize, &shapeInfo);});
if (FAILED(status)) result = dxgi_hResultToCaptureResult(status);
if (result != CAPTURE_RESULT_OK)
{ {
DEBUG_WINERROR("Failed to get the new pointer shape", status); if (result == CAPTURE_RESULT_ERROR)
return CAPTURE_RESULT_ERROR; DEBUG_WINERROR("Failed to get the new pointer shape", status);
return result;
} }
switch(shapeInfo.Type) switch(shapeInfo.Type)