Files
renderdoc/util/test/demos/dx/d3d_helpers.cpp
T

163 lines
3.7 KiB
C++

/******************************************************************************
* The MIT License (MIT)
*
* Copyright (c) 2019-2020 Baldur Karlsson
*
* Permission is hereby granted, free of charge, to any person obtaining a copy
* of this software and associated documentation files (the "Software"), to deal
* in the Software without restriction, including without limitation the rights
* to use, copy, modify, merge, publish, distribute, sublicense, and/or sell
* copies of the Software, and to permit persons to whom the Software is
* furnished to do so, subject to the following conditions:
*
* The above copyright notice and this permission notice shall be included in
* all copies or substantial portions of the Software.
*
* THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR
* IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,
* FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE
* AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER
* LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM,
* OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN
* THE SOFTWARE.
******************************************************************************/
#include "d3d_helpers.h"
#include <vector>
#include "../test_common.h"
std::string D3DFullscreenQuadVertex = R"EOSHADER(
float4 main(uint vid : SV_VertexID) : SV_POSITION
{
float2 positions[] = {
float2(-1.0f, 1.0f),
float2( 1.0f, 1.0f),
float2(-1.0f, -1.0f),
float2( 1.0f, -1.0f),
};
return float4(positions[vid], 0, 1);
}
)EOSHADER";
std::string D3DDefaultVertex = R"EOSHADER(
struct vertin
{
float3 pos : POSITION;
float4 col : COLOR0;
float2 uv : TEXCOORD0;
};
struct v2f
{
float4 pos : SV_POSITION;
float4 col : COLOR0;
float2 uv : TEXCOORD0;
};
v2f main(vertin IN, uint vid : SV_VertexID)
{
v2f OUT = (v2f)0;
OUT.pos = float4(IN.pos.xyz, 1);
OUT.col = IN.col;
OUT.uv = IN.uv;
return OUT;
}
)EOSHADER";
std::string D3DDefaultPixel = R"EOSHADER(
struct v2f
{
float4 pos : SV_POSITION;
float4 col : COLOR0;
float2 uv : TEXCOORD0;
};
float4 main(v2f IN) : SV_Target0
{
return IN.col;
}
)EOSHADER";
IDXGIAdapterPtr ChooseD3DAdapter(IDXGIFactoryPtr factory, int argc, char **argv, bool &warp)
{
struct AdapterInfo
{
IDXGIAdapterPtr adapter;
DXGI_ADAPTER_DESC desc;
};
std::vector<AdapterInfo> adapters;
HRESULT hr = S_OK;
for(UINT i = 0; i < 10; i++)
{
IDXGIAdapterPtr a;
hr = factory->EnumAdapters(i, &a);
if(hr == S_OK && a)
{
DXGI_ADAPTER_DESC desc;
a->GetDesc(&desc);
adapters.push_back({a, desc});
}
else
{
break;
}
}
IDXGIAdapterPtr adapter = NULL;
for(int i = 0; i < argc; i++)
{
if(!strcmp(argv[i], "--warp"))
{
warp = true;
adapter = NULL;
break;
}
if(!strcmp(argv[i], "--gpu") && i + 1 < argc)
{
std::string needle = strlower(argv[i + 1]);
if(needle == "warp")
{
warp = true;
adapter = NULL;
break;
}
const bool nv = (needle == "nv" || needle == "nvidia");
const bool amd = (needle == "amd");
const bool intel = (needle == "intel");
for(size_t a = 0; a < adapters.size(); a++)
{
std::string haystack = strlower(Wide2UTF8(adapters[a].desc.Description));
if(haystack.find(needle) != std::string::npos ||
(nv && adapters[a].desc.VendorId == PCI_VENDOR_NV) ||
(amd && adapters[a].desc.VendorId == PCI_VENDOR_AMD) ||
(intel && adapters[a].desc.VendorId == PCI_VENDOR_INTEL))
{
adapter = adapters[a].adapter;
break;
}
}
break;
}
}
return adapter;
}