mirror of
https://github.com/baldurk/renderdoc.git
synced 2026-08-26 08:26:50 +00:00
Add simple wrapper implementation of DXGI 1.6. Closes #864
This commit is contained in:
@@ -76,7 +76,7 @@ bool RefCountDXGIObject::HandleWrap(REFIID riid, void **ppvObject)
|
||||
else if(riid == __uuidof(IDXGIAdapter))
|
||||
{
|
||||
IDXGIAdapter *real = (IDXGIAdapter *)(*ppvObject);
|
||||
*ppvObject = (IDXGIAdapter *)(new WrappedIDXGIAdapter3(real));
|
||||
*ppvObject = (IDXGIAdapter *)(new WrappedIDXGIAdapter4(real));
|
||||
return true;
|
||||
}
|
||||
else if(riid == __uuidof(IDXGIFactory))
|
||||
@@ -100,7 +100,7 @@ bool RefCountDXGIObject::HandleWrap(REFIID riid, void **ppvObject)
|
||||
else if(riid == __uuidof(IDXGIAdapter1))
|
||||
{
|
||||
IDXGIAdapter1 *real = (IDXGIAdapter1 *)(*ppvObject);
|
||||
*ppvObject = (IDXGIAdapter1 *)(new WrappedIDXGIAdapter3(real));
|
||||
*ppvObject = (IDXGIAdapter1 *)(new WrappedIDXGIAdapter4(real));
|
||||
return true;
|
||||
}
|
||||
else if(riid == __uuidof(IDXGIFactory1))
|
||||
@@ -112,13 +112,13 @@ bool RefCountDXGIObject::HandleWrap(REFIID riid, void **ppvObject)
|
||||
else if(riid == __uuidof(IDXGIAdapter2))
|
||||
{
|
||||
IDXGIAdapter2 *real = (IDXGIAdapter2 *)(*ppvObject);
|
||||
*ppvObject = (IDXGIAdapter2 *)(new WrappedIDXGIAdapter3(real));
|
||||
*ppvObject = (IDXGIAdapter2 *)(new WrappedIDXGIAdapter4(real));
|
||||
return true;
|
||||
}
|
||||
else if(riid == __uuidof(IDXGIAdapter3))
|
||||
{
|
||||
IDXGIAdapter3 *real = (IDXGIAdapter3 *)(*ppvObject);
|
||||
*ppvObject = (IDXGIAdapter3 *)(new WrappedIDXGIAdapter3(real));
|
||||
*ppvObject = (IDXGIAdapter3 *)(new WrappedIDXGIAdapter4(real));
|
||||
return true;
|
||||
}
|
||||
else if(riid == __uuidof(IDXGIFactory2))
|
||||
@@ -350,7 +350,7 @@ HRESULT STDMETHODCALLTYPE WrappedIDXGISwapChain4::GetContainingOutput(IDXGIOutpu
|
||||
HRESULT ret = m_pReal->GetContainingOutput(ppOutput);
|
||||
|
||||
if(SUCCEEDED(ret) && ppOutput && *ppOutput)
|
||||
*ppOutput = (IDXGIOutput *)(new WrappedIDXGIOutput5(this, *ppOutput));
|
||||
*ppOutput = (IDXGIOutput *)(new WrappedIDXGIOutput6(this, *ppOutput));
|
||||
|
||||
return ret;
|
||||
}
|
||||
@@ -383,7 +383,7 @@ HRESULT WrappedIDXGISwapChain4::SetFullscreenState(
|
||||
/* [in] */ BOOL Fullscreen,
|
||||
/* [in] */ IDXGIOutput *pTarget)
|
||||
{
|
||||
WrappedIDXGIOutput5 *wrappedOutput = (WrappedIDXGIOutput5 *)pTarget;
|
||||
WrappedIDXGIOutput6 *wrappedOutput = (WrappedIDXGIOutput6 *)pTarget;
|
||||
IDXGIOutput *unwrappedOutput = wrappedOutput ? wrappedOutput->GetReal() : NULL;
|
||||
|
||||
if(RenderDoc::Inst().GetCaptureOptions().allowFullscreen)
|
||||
@@ -399,7 +399,7 @@ HRESULT WrappedIDXGISwapChain4::GetFullscreenState(
|
||||
HRESULT ret = m_pReal->GetFullscreenState(pFullscreen, ppTarget);
|
||||
|
||||
if(SUCCEEDED(ret) && ppTarget && *ppTarget)
|
||||
*ppTarget = (IDXGIOutput *)(new WrappedIDXGIOutput5(this, *ppTarget));
|
||||
*ppTarget = (IDXGIOutput *)(new WrappedIDXGIOutput6(this, *ppTarget));
|
||||
|
||||
return ret;
|
||||
}
|
||||
@@ -545,12 +545,12 @@ HRESULT STDMETHODCALLTYPE WrappedIDXGISwapChain4::GetRestrictToOutput(IDXGIOutpu
|
||||
HRESULT ret = m_pReal2->GetRestrictToOutput(ppRestrictToOutput);
|
||||
|
||||
if(SUCCEEDED(ret) && ppRestrictToOutput && *ppRestrictToOutput)
|
||||
*ppRestrictToOutput = (IDXGIOutput *)(new WrappedIDXGIOutput5(this, *ppRestrictToOutput));
|
||||
*ppRestrictToOutput = (IDXGIOutput *)(new WrappedIDXGIOutput6(this, *ppRestrictToOutput));
|
||||
|
||||
return ret;
|
||||
}
|
||||
|
||||
WrappedIDXGIOutput5::WrappedIDXGIOutput5(RefCountDXGIObject *owner, IDXGIOutput *real)
|
||||
WrappedIDXGIOutput6::WrappedIDXGIOutput6(RefCountDXGIObject *owner, IDXGIOutput *real)
|
||||
: RefCountDXGIObject(real), m_Owner(owner), m_pReal(real)
|
||||
{
|
||||
SAFE_ADDREF(m_Owner);
|
||||
@@ -565,20 +565,23 @@ WrappedIDXGIOutput5::WrappedIDXGIOutput5(RefCountDXGIObject *owner, IDXGIOutput
|
||||
real->QueryInterface(__uuidof(IDXGIOutput4), (void **)&m_pReal4);
|
||||
m_pReal5 = NULL;
|
||||
real->QueryInterface(__uuidof(IDXGIOutput5), (void **)&m_pReal5);
|
||||
m_pReal6 = NULL;
|
||||
real->QueryInterface(__uuidof(IDXGIOutput6), (void **)&m_pReal6);
|
||||
}
|
||||
|
||||
WrappedIDXGIOutput5::~WrappedIDXGIOutput5()
|
||||
WrappedIDXGIOutput6::~WrappedIDXGIOutput6()
|
||||
{
|
||||
SAFE_RELEASE(m_pReal1);
|
||||
SAFE_RELEASE(m_pReal2);
|
||||
SAFE_RELEASE(m_pReal3);
|
||||
SAFE_RELEASE(m_pReal4);
|
||||
SAFE_RELEASE(m_pReal5);
|
||||
SAFE_RELEASE(m_pReal6);
|
||||
SAFE_RELEASE(m_pReal);
|
||||
SAFE_RELEASE(m_Owner);
|
||||
}
|
||||
|
||||
HRESULT STDMETHODCALLTYPE WrappedIDXGIOutput5::QueryInterface(REFIID riid, void **ppvObject)
|
||||
HRESULT STDMETHODCALLTYPE WrappedIDXGIOutput6::QueryInterface(REFIID riid, void **ppvObject)
|
||||
{
|
||||
if(riid == __uuidof(IDXGIOutput))
|
||||
{
|
||||
@@ -659,7 +662,7 @@ HRESULT STDMETHODCALLTYPE WrappedIDXGIOutput5::QueryInterface(REFIID riid, void
|
||||
return RefCountDXGIObject::QueryInterface(riid, ppvObject);
|
||||
}
|
||||
|
||||
WrappedIDXGIAdapter3::WrappedIDXGIAdapter3(IDXGIAdapter *real)
|
||||
WrappedIDXGIAdapter4::WrappedIDXGIAdapter4(IDXGIAdapter *real)
|
||||
: RefCountDXGIObject(real), m_pReal(real)
|
||||
{
|
||||
m_pReal1 = NULL;
|
||||
@@ -668,17 +671,20 @@ WrappedIDXGIAdapter3::WrappedIDXGIAdapter3(IDXGIAdapter *real)
|
||||
real->QueryInterface(__uuidof(IDXGIAdapter2), (void **)&m_pReal2);
|
||||
m_pReal3 = NULL;
|
||||
real->QueryInterface(__uuidof(IDXGIAdapter3), (void **)&m_pReal3);
|
||||
m_pReal4 = NULL;
|
||||
real->QueryInterface(__uuidof(IDXGIAdapter4), (void **)&m_pReal4);
|
||||
}
|
||||
|
||||
WrappedIDXGIAdapter3::~WrappedIDXGIAdapter3()
|
||||
WrappedIDXGIAdapter4::~WrappedIDXGIAdapter4()
|
||||
{
|
||||
SAFE_RELEASE(m_pReal1);
|
||||
SAFE_RELEASE(m_pReal2);
|
||||
SAFE_RELEASE(m_pReal3);
|
||||
SAFE_RELEASE(m_pReal4);
|
||||
SAFE_RELEASE(m_pReal);
|
||||
}
|
||||
|
||||
HRESULT STDMETHODCALLTYPE WrappedIDXGIAdapter3::QueryInterface(REFIID riid, void **ppvObject)
|
||||
HRESULT STDMETHODCALLTYPE WrappedIDXGIAdapter4::QueryInterface(REFIID riid, void **ppvObject)
|
||||
{
|
||||
if(riid == __uuidof(IDXGIAdapter))
|
||||
{
|
||||
@@ -838,8 +844,8 @@ std::vector<IDXGIResource *> UnwrapResourceSet(UINT NumResources, IDXGIResource
|
||||
resources.resize(NumResources);
|
||||
for(UINT i = 0; i < NumResources; i++)
|
||||
{
|
||||
WrappedDXGIInterface<WrappedIDXGIOutput5> *wrapped =
|
||||
(WrappedDXGIInterface<WrappedIDXGIOutput5> *)ppResources[i];
|
||||
WrappedDXGIInterface<WrappedIDXGIOutput6> *wrapped =
|
||||
(WrappedDXGIInterface<WrappedIDXGIOutput6> *)ppResources[i];
|
||||
resources[i] = UnwrapDXGIResource(wrapped->GetWrapped());
|
||||
if(resources[i] == NULL)
|
||||
{
|
||||
@@ -1025,7 +1031,7 @@ HRESULT WrappedIDXGIFactory5::CreateSwapChainForHwnd(
|
||||
{
|
||||
ID3DDevice *wrapDevice = GetD3DDevice(pDevice);
|
||||
|
||||
WrappedIDXGIOutput5 *wrappedOutput = (WrappedIDXGIOutput5 *)pRestrictToOutput;
|
||||
WrappedIDXGIOutput6 *wrappedOutput = (WrappedIDXGIOutput6 *)pRestrictToOutput;
|
||||
IDXGIOutput *unwrappedOutput = wrappedOutput ? wrappedOutput->GetReal() : NULL;
|
||||
|
||||
if(wrapDevice)
|
||||
@@ -1061,7 +1067,7 @@ HRESULT WrappedIDXGIFactory5::CreateSwapChainForCoreWindow(IUnknown *pDevice, IU
|
||||
{
|
||||
ID3DDevice *wrapDevice = GetD3DDevice(pDevice);
|
||||
|
||||
WrappedIDXGIOutput5 *wrappedOutput = (WrappedIDXGIOutput5 *)pRestrictToOutput;
|
||||
WrappedIDXGIOutput6 *wrappedOutput = (WrappedIDXGIOutput6 *)pRestrictToOutput;
|
||||
IDXGIOutput *unwrappedOutput = wrappedOutput ? wrappedOutput->GetReal() : NULL;
|
||||
|
||||
if(!RenderDoc::Inst().GetCaptureOptions().allowFullscreen)
|
||||
@@ -1101,7 +1107,7 @@ HRESULT WrappedIDXGIFactory5::CreateSwapChainForComposition(IUnknown *pDevice,
|
||||
{
|
||||
ID3DDevice *wrapDevice = GetD3DDevice(pDevice);
|
||||
|
||||
WrappedIDXGIOutput5 *wrappedOutput = (WrappedIDXGIOutput5 *)pRestrictToOutput;
|
||||
WrappedIDXGIOutput6 *wrappedOutput = (WrappedIDXGIOutput6 *)pRestrictToOutput;
|
||||
IDXGIOutput *unwrappedOutput = wrappedOutput ? wrappedOutput->GetReal() : NULL;
|
||||
|
||||
if(!RenderDoc::Inst().GetCaptureOptions().allowFullscreen)
|
||||
|
||||
@@ -27,7 +27,7 @@
|
||||
|
||||
#include "common/common.h"
|
||||
#include "common/wrapped_pool.h"
|
||||
#include "driver/dx/official/dxgi1_5.h"
|
||||
#include "driver/dx/official/dxgi1_6.h"
|
||||
|
||||
MIDL_INTERFACE("6f15aaf2-d208-4e89-9ab4-489535d34f9c") ID3D11Texture2D;
|
||||
MIDL_INTERFACE("dc8e63f3-d12b-4952-b47b-5e45026a862d") ID3D11Resource;
|
||||
@@ -838,7 +838,7 @@ public:
|
||||
}
|
||||
};
|
||||
|
||||
class WrappedIDXGIOutput5 : public IDXGIOutput5, public RefCountDXGIObject
|
||||
class WrappedIDXGIOutput6 : public IDXGIOutput6, public RefCountDXGIObject
|
||||
{
|
||||
RefCountDXGIObject *m_Owner;
|
||||
IDXGIOutput *m_pReal;
|
||||
@@ -847,13 +847,14 @@ class WrappedIDXGIOutput5 : public IDXGIOutput5, public RefCountDXGIObject
|
||||
IDXGIOutput3 *m_pReal3;
|
||||
IDXGIOutput4 *m_pReal4;
|
||||
IDXGIOutput5 *m_pReal5;
|
||||
IDXGIOutput6 *m_pReal6;
|
||||
|
||||
public:
|
||||
IMPLEMENT_IDXGIOBJECT_WITH_REFCOUNTDXGIOBJECT_CUSTOMQUERY;
|
||||
HRESULT STDMETHODCALLTYPE QueryInterface(REFIID riid, void **ppvObject);
|
||||
|
||||
WrappedIDXGIOutput5(RefCountDXGIObject *owner, IDXGIOutput *real);
|
||||
~WrappedIDXGIOutput5();
|
||||
WrappedIDXGIOutput6(RefCountDXGIObject *owner, IDXGIOutput *real);
|
||||
~WrappedIDXGIOutput6();
|
||||
|
||||
IDXGIOutput *GetReal() { return m_pReal; }
|
||||
//////////////////////////////
|
||||
@@ -1031,18 +1032,36 @@ public:
|
||||
return m_pReal5->DuplicateOutput1(pDevice, Flags, SupportedFormatsCount, pSupportedFormats,
|
||||
ppOutputDuplication);
|
||||
}
|
||||
|
||||
//////////////////////////////
|
||||
// implement IDXGIOutput6
|
||||
|
||||
virtual HRESULT STDMETHODCALLTYPE GetDesc1(
|
||||
/* [annotation][out] */
|
||||
_Out_ DXGI_OUTPUT_DESC1 *pDesc)
|
||||
{
|
||||
return m_pReal6->GetDesc1(pDesc);
|
||||
}
|
||||
|
||||
virtual HRESULT STDMETHODCALLTYPE CheckHardwareCompositionSupport(
|
||||
/* [annotation][out] */
|
||||
_Out_ UINT *pFlags)
|
||||
{
|
||||
return m_pReal6->CheckHardwareCompositionSupport(pFlags);
|
||||
}
|
||||
};
|
||||
|
||||
class WrappedIDXGIAdapter3 : public IDXGIAdapter3, public RefCountDXGIObject
|
||||
class WrappedIDXGIAdapter4 : public IDXGIAdapter4, public RefCountDXGIObject
|
||||
{
|
||||
IDXGIAdapter *m_pReal;
|
||||
IDXGIAdapter1 *m_pReal1;
|
||||
IDXGIAdapter2 *m_pReal2;
|
||||
IDXGIAdapter3 *m_pReal3;
|
||||
IDXGIAdapter4 *m_pReal4;
|
||||
|
||||
public:
|
||||
WrappedIDXGIAdapter3(IDXGIAdapter *real);
|
||||
virtual ~WrappedIDXGIAdapter3();
|
||||
WrappedIDXGIAdapter4(IDXGIAdapter *real);
|
||||
virtual ~WrappedIDXGIAdapter4();
|
||||
|
||||
IMPLEMENT_IDXGIOBJECT_WITH_REFCOUNTDXGIOBJECT_CUSTOMQUERY;
|
||||
HRESULT STDMETHODCALLTYPE QueryInterface(REFIID riid, void **ppvObject);
|
||||
@@ -1058,7 +1077,7 @@ public:
|
||||
HRESULT ret = m_pReal->EnumOutputs(Output, ppOutput);
|
||||
|
||||
if(SUCCEEDED(ret) && ppOutput && *ppOutput)
|
||||
*ppOutput = (IDXGIOutput *)(new WrappedIDXGIOutput5(this, *ppOutput));
|
||||
*ppOutput = (IDXGIOutput *)(new WrappedIDXGIOutput6(this, *ppOutput));
|
||||
|
||||
return ret;
|
||||
}
|
||||
@@ -1154,6 +1173,16 @@ public:
|
||||
{
|
||||
return m_pReal3->UnregisterVideoMemoryBudgetChangeNotification(dwCookie);
|
||||
}
|
||||
|
||||
//////////////////////////////
|
||||
// implement IDXGIAdapter4
|
||||
|
||||
virtual HRESULT STDMETHODCALLTYPE GetDesc3(
|
||||
/* [annotation][out] */
|
||||
_Out_ DXGI_ADAPTER_DESC3 *pDesc)
|
||||
{
|
||||
return m_pReal4->GetDesc3(pDesc);
|
||||
}
|
||||
};
|
||||
|
||||
class WrappedIDXGIDevice4 : public IDXGIDevice4, public RefCountDXGIObject
|
||||
@@ -1185,7 +1214,7 @@ public:
|
||||
{
|
||||
HRESULT ret = m_pReal->GetAdapter(pAdapter);
|
||||
if(SUCCEEDED(ret))
|
||||
*pAdapter = (IDXGIAdapter *)(new WrappedIDXGIAdapter3(*pAdapter));
|
||||
*pAdapter = (IDXGIAdapter *)(new WrappedIDXGIAdapter4(*pAdapter));
|
||||
return ret;
|
||||
}
|
||||
|
||||
@@ -1319,7 +1348,7 @@ public:
|
||||
{
|
||||
HRESULT ret = m_pReal->EnumAdapters(Adapter, ppAdapter);
|
||||
if(SUCCEEDED(ret))
|
||||
*ppAdapter = (IDXGIAdapter *)(new WrappedIDXGIAdapter3(*ppAdapter));
|
||||
*ppAdapter = (IDXGIAdapter *)(new WrappedIDXGIAdapter4(*ppAdapter));
|
||||
return ret;
|
||||
}
|
||||
|
||||
@@ -1350,7 +1379,7 @@ public:
|
||||
{
|
||||
HRESULT ret = m_pReal->CreateSoftwareAdapter(Module, ppAdapter);
|
||||
if(SUCCEEDED(ret))
|
||||
*ppAdapter = (IDXGIAdapter *)(new WrappedIDXGIAdapter3(*ppAdapter));
|
||||
*ppAdapter = (IDXGIAdapter *)(new WrappedIDXGIAdapter4(*ppAdapter));
|
||||
return ret;
|
||||
}
|
||||
|
||||
@@ -1373,7 +1402,7 @@ public:
|
||||
HRESULT ret = factory->EnumAdapters1(Adapter, ppAdapter);
|
||||
|
||||
if(SUCCEEDED(ret))
|
||||
*ppAdapter = (IDXGIAdapter1 *)(new WrappedIDXGIAdapter3(*ppAdapter));
|
||||
*ppAdapter = (IDXGIAdapter1 *)(new WrappedIDXGIAdapter4(*ppAdapter));
|
||||
return ret;
|
||||
}
|
||||
|
||||
@@ -1506,22 +1535,22 @@ public:
|
||||
if(riid == __uuidof(IDXGIAdapter3))
|
||||
{
|
||||
IDXGIAdapter3 *adapter = (IDXGIAdapter3 *)*ppvAdapter;
|
||||
*ppvAdapter = (IDXGIAdapter3 *)(new WrappedIDXGIAdapter3(adapter));
|
||||
*ppvAdapter = (IDXGIAdapter3 *)(new WrappedIDXGIAdapter4(adapter));
|
||||
}
|
||||
else if(riid == __uuidof(IDXGIAdapter2))
|
||||
{
|
||||
IDXGIAdapter2 *adapter = (IDXGIAdapter2 *)*ppvAdapter;
|
||||
*ppvAdapter = (IDXGIAdapter2 *)(new WrappedIDXGIAdapter3(adapter));
|
||||
*ppvAdapter = (IDXGIAdapter2 *)(new WrappedIDXGIAdapter4(adapter));
|
||||
}
|
||||
else if(riid == __uuidof(IDXGIAdapter1))
|
||||
{
|
||||
IDXGIAdapter1 *adapter = (IDXGIAdapter1 *)*ppvAdapter;
|
||||
*ppvAdapter = (IDXGIAdapter1 *)(new WrappedIDXGIAdapter3(adapter));
|
||||
*ppvAdapter = (IDXGIAdapter1 *)(new WrappedIDXGIAdapter4(adapter));
|
||||
}
|
||||
else
|
||||
{
|
||||
IDXGIAdapter *adapter = (IDXGIAdapter *)*ppvAdapter;
|
||||
*ppvAdapter = (IDXGIAdapter *)(new WrappedIDXGIAdapter3(adapter));
|
||||
*ppvAdapter = (IDXGIAdapter *)(new WrappedIDXGIAdapter4(adapter));
|
||||
}
|
||||
}
|
||||
return ret;
|
||||
@@ -1539,22 +1568,22 @@ public:
|
||||
if(riid == __uuidof(IDXGIAdapter3))
|
||||
{
|
||||
IDXGIAdapter3 *adapter = (IDXGIAdapter3 *)*ppvAdapter;
|
||||
*ppvAdapter = (IDXGIAdapter3 *)(new WrappedIDXGIAdapter3(adapter));
|
||||
*ppvAdapter = (IDXGIAdapter3 *)(new WrappedIDXGIAdapter4(adapter));
|
||||
}
|
||||
else if(riid == __uuidof(IDXGIAdapter2))
|
||||
{
|
||||
IDXGIAdapter2 *adapter = (IDXGIAdapter2 *)*ppvAdapter;
|
||||
*ppvAdapter = (IDXGIAdapter2 *)(new WrappedIDXGIAdapter3(adapter));
|
||||
*ppvAdapter = (IDXGIAdapter2 *)(new WrappedIDXGIAdapter4(adapter));
|
||||
}
|
||||
else if(riid == __uuidof(IDXGIAdapter1))
|
||||
{
|
||||
IDXGIAdapter1 *adapter = (IDXGIAdapter1 *)*ppvAdapter;
|
||||
*ppvAdapter = (IDXGIAdapter1 *)(new WrappedIDXGIAdapter3(adapter));
|
||||
*ppvAdapter = (IDXGIAdapter1 *)(new WrappedIDXGIAdapter4(adapter));
|
||||
}
|
||||
else
|
||||
{
|
||||
IDXGIAdapter *adapter = (IDXGIAdapter *)*ppvAdapter;
|
||||
*ppvAdapter = (IDXGIAdapter *)(new WrappedIDXGIAdapter3(adapter));
|
||||
*ppvAdapter = (IDXGIAdapter *)(new WrappedIDXGIAdapter4(adapter));
|
||||
}
|
||||
}
|
||||
return ret;
|
||||
|
||||
@@ -112,6 +112,7 @@
|
||||
<ClInclude Include="..\dx\official\dxgi1_3.h" />
|
||||
<ClInclude Include="..\dx\official\dxgi1_4.h" />
|
||||
<ClInclude Include="..\dx\official\dxgi1_5.h" />
|
||||
<ClInclude Include="..\dx\official\dxgi1_6.h" />
|
||||
<ClInclude Include="..\dx\official\dxgiformat.h" />
|
||||
<ClInclude Include="..\dx\official\dxgitype.h" />
|
||||
<ClInclude Include="dxgi_common.h" />
|
||||
|
||||
@@ -48,6 +48,9 @@
|
||||
<ClInclude Include="precompiled.h">
|
||||
<Filter>PCH</Filter>
|
||||
</ClInclude>
|
||||
<ClInclude Include="..\dx\official\dxgi1_6.h">
|
||||
<Filter>official</Filter>
|
||||
</ClInclude>
|
||||
</ItemGroup>
|
||||
<ItemGroup>
|
||||
<Filter Include="official">
|
||||
|
||||
Reference in New Issue
Block a user