44#include " com/com_guid.hpp"
55#include " com/com_pointer.hpp"
66#include " dxgi_interfaces.h"
7+ #include " dxgi_monitor.hpp"
78#include " dxgi_object.hpp"
89#include " dxgi_options.hpp"
910#include " dxmt_format.hpp"
1314
1415namespace dxmt {
1516
17+ inline float GetGammaControlPointPosition (uint32_t cp_index) {
18+ return float (cp_index) / float (DXMT_DXGI_GAMMA_CP_COUNT - 1 );
19+ }
20+
1621/*
1722 * \see
1823 * https://github.com/microsoft/DirectXTex/blob/main/DirectXTex/DirectXTexUtil.cpp
@@ -136,12 +141,21 @@ void FilterModesByDesc(std::vector<DXGI_MODE_DESC1> &Modes,
136141
137142class MTLDXGIOutput : public MTLDXGIObject <IDXGIOutput6> {
138143public:
139- MTLDXGIOutput (IMTLDXGIAdapter *adapter, HMONITOR monitor, DxgiOptions &options)
140- : adapter_(adapter), monitor_(monitor), options_(options) {
144+ MTLDXGIOutput (IMTLDXGIAdapter *adapter, IMTLDXGIFactory *factory, HMONITOR monitor, DxgiOptions &options)
145+ : adapter_(adapter), factory_(factory), monitor_(monitor), options_(options) {
141146 WMTGetDisplayDescription (monitor_ == wsi::getDefaultMonitor ()
142147 ? WMTGetPrimaryDisplayId ()
143148 : WMTGetSecondaryDisplayId (),
144149 &native_desc_);
150+ monitor_info_ = factory_->GetMonitor ();
151+ MTLDXGI_MONITOR_DATA monitorData;
152+ for (uint32_t i = 0 ; i < DXMT_DXGI_GAMMA_CP_COUNT; i++) {
153+ float pos = GetGammaControlPointPosition (i);
154+ monitorData.gammaCurve .Red [i] = monitorData.gammaCurve .Green [i] = monitorData.gammaCurve .Blue [i] = pos;
155+ }
156+ monitorData.gammaCurve .gammaIsIdentity = true ;
157+ monitorData.gammaCurve .updated = false ;
158+ monitor_info_->SetMonitorData (&monitorData);
145159 }
146160
147161 ~MTLDXGIOutput () {}
@@ -287,22 +301,56 @@ class MTLDXGIOutput : public MTLDXGIObject<IDXGIOutput6> {
287301 gamma_caps->ScaleAndOffsetSupported = false ;
288302 gamma_caps->MaxConvertedValue = 1 .0f ;
289303 gamma_caps->MinConvertedValue = 0 .0f ;
290- gamma_caps->NumGammaControlPoints = 1 ;
304+ gamma_caps->NumGammaControlPoints = DXMT_DXGI_GAMMA_CP_COUNT;
305+ for (uint32_t i = 0 ; i < gamma_caps->NumGammaControlPoints ; i++)
306+ gamma_caps->ControlPointPositions [i] = GetGammaControlPointPosition (i);
291307 return S_OK;
292308 }
293309
294310 HRESULT
295311 STDMETHODCALLTYPE
296312 SetGammaControl (const DXGI_GAMMA_CONTROL *gamma_control) final {
297- ERR (" Not implemented" );
298- return E_NOTIMPL;
313+ MTLDXGI_MONITOR_DATA *monitorData = nullptr ;
314+ if (gamma_control == nullptr )
315+ return E_NOTIMPL;
316+
317+ HRESULT hr = monitor_info_->GetMonitorData (&monitorData);
318+ if (FAILED (hr))
319+ return hr;
320+
321+ for (uint32_t i = 0 ; i < DXMT_DXGI_GAMMA_CP_COUNT; i++) {
322+ monitorData->gammaCurve .Red [i] = gamma_control->GammaCurve [i].Red ;
323+ monitorData->gammaCurve .Green [i] = gamma_control->GammaCurve [i].Green ;
324+ monitorData->gammaCurve .Blue [i] = gamma_control->GammaCurve [i].Blue ;
325+ float identity = GetGammaControlPointPosition (i);
326+ monitorData->gammaCurve .gammaIsIdentity &= gamma_control->GammaCurve [i].Red == identity
327+ && gamma_control->GammaCurve [i].Green == identity
328+ && gamma_control->GammaCurve [i].Blue == identity;
329+ }
330+ monitorData->gammaCurve .updated = true ;
331+
332+ return S_OK;
299333 }
300334
301335 HRESULT
302336 STDMETHODCALLTYPE
303337 GetGammaControl (DXGI_GAMMA_CONTROL *gamma_control) final {
304- ERR (" Not implemented" );
305- return E_NOTIMPL;
338+ MTLDXGI_MONITOR_DATA *monitorData = nullptr ;
339+ if (gamma_control == nullptr )
340+ return E_NOTIMPL;
341+
342+ HRESULT hr = monitor_info_->GetMonitorData (&monitorData);
343+ if (FAILED (hr))
344+ return hr;
345+
346+ gamma_control->Scale = { 1 .0f , 1 .0f , 1 .0f };
347+ gamma_control->Offset = { 0 .0f , 0 .0f , 0 .0f };
348+ for (uint32_t i = 0 ; i < DXMT_DXGI_GAMMA_CP_COUNT; i++) {
349+ gamma_control->GammaCurve [i].Red = monitorData->gammaCurve .Red [i];
350+ gamma_control->GammaCurve [i].Green = monitorData->gammaCurve .Green [i];
351+ gamma_control->GammaCurve [i].Blue = monitorData->gammaCurve .Blue [i];
352+ }
353+ return S_OK;
306354 }
307355
308356 HRESULT
@@ -603,13 +651,15 @@ class MTLDXGIOutput : public MTLDXGIObject<IDXGIOutput6> {
603651
604652private:
605653 Com<IMTLDXGIAdapter> adapter_ = nullptr ;
654+ Com<IMTLDXGIFactory> factory_ = nullptr ;
655+ MTLDXGIMonitor *monitor_info_ = nullptr ;
606656 HMONITOR monitor_ = nullptr ;
607657 WMTDisplayDescription native_desc_;
608658 DxgiOptions &options_;
609659};
610660
611- Com<IDXGIOutput> CreateOutput (IMTLDXGIAdapter *pAadapter, HMONITOR monitor, DxgiOptions &options) {
612- return Com<IDXGIOutput>::transfer (new MTLDXGIOutput (pAadapter, monitor, options));
661+ Com<IDXGIOutput> CreateOutput (IMTLDXGIAdapter *pAadapter, IMTLDXGIFactory *pFactory, HMONITOR monitor, DxgiOptions &options) {
662+ return Com<IDXGIOutput>::transfer (new MTLDXGIOutput (pAadapter, pFactory, monitor, options));
613663};
614664
615665} // namespace dxmt
0 commit comments