Example #1
0
	HRESULT	D3D11Renderer::Create( HWND const &appWindow )
	{
		HRESULT	hr;

		D3D_FEATURE_LEVEL	featureLevelsSupported;
		D3D_FEATURE_LEVEL	featureLevelsRequested[] =
		{
			D3D_FEATURE_LEVEL_11_0,
			D3D_FEATURE_LEVEL_10_1,
			D3D_FEATURE_LEVEL_10_0,
			D3D_FEATURE_LEVEL_9_3,
			D3D_FEATURE_LEVEL_9_2,
			D3D_FEATURE_LEVEL_9_1,
		};

		UINT	deviceFlags = 0;
#if defined(DEBUG) || defined(_DEBUG)
		deviceFlags |= (D3D11_CREATE_DEVICE_DEBUG | D3D11_RLDO_DETAIL);
#endif

		HR(hr, D3D11CreateDevice(
			GetPrimaryAdaptor(),		// adapter
			D3D_DRIVER_TYPE_HARDWARE,	// drive type
			0,							// hmodule
			deviceFlags,				// device flags
			featureLevelsRequested,		// array of feature levels requests
			6,							// number of feature levels
			D3D11_SDK_VERSION,			// sdk version
			&m_device,					// pointer to device
			&featureLevelsSupported,	// number of feature levels supported
			&m_context));				// pointer to context
		/*
#if defined(DEBUG) || defined(_DEBUG)
		HR(hr, m_device->QueryInterface(__uuidof(ID3D11Debug), (void **)&m_debug));
#endif
		*/
		DXGI_FORMAT	formats[] =
		{
			g_settings.format,
			DXGI_FORMAT_R16G16B16A16_FLOAT,
			DXGI_FORMAT_R8G8B8A8_UNORM
		};
		UINT formatSupport = 0;
		UINT supportedFormatIndex = 0;

		for (supportedFormatIndex; supportedFormatIndex < 3; supportedFormatIndex++)
		{
			m_device->CheckFormatSupport(formats[supportedFormatIndex], &formatSupport);
			if (formatSupport &	D3D11_FORMAT_SUPPORT_RENDER_TARGET && formatSupport & D3D11_FORMAT_SUPPORT_DISPLAY)
			{
				g_settings.format = formats[supportedFormatIndex];
				break;
			}
		}

		ATOM_ASSERT(g_settings.xmsaa > 0, "XMSAA < 0, min value = 1");

		UINT	sampleCount = g_settings.xmsaa;
		UINT	numQualityLevels = 0;
		this->m_device->CheckMultisampleQualityLevels(
			g_settings.format,
			sampleCount,
			&numQualityLevels);
		//this->m_appSettings->qmsaa = numQualityLevels - 1;
		if (sampleCount < g_settings.xmsaa)
			g_settings.xmsaa = sampleCount;
		if (numQualityLevels - 1 < g_settings.qmsaa)
			g_settings.qmsaa = numQualityLevels - 1;

		DXGI_SWAP_CHAIN_DESC	sd;
		ZeroMemory(&sd, sizeof(sd));
		sd.BufferCount = SWAP_CHAIN_BUFFER_COUNT;
		sd.BufferDesc.Format = g_settings.format;
		sd.BufferDesc.Width = g_settings.width;
		sd.BufferDesc.Height = g_settings.height;
		sd.BufferUsage = DXGI_USAGE_RENDER_TARGET_OUTPUT;
		sd.SwapEffect = DXGI_SWAP_EFFECT_DISCARD;

		sd.OutputWindow = appWindow;
		sd.SampleDesc.Count = g_settings.xmsaa;
		sd.SampleDesc.Quality = g_settings.qmsaa;
		sd.Windowed = true;

		GetDefaultRefreshRate();
		if (g_settings.frameRate <= 0)
		{
			DXGI_RATIONAL fr = GetDefaultRefreshRate();
			sd.BufferDesc.RefreshRate.Numerator = fr.Numerator;
			sd.BufferDesc.RefreshRate.Denominator = fr.Denominator;
			g_settings.frameRate = fr.Numerator / fr.Denominator;
		}
		else
		{
			sd.BufferDesc.RefreshRate.Numerator = g_settings.frameRate;
			sd.BufferDesc.RefreshRate.Denominator = 1;
		}

		IDXGIDevice1	*dxgiDevice = 0;
		IDXGIAdapter1	*dxgiAdapter = 0;
		IDXGIFactory1	*dxgiFactory = 0;
		HR(hr, m_device->QueryInterface(__uuidof(IDXGIDevice1), (void **)&dxgiDevice));
		HR(hr, dxgiDevice->GetParent(__uuidof(IDXGIAdapter1), (void **)&dxgiAdapter));
		HR(hr, dxgiAdapter->GetParent(__uuidof(IDXGIFactory1), (void **)&dxgiFactory));
		HR(hr, dxgiFactory->CreateSwapChain((IUnknown *)m_device, &sd, &m_swapChain));
		memory::SafeRelease(&dxgiDevice);
		memory::SafeRelease(&dxgiAdapter);
		memory::SafeRelease(&dxgiFactory);

		//LOG("num: %d, den: %d\n", sd.BufferDesc.RefreshRate.Numerator, sd.BufferDesc.RefreshRate.Denominator);
		//LOG("scaling: %d, scanline ordering: %d\n", sd.BufferDesc.Scaling, sd.BufferDesc.ScanlineOrdering);

#if defined(DEBUG) || defined(_DEBUG)
		//EnumerateDisplayModes();
		char	*featureLevelNames[] = { "D3D11", "D3D10.1", "D3D10", "D3D9.3", "D3D9.2", "D3D9.1" };
		for (int i = 0; i < 6; i++)
		{
			if (featureLevelsSupported == featureLevelsRequested[i])
				ATOM_LOG("[info]: D3D_FEATURE_LEVEL: %s\n", featureLevelNames[i]);
		}
		ATOM_LOG("[info]: using format: %d, index: %d\n", formats[supportedFormatIndex], supportedFormatIndex);
#endif

		InitRendererResources();

		return Resize(g_settings.width, g_settings.height);
	}