static inline bool gl_shtex_init_d3d11(void) { D3D_FEATURE_LEVEL level_used; IDXGIFactory1 *factory; IDXGIAdapter *adapter; HRESULT hr; HMODULE d3d11 = load_system_library("d3d11.dll"); if (!d3d11) { hlog("gl_shtex_init_d3d11: failed to load D3D11.dll: %d", GetLastError()); return false; } HMODULE dxgi = load_system_library("dxgi.dll"); if (!dxgi) { hlog("gl_shtex_init_d3d11: failed to load DXGI.dll: %d", GetLastError()); return false; } DXGI_SWAP_CHAIN_DESC desc = {0}; desc.BufferCount = 2; desc.BufferDesc.Format = DXGI_FORMAT_B8G8R8A8_UNORM; desc.BufferDesc.Width = 2; desc.BufferDesc.Height = 2; desc.BufferUsage = DXGI_USAGE_RENDER_TARGET_OUTPUT; desc.SampleDesc.Count = 1; desc.Windowed = true; desc.OutputWindow = data.hwnd; create_dxgi_factory1_t create_factory = (void*)GetProcAddress(dxgi, "CreateDXGIFactory1"); if (!create_factory) { hlog("gl_shtex_init_d3d11: failed to load CreateDXGIFactory1 " "procedure: %d", GetLastError()); return false; } PFN_D3D11_CREATE_DEVICE_AND_SWAP_CHAIN create = (void*)GetProcAddress( d3d11, "D3D11CreateDeviceAndSwapChain"); if (!create) { hlog("gl_shtex_init_d3d11: failed to load " "D3D11CreateDeviceAndSwapChain procedure: %d", GetLastError()); return false; } hr = create_factory(&GUID_IDXGIFactory1, (void**)&factory); if (FAILED(hr)) { hlog_hr("gl_shtex_init_d3d11: failed to create factory", hr); return false; } hr = IDXGIFactory1_EnumAdapters1(factory, 0, (IDXGIAdapter1**)&adapter); IDXGIFactory1_Release(factory); if (FAILED(hr)) { hlog_hr("gl_shtex_init_d3d11: failed to create adapter", hr); return false; } hr = create(adapter, D3D_DRIVER_TYPE_UNKNOWN, NULL, 0, feature_levels, sizeof(feature_levels) / sizeof(D3D_FEATURE_LEVEL), D3D11_SDK_VERSION, &desc, &data.dxgi_swap, &data.d3d11_device, &level_used, &data.d3d11_context); IDXGIAdapter_Release(adapter); if (FAILED(hr)) { hlog_hr("gl_shtex_init_d3d11: failed to create device", hr); return false; } return true; }
static inline bool shex_init_d3d11() { PFN_D3D11_CREATE_DEVICE create_device; createfactory1_t create_factory; D3D_FEATURE_LEVEL level_used; IDXGIFactory *factory; IDXGIAdapter *adapter; HMODULE d3d11; HMODULE dxgi; HRESULT hr; d3d11 = load_system_library("d3d11.dll"); if (!d3d11) { hlog("d3d9_init: Failed to load D3D11"); return false; } dxgi = load_system_library("dxgi.dll"); if (!dxgi) { hlog("d3d9_init: Failed to load DXGI"); return false; } create_factory = (createfactory1_t)GetProcAddress(dxgi, "CreateDXGIFactory1"); if (!create_factory) { hlog("d3d9_init: Failed to get CreateDXGIFactory1 address"); return false; } create_device = (PFN_D3D11_CREATE_DEVICE)GetProcAddress(d3d11, "D3D11CreateDevice"); if (!create_device) { hlog("d3d9_init: Failed to get D3D11CreateDevice address"); return false; } hr = create_factory(__uuidof(IDXGIFactory1), (void**)&factory); if (FAILED(hr)) { hlog_hr("d3d9_init: Failed to create factory object", hr); return false; } hr = factory->EnumAdapters(0, &adapter); factory->Release(); if (FAILED(hr)) { hlog_hr("d3d9_init: Failed to get adapter", hr); return false; } hr = create_device(adapter, D3D_DRIVER_TYPE_UNKNOWN, nullptr, 0, feature_levels, sizeof(feature_levels) / sizeof(D3D_FEATURE_LEVEL), D3D11_SDK_VERSION, &data.d3d11_device, &level_used, &data.d3d11_context); adapter->Release(); if (FAILED(hr)) { hlog_hr("d3d9_init: Failed to create D3D11 device", hr); return false; } return true; }