mirror of
https://github.com/gnif/LookingGlass.git
synced 2025-01-03 19:27:10 +00:00
[host] dxgi: populate damage rectangles
Co-Authored-By: Quantum <quantum2048@gmail.com>
This commit is contained in:
parent
80ab4b5393
commit
d7f9afb3ba
1 changed files with 32 additions and 8 deletions
|
@ -27,6 +27,7 @@
|
||||||
#include "common/event.h"
|
#include "common/event.h"
|
||||||
#include "common/dpi.h"
|
#include "common/dpi.h"
|
||||||
#include "common/runningavg.h"
|
#include "common/runningavg.h"
|
||||||
|
#include "common/KVMFR.h"
|
||||||
|
|
||||||
#include <assert.h>
|
#include <assert.h>
|
||||||
#include <stdatomic.h>
|
#include <stdatomic.h>
|
||||||
|
@ -53,6 +54,8 @@ typedef struct Texture
|
||||||
ID3D11Texture2D * tex;
|
ID3D11Texture2D * tex;
|
||||||
D3D11_MAPPED_SUBRESOURCE map;
|
D3D11_MAPPED_SUBRESOURCE map;
|
||||||
uint64_t copyTime;
|
uint64_t copyTime;
|
||||||
|
uint8_t damageRectsCount;
|
||||||
|
RECT damageRects[KVMFR_MAX_DAMAGE_RECTS];
|
||||||
}
|
}
|
||||||
Texture;
|
Texture;
|
||||||
|
|
||||||
|
@ -782,6 +785,15 @@ static CaptureResult dxgi_capture(void)
|
||||||
tex->copyTime = microtime();
|
tex->copyTime = microtime();
|
||||||
ID3D11DeviceContext_CopyResource(this->deviceContext,
|
ID3D11DeviceContext_CopyResource(this->deviceContext,
|
||||||
(ID3D11Resource *)tex->tex, (ID3D11Resource *)src);
|
(ID3D11Resource *)tex->tex, (ID3D11Resource *)src);
|
||||||
|
|
||||||
|
UINT damageRectsBufferSizeRequired;
|
||||||
|
if (IDXGIOutputDuplication_GetFrameDirtyRects(this->dup, KVMFR_MAX_DAMAGE_RECTS,
|
||||||
|
tex->damageRects, &damageRectsBufferSizeRequired) == S_OK)
|
||||||
|
tex->damageRectsCount = damageRectsBufferSizeRequired / sizeof(*tex->damageRects);
|
||||||
|
else
|
||||||
|
// Either received too many damage regions or hit another error;
|
||||||
|
// damage the full frame instead.
|
||||||
|
tex->damageRectsCount = 0;
|
||||||
}
|
}
|
||||||
|
|
||||||
if (copyPointer)
|
if (copyPointer)
|
||||||
|
@ -930,14 +942,26 @@ static CaptureResult dxgi_waitFrame(CaptureFrame * frame, const size_t maxFrameS
|
||||||
|
|
||||||
const unsigned int maxHeight = maxFrameSize / this->pitch;
|
const unsigned int maxHeight = maxFrameSize / this->pitch;
|
||||||
|
|
||||||
frame->formatVer = tex->formatVer;
|
frame->formatVer = tex->formatVer;
|
||||||
frame->width = this->width;
|
frame->width = this->width;
|
||||||
frame->height = maxHeight > this->height ? this->height : maxHeight;
|
frame->height = maxHeight > this->height ? this->height : maxHeight;
|
||||||
frame->realHeight = this->height;
|
frame->realHeight = this->height;
|
||||||
frame->pitch = this->pitch;
|
frame->pitch = this->pitch;
|
||||||
frame->stride = this->stride;
|
frame->stride = this->stride;
|
||||||
frame->format = this->format;
|
frame->format = this->format;
|
||||||
frame->rotation = this->rotation;
|
frame->rotation = this->rotation;
|
||||||
|
|
||||||
|
frame->damageRectsCount = tex->damageRectsCount;
|
||||||
|
for (int i = 0; i < tex->damageRectsCount; i++)
|
||||||
|
{
|
||||||
|
RECT damageRect = tex->damageRects[i];
|
||||||
|
frame->damageRects[i] = (FrameDamageRect) {
|
||||||
|
.x = damageRect.left,
|
||||||
|
.y = damageRect.top,
|
||||||
|
.width = damageRect.right - damageRect.left,
|
||||||
|
.height = damageRect.bottom - damageRect.top
|
||||||
|
};
|
||||||
|
}
|
||||||
|
|
||||||
atomic_fetch_sub_explicit(&this->texReady, 1, memory_order_release);
|
atomic_fetch_sub_explicit(&this->texReady, 1, memory_order_release);
|
||||||
return CAPTURE_RESULT_OK;
|
return CAPTURE_RESULT_OK;
|
||||||
|
|
Loading…
Reference in a new issue