Skip to content

Commit 7de8998

Browse files
add HDR support (#166)
1 parent 2cbe5b3 commit 7de8998

File tree

8 files changed

+89
-4
lines changed

8 files changed

+89
-4
lines changed

ShaderGlass/CaptureManager.cpp

Lines changed: 6 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -122,6 +122,7 @@ bool CaptureManager::StartSession()
122122
!m_options.imageFile.empty(),
123123
m_options.flipMode,
124124
m_options.allowTearing,
125+
m_options.useHDR,
125126
m_d3dDevice,
126127
m_context);
127128
UpdatePixelSize();
@@ -160,8 +161,12 @@ bool CaptureManager::StartSession()
160161
}
161162
else
162163
{
164+
winrt::Windows::Graphics::DirectX::DirectXPixelFormat pixelFormat =
165+
m_options.useHDR ? winrt::Windows::Graphics::DirectX::DirectXPixelFormat::R16G16B16A16Float
166+
: winrt::Windows::Graphics::DirectX::DirectXPixelFormat::B8G8R8A8UIntNormalized;
167+
163168
m_session = make_unique<CaptureSession>(
164-
device, captureItem, winrt::Windows::Graphics::DirectX::DirectXPixelFormat::B8G8R8A8UIntNormalized, *m_shaderGlass, m_options.maxCaptureRate, m_frameEvent);
169+
device, captureItem, pixelFormat, *m_shaderGlass, m_options.maxCaptureRate, m_frameEvent);
165170
}
166171

167172
m_active = true;

ShaderGlass/CaptureManager.h

Lines changed: 1 addition & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -36,6 +36,7 @@ struct CaptureOptions
3636
bool flipMode {false};
3737
bool allowTearing {false};
3838
bool maxCaptureRate {false};
39+
bool useHDR {false};
3940
RECT croppedArea {0, 0, 0, 0};
4041
bool vertical {false};
4142
};

ShaderGlass/ShaderGlass.cpp

Lines changed: 27 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -36,6 +36,7 @@ void ShaderGlass::Initialize(HWND outputWindow,
3636
bool image,
3737
bool flipMode,
3838
bool allowTearing,
39+
bool useHDR,
3940
winrt::com_ptr<ID3D11Device> device,
4041
winrt::com_ptr<ID3D11DeviceContext> context)
4142
{
@@ -45,6 +46,7 @@ void ShaderGlass::Initialize(HWND outputWindow,
4546
m_image = image;
4647
m_flipMode = flipMode;
4748
m_allowTearing = allowTearing;
49+
m_useHDR = useHDR;
4850
m_device = device;
4951
m_context = context;
5052

@@ -105,7 +107,7 @@ void ShaderGlass::Initialize(HWND outputWindow,
105107
DXGI_SWAP_CHAIN_DESC1 d3d11SwapChainDesc = {};
106108
d3d11SwapChainDesc.Width = 0;
107109
d3d11SwapChainDesc.Height = 0;
108-
d3d11SwapChainDesc.Format = DXGI_FORMAT_B8G8R8A8_UNORM;
110+
d3d11SwapChainDesc.Format = m_useHDR ? DXGI_FORMAT_R16G16B16A16_FLOAT : DXGI_FORMAT_B8G8R8A8_UNORM;
109111
d3d11SwapChainDesc.SampleDesc.Count = 1;
110112
d3d11SwapChainDesc.SampleDesc.Quality = 0;
111113
d3d11SwapChainDesc.BufferUsage = DXGI_USAGE_RENDER_TARGET_OUTPUT;
@@ -150,6 +152,14 @@ void ShaderGlass::Initialize(HWND outputWindow,
150152
hr = m_device->CreateRasterizerState(&desc, m_rasterizerState.put());
151153
assert(SUCCEEDED(hr));
152154

155+
if(m_useHDR)
156+
{
157+
hr = m_swapChain->QueryInterface(__uuidof(IDXGISwapChain3), reinterpret_cast<void**>(m_swapChain3.put()));
158+
assert(SUCCEEDED(hr));
159+
160+
SetSwapchainColorSpace();
161+
}
162+
153163
m_context->RSSetState(m_rasterizerState.get());
154164

155165
m_preprocessShader.Create(m_device);
@@ -324,6 +334,17 @@ std::vector<std::tuple<int, ShaderParam*>> ShaderGlass::Params()
324334
return params;
325335
}
326336

337+
void ShaderGlass::SetSwapchainColorSpace()
338+
{
339+
assert(m_swapChain3.get());
340+
341+
if(m_swapChain3.get())
342+
{
343+
hr = m_swapChain3->SetColorSpace1(DXGI_COLOR_SPACE_RGB_FULL_G10_NONE_P709);
344+
assert(SUCCEEDED(hr));
345+
}
346+
}
347+
327348
bool ShaderGlass::TryResizeSwapChain(const RECT& clientRect, bool force)
328349
{
329350
if(force || (clientRect.right != m_lastSize.x) || (clientRect.bottom != m_lastSize.y))
@@ -350,6 +371,11 @@ bool ShaderGlass::TryResizeSwapChain(const RECT& clientRect, bool force)
350371

351372
hr = m_device->CreateRenderTargetView(m_displayTexture.get(), NULL, m_displayRenderTarget.put());
352373
assert(SUCCEEDED(hr));
374+
375+
if(m_useHDR)
376+
{
377+
SetSwapchainColorSpace();
378+
}
353379
}
354380
return true;
355381
}

ShaderGlass/ShaderGlass.h

Lines changed: 4 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -25,6 +25,7 @@ class ShaderGlass
2525
bool image,
2626
bool flipMode,
2727
bool allowTearing,
28+
bool useHDR,
2829
winrt::com_ptr<ID3D11Device> device,
2930
winrt::com_ptr<ID3D11DeviceContext> context);
3031
void Process(winrt::com_ptr<ID3D11Texture2D> texture, ULONGLONG frameTicks);
@@ -51,6 +52,7 @@ class ShaderGlass
5152

5253
private:
5354
bool TryResizeSwapChain(const RECT& clientRect, bool force);
55+
void SetSwapchainColorSpace();
5456
void DestroyShaders();
5557
void DestroyPasses();
5658
void DestroyTargets();
@@ -65,6 +67,7 @@ class ShaderGlass
6567
winrt::com_ptr<ID3D11Device> m_device {nullptr};
6668
winrt::com_ptr<ID3D11ShaderResourceView> m_originalView {nullptr};
6769
winrt::com_ptr<IDXGISwapChain1> m_swapChain {nullptr};
70+
winrt::com_ptr<IDXGISwapChain3> m_swapChain3 {nullptr};
6871
winrt::com_ptr<ID3D11RasterizerState> m_rasterizerState {nullptr};
6972
winrt::com_ptr<ID3D11Texture2D> m_displayTexture {nullptr};
7073
winrt::com_ptr<ID3D11RenderTargetView> m_displayRenderTarget {nullptr};
@@ -85,6 +88,7 @@ class ShaderGlass
8588
bool m_image {false};
8689
bool m_flipMode {false};
8790
bool m_allowTearing {false};
91+
bool m_useHDR {false};
8892
int m_frameCounter {0};
8993
int m_logicalFrameCounter {0};
9094
ULONGLONG m_startTicks {0};

ShaderGlass/ShaderGlass.rc

144 Bytes
Binary file not shown.

ShaderGlass/ShaderWindow.cpp

Lines changed: 47 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -1338,6 +1338,32 @@ LRESULT CALLBACK ShaderWindow::WndProc(HWND hWnd, UINT message, WPARAM wParam, L
13381338
SaveMaxCaptureRateState(true);
13391339
}
13401340
break;
1341+
case ID_ADVANCED_USEHDR:
1342+
if(GetMenuState(m_advancedMenu, ID_ADVANCED_USEHDR, MF_BYCOMMAND) & MF_CHECKED)
1343+
{
1344+
CheckMenuItem(m_advancedMenu, ID_ADVANCED_USEHDR, MF_UNCHECKED);
1345+
SaveUseHDRState(false);
1346+
1347+
EnableMenuItem(m_advancedMenu, ID_PRESENTATION_USEFLIPMODE, MF_BYCOMMAND | MF_ENABLED);
1348+
1349+
if(GetFlipModeState())
1350+
{
1351+
CheckMenuItem(m_advancedMenu, ID_PRESENTATION_USEFLIPMODE, MF_CHECKED);
1352+
}
1353+
else
1354+
{
1355+
CheckMenuItem(m_advancedMenu, ID_PRESENTATION_USEFLIPMODE, MF_UNCHECKED);
1356+
}
1357+
}
1358+
else
1359+
{
1360+
CheckMenuItem(m_advancedMenu, ID_ADVANCED_USEHDR, MF_CHECKED);
1361+
SaveUseHDRState(true);
1362+
1363+
CheckMenuItem(m_advancedMenu, ID_PRESENTATION_USEFLIPMODE, MF_BYCOMMAND | MF_CHECKED);
1364+
EnableMenuItem(m_advancedMenu, ID_PRESENTATION_USEFLIPMODE, MF_BYCOMMAND | MF_GRAYED);
1365+
}
1366+
break;
13411367
case ID_DESKTOP_LOCKINPUTAREA:
13421368
if(!HasCaptureAPI())
13431369
break;
@@ -2093,8 +2119,18 @@ bool ShaderWindow::Create(_In_ HINSTANCE hInstance, _In_ int nCmdShow)
20932119
{
20942120
CheckMenuItem(m_programMenu, ID_PROCESSING_GLOBALHOTKEYS, MF_BYCOMMAND | MF_UNCHECKED);
20952121
}
2096-
if(GetFlipModeState())
2122+
if(GetUseHDRState())
2123+
{
2124+
CheckMenuItem(m_advancedMenu, ID_ADVANCED_USEHDR, MF_BYCOMMAND | MF_CHECKED);
2125+
m_captureOptions.useHDR = true;
2126+
2127+
CheckMenuItem(m_advancedMenu, ID_PRESENTATION_USEFLIPMODE, MF_BYCOMMAND | MF_CHECKED);
2128+
EnableMenuItem(m_advancedMenu, ID_PRESENTATION_USEFLIPMODE, MF_BYCOMMAND | MF_GRAYED);
2129+
m_captureOptions.flipMode = true;
2130+
}
2131+
else if(GetFlipModeState())
20972132
{
2133+
EnableMenuItem(m_advancedMenu, ID_PRESENTATION_USEFLIPMODE, MF_BYCOMMAND | MF_ENABLED);
20982134
CheckMenuItem(m_advancedMenu, ID_PRESENTATION_USEFLIPMODE, MF_BYCOMMAND | MF_CHECKED);
20992135
m_captureOptions.flipMode = true;
21002136
}
@@ -2248,6 +2284,16 @@ bool ShaderWindow::GetMaxCaptureRateState()
22482284
return GetRegistryOption(TEXT("Max Capture Rate"), false);
22492285
}
22502286

2287+
void ShaderWindow::SaveUseHDRState(bool state)
2288+
{
2289+
SaveRegistryOption(TEXT("Use HDR"), state);
2290+
}
2291+
2292+
bool ShaderWindow::GetUseHDRState()
2293+
{
2294+
return GetRegistryOption(TEXT("Use HDR"), false);
2295+
}
2296+
22512297
void ShaderWindow::SaveRememberFPS(int fps)
22522298
{
22532299
SaveRegistryInt(TEXT("Remember FPS"), fps);

ShaderGlass/ShaderWindow.h

Lines changed: 2 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -113,6 +113,8 @@ class ShaderWindow
113113
bool GetTearingState();
114114
void SaveMaxCaptureRateState(bool state);
115115
bool GetMaxCaptureRateState();
116+
void SaveUseHDRState(bool state);
117+
bool GetUseHDRState();
116118
void SaveRememberFPS(int fps);
117119
bool RememberFPS();
118120
int GetRememberFPS();

ShaderGlass/resource.h

Lines changed: 2 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -177,6 +177,7 @@
177177
#define ID_FPS_REMEMBERFPS 32918
178178
#define ID_PROCESSING_SETASDEFAULT 32919
179179
#define ID_PROCESSING_REMOVEDEFAULT 32920
180+
#define ID_ADVANCED_USEHDR 32921
180181
#define IDC_STATIC -1
181182
#define IDC_STATIC_LABEL -1
182183

@@ -186,7 +187,7 @@
186187
#ifndef APSTUDIO_READONLY_SYMBOLS
187188
#define _APS_NO_MFC 1
188189
#define _APS_NEXT_RESOURCE_VALUE 138
189-
#define _APS_NEXT_COMMAND_VALUE 32921
190+
#define _APS_NEXT_COMMAND_VALUE 32922
190191
#define _APS_NEXT_CONTROL_VALUE 1002
191192
#define _APS_NEXT_SYMED_VALUE 116
192193
#endif

0 commit comments

Comments
 (0)