[英]Create Swap Chain Failed 2.0
我的D3D11CreateDeviceAndSwapChain()有问题。 我以为我在上一个线程中找到了解决方案,所以我已经将其标记为已解决。 [ 创建交换链失败
好像我不小心以布尔值返回HRESULT时愚弄了自己...
我整天都在与这个问题作斗争,但仍然没有弄清楚。 以下是有关输入和输出的调试信息...
1]采取建议将UNKNOWN与非null vAdapter一起使用: 调试Pic http://content.wuala.com/contents/RandomClown/Public/RandomCrap/Debug%201.png
2]在DX示例之后,将其保留为空并使用HARDWARE类型: 调试Pic http://content.wuala.com/contents/RandomClown/Public/RandomCrap/Debug%202.png
这些图片可能足以使人们发现问题,但如果还有其他问题,请编写代码:
// This is some relevant stuff [anything referenced] in the class.
Graphics(){
selectedVAdapter=NULL;
deviceInterface=NULL;
deviceContext=NULL;
swapChain=NULL;
}
bool initDevice(HWND &hWnd){
HRESULT success=S_OK;
D3D_FEATURE_LEVEL featureLevels[]={
D3D_FEATURE_LEVEL_11_0,
D3D_FEATURE_LEVEL_10_1,
D3D_FEATURE_LEVEL_10_0,
D3D_FEATURE_LEVEL_9_3,
};
uint featuresSize=ARRAYSIZE(featureLevels);
D3D_DRIVER_TYPE driverTypes[]={
D3D_DRIVER_TYPE_UNKNOWN, // Needed for manual vid adapter setting
D3D_DRIVER_TYPE_HARDWARE,
D3D_DRIVER_TYPE_WARP,
D3D_DRIVER_TYPE_REFERENCE,
};
uint driversSize=ARRAYSIZE(driverTypes);
refreshVideoAdapters();
setVideoAdapter();
//setSampleQuality();
DXGI_SWAP_CHAIN_DESC sd;
ZeroMemory(&sd, sizeof(sd));
sd.BufferCount = settings.bufferCount;
sd.BufferDesc.Width = settings.width;
sd.BufferDesc.Height = settings.height;
sd.BufferDesc.Format = settings.colorDepth;
sd.BufferDesc.RefreshRate.Numerator = settings.rateNumerator;
sd.BufferDesc.RefreshRate.Denominator = settings.rateDenominator;
sd.BufferUsage = DXGI_USAGE_RENDER_TARGET_OUTPUT;
sd.OutputWindow = hWnd;
sd.SampleDesc.Count = settings.sampleCount;
sd.SampleDesc.Quality = settings.sampleQuality;
sd.Windowed = !settings.fullScreen;
uint flag=0;
#ifdef _DEBUG
flag|=D3D11_CREATE_DEVICE_DEBUG;
#endif
for(uint i=0; i<driversSize; i++){ // SwapChain: http://msdn.microsoft.com/en-us/library/ff476083%28v=vs.85%29.aspx
D3D_DRIVER_TYPE driver=driverTypes[i];
success=D3D11CreateDeviceAndSwapChain(
//NULL,
selectedVAdapter, driver, NULL, flag,
featureLevels, featuresSize, D3D11_SDK_VERSION, &sd,
&swapChain, &deviceInterface, &selectedFeatureLevel, &deviceContext);
if(SUCCEEDED(success)) break;
}
return SUCCEEDED(success);
}
// Methods to manage video adapters
void refreshVideoAdapters(){
IDXGIAdapter1* pAdapter;
IDXGIFactory1* pFactory=NULL;
uint lastID=0;
if(selectedVAdapter){
DXGI_ADAPTER_DESC1* desc=NULL;
selectedVAdapter->GetDesc1(desc);
lastID=desc->DeviceId;
releaseVideoAdapters();
}
if(FAILED(CreateDXGIFactory1(__uuidof(IDXGIFactory1), (void**)&pFactory))) return;
for(uint i=0; pFactory->EnumAdapters1(i, &pAdapter)!=DXGI_ERROR_NOT_FOUND; i++){
vAdapters.push_back(pAdapter);
if(lastID){
DXGI_ADAPTER_DESC1* desc=NULL;
pAdapter->GetDesc1(desc);
if(lastID==desc->DeviceId){
selectedVAdapter=pAdapter;
lastID=0;
}
}
}
if(pFactory) pFactory->Release();
}
void releaseVideoAdapters(){
for(uint i=0; i<vAdapters.size(); i++){
vAdapters[i]->Release();
vAdapters[i]=NULL;
}
vAdapters.clear();
selectedVAdapter=NULL;
}
IDXGIAdapter1* getVideoAdapter(){return selectedVAdapter;}
bool setVideoAdapter(uint num=0){
if(num<vAdapters.size()){
selectedVAdapter=vAdapters[num];
return 1;
}
return 0;
}
// Member vars
private:
SettingsGraphicsDevice settings;
D3D_FEATURE_LEVEL selectedFeatureLevel;
vector<IDXGIAdapter1*> vAdapters;
IDXGIAdapter1* selectedVAdapter;
ID3D11Device* deviceInterface;
ID3D11DeviceContext* deviceContext;
IDXGISwapChain* swapChain;
该代码的设置结构:
struct SettingsGraphicsDevice{
uint width, height;
bool fullScreen, vsync;
uint rateNumerator;
uint rateDenominator;
uint bufferCount;
uint sampleCount, sampleQuality;
DXGI_FORMAT colorDepth;
float minDist, maxDist;
SettingsGraphicsDevice(){
width=height=0;
fullScreen=0;
vsync=0;
rateNumerator=0;
rateDenominator=1;
bufferCount=1;
sampleCount=1, sampleQuality=0;
colorDepth=DXGI_FORMAT_R8G8B8A8_UINT;
minDist=0.1f;
maxDist=1000.0f;
}
};
谢谢阅读。 希望这次能找到解决方案。
从我的评论中复制并粘贴:“此外,快速浏览我的代码显示我使用DXGI_FORMAT_R8G8B8A8_UNORM,尽管我目前不知道这是否是正确的模式。” 好的,现在在回答:-)
是的,格式... DXGI_FORMAT是一个相当大的枚举,但是在许多情况下,只允许使用某些格式。 不论是否全屏显示,仅允许某些格式显示都是不足为奇的。
我从文档中获得了使用的值(通常),特别是DXGI_MODE_DESC描述中的列表。 我实际上不知道我是否要创建blt-block转移交换链,但是我决定这些值与任何开头一样好,即使我不在乎功能级别9,它似乎也很安全:- )
我不知道为什么您的代码似乎可以使用null适配器; 我认为这很令人困惑。 也许调试运行时会捕获它?
切换到该颜色模式[DXGI_FORMAT_R8G8B8A8_UNORM]起作用。 我现在得到S_OK。 如果其他颜色模式不起作用,为什么还会存在?
声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.