#define WIN32_LEAN_AND_MEAN
#include <windows.h>
#include <assert.h>
#include <d3d11_1.h>
#pragma comment(lib, "d3d11.lib")
LRESULT CALLBACK WndProc(HWND Window, UINT Message, WPARAM WParam, LPARAM LParam);
int CALLBACK WinMain(HINSTANCE hInstance, HINSTANCE hPrevInstance, LPSTR lpCmdLine, int nCmdShow)
{
// Create a window
WNDCLASS WindowClass = {};
const wchar_t ClassName[] = L"WindowClassName";
WindowClass.lpfnWndProc = WndProc;
WindowClass.hInstance = hInstance;
WindowClass.lpszClassName = ClassName;
WindowClass.hCursor = LoadCursor(0, IDC_CROSS);
if (!RegisterClass(&WindowClass)) {
MessageBox(0, L"RegisterClass failed", 0, 0);
return GetLastError();
}
HWND Window = CreateWindowEx(0, ClassName, L"Window",
WS_OVERLAPPEDWINDOW | WS_VISIBLE,
CW_USEDEFAULT, CW_USEDEFAULT, CW_USEDEFAULT, CW_USEDEFAULT,
0, 0, hInstance, 0);
if (!Window) {
MessageBox(0, L"CreateWindowEx failed", 0, 0);
return GetLastError();
}
// Create Direct3D 11 Device and Context
ID3D11Device* DeviceCreated;
ID3D11DeviceContext* DeviceContext;
UINT flags = 0;
D3D_FEATURE_LEVEL FeatureLevels[] = {
D3D_FEATURE_LEVEL_11_0
};
/*
HRESULT D3D11CreateDevice(
[in, optional] IDXGIAdapter *pAdapter,
D3D_DRIVER_TYPE DriverType,
HMODULE Software,
UINT Flags,
[in, optional] const D3D_FEATURE_LEVEL *pFeatureLevels,
UINT FeatureLevels,
UINT SDKVersion,
[out, optional] ID3D11Device **ppDevice,
[out, optional] D3D_FEATURE_LEVEL *pFeatureLevel,
[out, optional] ID3D11DeviceContext **ppImmediateContext
);
*/
HRESULT Result = D3D11CreateDevice(0, D3D_DRIVER_TYPE_HARDWARE, 0,
flags, FeatureLevels,
ARRAYSIZE(FeatureLevels),
D3D11_SDK_VERSION, &DeviceCreated, 0,
&DeviceContext);
if (FAILED(Result)) {
MessageBox(0, L"D3D11CreateDevice failed", 0, 0);
return GetLastError();
}
ID3D11Device1* Device;
ID3D11DeviceContext1* Context;
Result = DeviceCreated->QueryInterface(__uuidof(ID3D11Device1), (void**)&Device);
assert(SUCCEEDED(Result));
DeviceCreated->Release();
Result = DeviceContext->QueryInterface(__uuidof(ID3D11DeviceContext1), (void**)&Context);
assert(SUCCEEDED(Result));
DeviceContext->Release();
// Create Swap Chain
DXGI_SWAP_CHAIN_DESC1 SwapChainDesc = {};
SwapChainDesc.Width = 0;
SwapChainDesc.Height = 0;
SwapChainDesc.Format = DXGI_FORMAT_R8G8B8A8_UNORM;
SwapChainDesc.SampleDesc.Count = 1;
SwapChainDesc.SampleDesc.Quality = 0;
SwapChainDesc.BufferUsage = DXGI_USAGE_RENDER_TARGET_OUTPUT;
SwapChainDesc.BufferCount = 1;
SwapChainDesc.Scaling = DXGI_SCALING_STRETCH;
SwapChainDesc.SwapEffect = DXGI_SWAP_EFFECT_DISCARD;
SwapChainDesc.AlphaMode = DXGI_ALPHA_MODE_UNSPECIFIED;
SwapChainDesc.Flags = 0;
IDXGISwapChain1* SwapChain;
IDXGIDevice2* DxgiDevice;
Result = Device->QueryInterface(__uuidof(IDXGIDevice2), (void**)&DxgiDevice);
assert(SUCCEEDED(Result));
IDXGIAdapter* DxgiAdapter;
Result = DxgiDevice->GetAdapter(&DxgiAdapter);
assert(SUCCEEDED(Result));
DxgiDevice->Release();
IDXGIFactory2* DxgiFactory;
Result = DxgiAdapter->GetParent(__uuidof(IDXGIFactory2), (void**)&DxgiFactory);
assert(SUCCEEDED(Result));
DxgiAdapter->Release();
Result = DxgiFactory->CreateSwapChainForHwnd(Device, Window,
&SwapChainDesc, 0, 0, &SwapChain);
assert(SUCCEEDED(Result));
DxgiFactory->Release();
// Texture & RenderTargetView
ID3D11Texture2D* Texture;
Result = SwapChain->GetBuffer(0, __uuidof(ID3D11Texture2D), (void**)&Texture);
assert(SUCCEEDED(Result));
ID3D11RenderTargetView* RenderTargetView;
Result = Device->CreateRenderTargetView(Texture, 0, &RenderTargetView);
assert(SUCCEEDED(Result));
Texture->Release();
bool Running = true;
while (Running) {
MSG Message;
while (PeekMessage(&Message, nullptr, 0, 0, PM_REMOVE)) {
if (Message.message == WM_QUIT) Running = false;
TranslateMessage(&Message);
DispatchMessage(&Message);
}
float Color[4] = { 0.0f, 0.5f, 0.0f, 1.0f }; // Green
Context->ClearRenderTargetView(RenderTargetView, Color);
SwapChain->Present(1, 0);
}
return 0;
}
LRESULT CALLBACK WndProc(HWND hwnd, UINT msg, WPARAM wparam, LPARAM lparam)
{
LRESULT result = 0;
switch (msg) {
case WM_KEYDOWN:
{
if (wparam == VK_ESCAPE) {
DestroyWindow(hwnd);
}
break;
}
case WM_DESTROY:
{
PostQuitMessage(0);
break;
}
default:
result = DefWindowProcW(hwnd, msg, wparam, lparam);
}
return result;
}
/*
run:
*/