Ошибка создания цепочки обмена 2.0

У меня была проблема с моим D3D11CreateDeviceAndSwapChain (). Я думал, что получил решение в предыдущей ветке, поэтому я уже пометил его как решенное. [Ошибка создания цепочки обмена

Похоже, я обманул себя, когда случайно возвратил HRESULT как бул …

Я боролся с этой проблемой весь день & до сих пор не разобрался. Вот куча отладочной информации о входах & выходы …

1] Принимая совет использовать UNKNOWN с ненулевым vAdapter:
Pic Debug http://content.wuala.com/contents/RandomClown/Public/RandomCrap/Debug%201.png

2] После образца DX, оставив его нулевым & используя тип ОБОРУДОВАНИЕ:
Pic Debug 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;
}

};

Спасибо за прочтение. Надеюсь, что решение найдено в этот раз.

1

Решение

Скопируйте и вставьте из моего комментария: «Кроме того, быстрый взгляд на мой код показывает, что я использую DXGI_FORMAT_R8G8B8A8_UNORM, хотя в настоящее время я не знаю, правильный ли это режим». Хорошо, так что теперь в ответе 🙂

Да, форматы … DXGI_FORMAT — это довольно большое перечисление, но во многих ситуациях допускаются только определенные форматы. Не должно быть слишком удивительно, что для отображения разрешены только определенные форматы, будь то полноэкранный или нет.

Я получил значение, которое я использовал из документов (как обычно), в частности, список в DXGI_MODE_DESC описание. На самом деле я не знаю, создаю ли я swapchain для переноса блоков blt, но решил, что эти значения такие же хорошие, как и любые другие, и хотя мне все равно, что делать с уровнем возможностей 9, он показался довольно безопасным: — )

Я понятия не имею, почему ваш код работал с нулевым адаптером; Я думаю, что это сбивает с толку. Может быть, отладочная среда поймала бы это?

1

Другие решения

Переключение в этот цветовой режим [DXGI_FORMAT_R8G8B8A8_UNORM] сработало. Я получаю S_OK сейчас. Почему существуют другие цветовые режимы, если они не работают?

0

По вопросам рекламы [email protected]