diff --git a/host/platform/Windows/capture/D12/backend.h b/host/platform/Windows/capture/D12/backend.h index e9dc4b80..5984d4b8 100644 --- a/host/platform/Windows/capture/D12/backend.h +++ b/host/platform/Windows/capture/D12/backend.h @@ -59,10 +59,11 @@ struct D12Backend ID3D12CommandQueue * commandQueue); ID3D12Resource * (*fetch)( - D12Backend * instance, - unsigned frameBufferIndex, - RECT ** dirtyRects, - unsigned * nbDirtyRects); + D12Backend * instance, + unsigned frameBufferIndex, + RECT ** dirtyRects, + unsigned * nbDirtyRects, + CaptureRotation * rotation); }; static inline bool d12_backendCreate(const D12Backend * backend, @@ -97,9 +98,10 @@ static inline CaptureResult d12_backendSync(D12Backend * instance, { return instance->sync(instance, commandQueue); } static inline ID3D12Resource * d12_backendFetch(D12Backend * instance, - unsigned frameBufferIndex, RECT ** dirtyRects, unsigned * nbDirtyRects) + unsigned frameBufferIndex, RECT ** dirtyRects, unsigned * nbDirtyRects, + CaptureRotation * rotation) { return instance->fetch(instance, frameBufferIndex, dirtyRects, - nbDirtyRects); } + nbDirtyRects, rotation); } // Backend defines diff --git a/host/platform/Windows/capture/D12/backend/dd.c b/host/platform/Windows/capture/D12/backend/dd.c index f251735c..d7bb7026 100644 --- a/host/platform/Windows/capture/D12/backend/dd.c +++ b/host/platform/Windows/capture/D12/backend/dd.c @@ -66,6 +66,7 @@ typedef struct DDInstance ID3D11Device5 ** device; ID3D11DeviceContext4 ** context; IDXGIOutputDuplication ** dup; + CaptureRotation rotation; bool release; DDCacheInfo cache[CACHE_SIZE]; @@ -261,6 +262,28 @@ static bool d12_dd_init( goto exit; } + DXGI_OUTDUPL_DESC dupDesc; + IDXGIOutputDuplication_GetDesc(*dup, &dupDesc); + switch(dupDesc.Rotation) + { + case DXGI_MODE_ROTATION_UNSPECIFIED: + case DXGI_MODE_ROTATION_IDENTITY: + this->rotation = CAPTURE_ROT_0; + break; + + case DXGI_MODE_ROTATION_ROTATE90: + this->rotation = CAPTURE_ROT_90; + break; + + case DXGI_MODE_ROTATION_ROTATE180: + this->rotation = CAPTURE_ROT_180; + break; + + case DXGI_MODE_ROTATION_ROTATE270: + this->rotation = CAPTURE_ROT_270; + break; + } + ID3D12Device3_AddRef(device); comRef_toGlobal(this->d12device, &device ); comRef_toGlobal(this->device , d11device5 ); @@ -419,7 +442,7 @@ static CaptureResult d12_dd_sync(D12Backend * instance, static ID3D12Resource * d12_dd_fetch(D12Backend * instance, unsigned frameBufferIndex, RECT * dirtyRects[static D12_MAX_DIRTY_RECTS], - unsigned * nbDirtyRects) + unsigned * nbDirtyRects, CaptureRotation * rotation) { DDInstance * this = UPCAST(DDInstance, instance); @@ -428,6 +451,7 @@ static ID3D12Resource * d12_dd_fetch(D12Backend * instance, *dirtyRects = this->current->dirtyRects; *nbDirtyRects = this->current->nbDirtyRects; + *rotation = this->rotation; ID3D12Resource_AddRef(*this->current->d12Res); return *this->current->d12Res; diff --git a/host/platform/Windows/capture/D12/d12.c b/host/platform/Windows/capture/D12/d12.c index ee959f8f..fde17ee5 100644 --- a/host/platform/Windows/capture/D12/d12.c +++ b/host/platform/Windows/capture/D12/d12.c @@ -430,10 +430,11 @@ static CaptureResult d12_waitFrame(unsigned frameBufferIndex, RECT * dirtyRects; unsigned nbDirtyRects; + CaptureRotation rotation; comRef_defineLocal(ID3D12Resource, src); *src = d12_backendFetch(this->backend, frameBufferIndex, - &dirtyRects, &nbDirtyRects); + &dirtyRects, &nbDirtyRects, &rotation); if (!*src) { DEBUG_ERROR("D12 backend failed to produce an expected frame: %u", @@ -503,7 +504,7 @@ static CaptureResult d12_waitFrame(unsigned frameBufferIndex, CAPTURE_FMT_BGR_32 : CAPTURE_FMT_BGRA; frame->hdr = false; frame->hdrPQ = false; - frame->rotation = CAPTURE_ROT_0; + frame->rotation = rotation; { // create a clean list of rects @@ -545,10 +546,11 @@ static CaptureResult d12_getFrame(unsigned frameBufferIndex, RECT * dirtyRects; unsigned nbDirtyRects; + CaptureRotation rotation; comRef_defineLocal(ID3D12Resource, src); *src = d12_backendFetch(this->backend, frameBufferIndex, - &dirtyRects, &nbDirtyRects); + &dirtyRects, &nbDirtyRects, &rotation); if (!*src) { DEBUG_ERROR("D12 backend failed to produce an expected frame: %u",