[host] d12: disable RGB24 if the capture is HDR

This commit is contained in:
Geoffrey McRae 2024-02-28 07:46:47 +11:00
parent 5c4540ed8b
commit b87d8d2f33
3 changed files with 24 additions and 7 deletions

View File

@ -66,9 +66,10 @@ struct D12Backend
struct D12FetchDesc struct D12FetchDesc
{ {
CaptureRotation rotation; CaptureRotation rotation;
RECT * dirtyRects; RECT * dirtyRects;
unsigned nbDirtyRects; unsigned nbDirtyRects;
DXGI_COLOR_SPACE_TYPE colorSpace;
}; };
static inline bool d12_backendCreate(const D12Backend * backend, static inline bool d12_backendCreate(const D12Backend * backend,

View File

@ -67,6 +67,7 @@ typedef struct DDInstance
ID3D11DeviceContext4 ** context; ID3D11DeviceContext4 ** context;
IDXGIOutputDuplication ** dup; IDXGIOutputDuplication ** dup;
CaptureRotation rotation; CaptureRotation rotation;
DXGI_COLOR_SPACE_TYPE colorSpace;
bool release; bool release;
DDCacheInfo cache[CACHE_SIZE]; DDCacheInfo cache[CACHE_SIZE];
@ -284,6 +285,17 @@ static bool d12_dd_init(
break; break;
} }
comRef_defineLocal(IDXGIOutput6, output6);
hr = IDXGIOutput_QueryInterface(output, &IID_IDXGIOutput6, (void **)output6);
if (FAILED(hr))
this->colorSpace = DXGI_COLOR_SPACE_RGB_FULL_G22_NONE_P709;
else
{
DXGI_OUTPUT_DESC1 desc1;
IDXGIOutput6_GetDesc1(*output6, &desc1);
this->colorSpace = desc1.ColorSpace;
}
ID3D12Device3_AddRef(device); ID3D12Device3_AddRef(device);
comRef_toGlobal(this->d12device, &device ); comRef_toGlobal(this->d12device, &device );
comRef_toGlobal(this->device , d11device5 ); comRef_toGlobal(this->device , d11device5 );
@ -451,6 +463,7 @@ static ID3D12Resource * d12_dd_fetch(D12Backend * instance,
desc->dirtyRects = this->current->dirtyRects; desc->dirtyRects = this->current->dirtyRects;
desc->nbDirtyRects = this->current->nbDirtyRects; desc->nbDirtyRects = this->current->nbDirtyRects;
desc->rotation = this->rotation; desc->rotation = this->rotation;
desc->colorSpace = this->colorSpace;
ID3D12Resource_AddRef(*this->current->d12Res); ID3D12Resource_AddRef(*this->current->d12Res);
return *this->current->d12Res; return *this->current->d12Res;

View File

@ -499,7 +499,8 @@ static CaptureResult d12_waitFrame(unsigned frameBufferIndex,
frame->stride = layout.Footprint.RowPitch / 4; frame->stride = layout.Footprint.RowPitch / 4;
frame->format = this->allowRGB24 ? frame->format = this->allowRGB24 ?
CAPTURE_FMT_BGR_32 : CAPTURE_FMT_BGRA; CAPTURE_FMT_BGR_32 : CAPTURE_FMT_BGRA;
frame->hdr = false; frame->hdr = desc.colorSpace ==
DXGI_COLOR_SPACE_RGB_FULL_G2084_NONE_P2020;
frame->hdrPQ = false; frame->hdrPQ = false;
frame->rotation = desc.rotation; frame->rotation = desc.rotation;
@ -565,8 +566,10 @@ static CaptureResult d12_getFrame(unsigned frameBufferIndex,
if (result != CAPTURE_RESULT_OK) if (result != CAPTURE_RESULT_OK)
goto exit; goto exit;
const bool isSDR = desc.colorSpace == DXGI_COLOR_SPACE_RGB_FULL_G22_NONE_P709;
ID3D12Resource * next = *src; ID3D12Resource * next = *src;
if (this->allowRGB24) if (this->allowRGB24 && isSDR)
{ {
next = d12_effectRun( next = d12_effectRun(
this->effectRGB24, *this->device, *this->computeCommand.gfxList, next, this->effectRGB24, *this->device, *this->computeCommand.gfxList, next,
@ -671,7 +674,7 @@ static CaptureResult d12_getFrame(unsigned frameBufferIndex,
} }
// execute the compute commands // execute the compute commands
if (this->allowRGB24) if (this->allowRGB24 && isSDR)
{ {
d12_commandGroupExecute(*this->computeQueue, &this->computeCommand); d12_commandGroupExecute(*this->computeQueue, &this->computeCommand);
@ -691,7 +694,7 @@ static CaptureResult d12_getFrame(unsigned frameBufferIndex,
this->dstFormat.Height * this->pitch); this->dstFormat.Height * this->pitch);
// reset the command queues // reset the command queues
if (this->allowRGB24) if (this->allowRGB24 && isSDR)
if (!d12_commandGroupReset(&this->computeCommand)) if (!d12_commandGroupReset(&this->computeCommand))
goto exit; goto exit;