dx11test
diff src/main.cc @ 3:aa1497adac80
fixed line endings
author | John Tsiombikas <nuclear@member.fsf.org> |
---|---|
date | Fri, 21 Jun 2013 09:37:24 +0300 |
parents | 87ecd7292c23 |
children |
line diff
1.1 --- a/src/main.cc Fri Jun 21 09:09:09 2013 +0300 1.2 +++ b/src/main.cc Fri Jun 21 09:37:24 2013 +0300 1.3 @@ -1,341 +1,341 @@ 1.4 -#include <stdio.h> 1.5 -#include <stdlib.h> 1.6 -#include <math.h> 1.7 -#include <stddef.h> 1.8 -#include <d3d11.h> 1.9 -#include <d3dx11.h> 1.10 - 1.11 -struct Vertex { 1.12 - float pos[3]; 1.13 - float color[4]; 1.14 -}; 1.15 - 1.16 -struct RenderState { 1.17 - float modelview[16]; 1.18 - float projection[16]; 1.19 -}; 1.20 - 1.21 -static bool init(); 1.22 -static void cleanup(); 1.23 -static void display(); 1.24 -static void reshape(int x, int y); 1.25 -static void keyb(int key, bool pressed); 1.26 -static HWND create_window(int xsz, int ysz); 1.27 -static void destroy_window(HWND win); 1.28 -static void main_loop(); 1.29 -static long CALLBACK win_proc(HWND win, unsigned int msg, unsigned int wparam, long lparam); 1.30 - 1.31 -static int width, height; 1.32 - 1.33 -static HWND win; 1.34 -static IDXGISwapChain *swap; 1.35 -static ID3D11Device *dev; 1.36 -static ID3D11DeviceContext *ctx; 1.37 -static ID3D11RenderTargetView *rtarg_view; 1.38 -static ID3D11InputLayout *vertex_layout; 1.39 -static ID3D11VertexShader *vsdr; 1.40 -static ID3D11PixelShader *psdr; 1.41 -static ID3D11Buffer *vbuf; 1.42 -static ID3D11Buffer *rstate_buf; 1.43 - 1.44 -static RenderState rstate; 1.45 - 1.46 -int main() 1.47 -{ 1.48 - if(!init()) { 1.49 - return 1; 1.50 - } 1.51 - atexit(cleanup); 1.52 - 1.53 - main_loop(); 1.54 - return 0; 1.55 -} 1.56 - 1.57 -static bool init() 1.58 -{ 1.59 - if(!(win = create_window(800, 600))) { 1.60 - return false; 1.61 - } 1.62 - 1.63 - unsigned int sdrflags = 0;//D3DCOMPILE_ENABLE_STRICTNESS | D3DCOMPILE_DEBUG; 1.64 - 1.65 - ID3DBlob *vsbuf, *psbuf, *msgblob; 1.66 - if(D3DX11CompileFromFile("shader.hlsl", 0, 0, "vertex_main", "vs_4_0", sdrflags, 0, 0, &vsbuf, &msgblob, 0) != 0) { 1.67 - fprintf(stderr, "failed to load vertex shader\n"); 1.68 - if(msgblob->GetBufferSize() > 0) { 1.69 - fprintf(stderr, "Vertex Shader:\n%s\n", (char*)msgblob->GetBufferPointer()); 1.70 - } 1.71 - return false; 1.72 - } 1.73 - if(D3DX11CompileFromFile("shader.hlsl", 0, 0, "pixel_main", "ps_4_0", sdrflags, 0, 0, &psbuf, &msgblob, 0) != 0) { 1.74 - fprintf(stderr, "failed to load pixel shader\n"); 1.75 - if(msgblob->GetBufferSize() > 0) { 1.76 - fprintf(stderr, "Pixel Shader:\n%s\n", (char*)msgblob->GetBufferPointer()); 1.77 - } 1.78 - return false; 1.79 - } 1.80 - 1.81 - if(dev->CreateVertexShader(vsbuf->GetBufferPointer(), vsbuf->GetBufferSize(), 0, &vsdr) != 0) { 1.82 - fprintf(stderr, "failed to create vertex shader\n"); 1.83 - return false; 1.84 - } 1.85 - if(dev->CreatePixelShader(psbuf->GetBufferPointer(), psbuf->GetBufferSize(), 0, &psdr) != 0) { 1.86 - fprintf(stderr, "failed to create pixel shader\n"); 1.87 - return false; 1.88 - } 1.89 - 1.90 - D3D11_INPUT_ELEMENT_DESC elem_desc[2]; 1.91 - elem_desc[0].SemanticName = "position"; 1.92 - elem_desc[0].SemanticIndex = 0; 1.93 - elem_desc[0].Format = DXGI_FORMAT_R32G32B32_FLOAT; 1.94 - elem_desc[0].InputSlot = 0; 1.95 - elem_desc[0].AlignedByteOffset = 0; 1.96 - elem_desc[0].InputSlotClass = D3D11_INPUT_PER_VERTEX_DATA; 1.97 - elem_desc[0].InstanceDataStepRate = 0; 1.98 - 1.99 - elem_desc[1].SemanticName = "color"; 1.100 - elem_desc[1].SemanticIndex = 0; 1.101 - elem_desc[1].Format = DXGI_FORMAT_R32G32B32A32_FLOAT; 1.102 - elem_desc[1].InputSlot = 0; 1.103 - elem_desc[1].AlignedByteOffset = offsetof(Vertex, color); 1.104 - elem_desc[1].InputSlotClass = D3D11_INPUT_PER_VERTEX_DATA; 1.105 - elem_desc[1].InstanceDataStepRate = 0; 1.106 - 1.107 - if(dev->CreateInputLayout(elem_desc, 2, vsbuf->GetBufferPointer(), vsbuf->GetBufferSize(), &vertex_layout) != 0) { 1.108 - fprintf(stderr, "failed to create vertex layout\n"); 1.109 - return 0; 1.110 - } 1.111 - vsbuf->Release(); 1.112 - psbuf->Release(); 1.113 - 1.114 - // --- create vertex buffer --- 1.115 - Vertex varr[] = { 1.116 - {{-0.6, -0.4, 0}, {1, 0, 0, 1}}, 1.117 - {{0.0, 0.6, 0}, {0, 1, 0, 1}}, 1.118 - {{0.6, -0.4, 0}, {0, 0, 1, 1}} 1.119 - }; 1.120 - 1.121 - D3D11_BUFFER_DESC buf_desc; 1.122 - memset(&buf_desc, 0, sizeof buf_desc); 1.123 - buf_desc.Usage = D3D11_USAGE_DEFAULT; 1.124 - buf_desc.ByteWidth = sizeof varr; 1.125 - buf_desc.BindFlags = D3D11_BIND_VERTEX_BUFFER; 1.126 - 1.127 - D3D11_SUBRESOURCE_DATA subdata; 1.128 - memset(&subdata, 0, sizeof subdata); 1.129 - subdata.pSysMem = varr; 1.130 - if(dev->CreateBuffer(&buf_desc, &subdata, &vbuf) != 0) { 1.131 - fprintf(stderr, "failed to create vertex buffer\n"); 1.132 - return false; 1.133 - } 1.134 - 1.135 - // render state buffer 1.136 - memset(&buf_desc, 0, sizeof buf_desc); 1.137 - buf_desc.Usage = D3D11_USAGE_DEFAULT; 1.138 - buf_desc.ByteWidth = sizeof(RenderState); 1.139 - buf_desc.BindFlags = D3D11_BIND_CONSTANT_BUFFER; 1.140 - 1.141 - memset(&subdata, 0, sizeof subdata); 1.142 - subdata.pSysMem = &rstate; 1.143 - if(dev->CreateBuffer(&buf_desc, &subdata, &rstate_buf) != 0) { 1.144 - fprintf(stderr, "failed to create render state buffer\n"); 1.145 - return false; 1.146 - } 1.147 - 1.148 - return true; 1.149 -} 1.150 - 1.151 -static void cleanup() 1.152 -{ 1.153 - vbuf->Release(); 1.154 - rstate_buf->Release(); 1.155 - vsdr->Release(); 1.156 - psdr->Release(); 1.157 - vertex_layout->Release(); 1.158 - destroy_window(win); 1.159 -} 1.160 - 1.161 -static void set_identity(float *mat) 1.162 -{ 1.163 - mat[0] = mat[5] = mat[10] = mat[15] = 1.0; 1.164 - mat[1] = mat[2] = mat[3] = mat[4] = mat[6] = mat[7] = mat[8] = mat[9] = mat[11] = mat[12] = mat[13] = mat[14] = 0.0; 1.165 -} 1.166 - 1.167 -static void set_rotation_z(float *mat, float angle) 1.168 -{ 1.169 - set_identity(mat); 1.170 - 1.171 - mat[0] = cos(angle); 1.172 - mat[1] = -sin(angle); 1.173 - mat[4] = sin(angle); 1.174 - mat[5] = cos(angle); 1.175 -} 1.176 - 1.177 -static void set_ortho(float *mat, float aspect) 1.178 -{ 1.179 - set_identity(mat); 1.180 - mat[0] = 1.0 / aspect; 1.181 -} 1.182 - 1.183 -static void display() 1.184 -{ 1.185 - unsigned int msec = timeGetTime(); 1.186 - 1.187 - float fbcolor[] = {0.2f, 0.2f, 0.2f, 1.0f}; 1.188 - ctx->ClearRenderTargetView(rtarg_view, fbcolor); 1.189 - 1.190 - // set render state constant buffer data 1.191 - set_ortho(rstate.projection, (float)width / (float)height); 1.192 - set_rotation_z(rstate.modelview, msec / 1000.0); 1.193 - 1.194 - ctx->UpdateSubresource(rstate_buf, 0, 0, &rstate, 0, 0); 1.195 - ctx->VSSetConstantBuffers(0, 1, &rstate_buf); 1.196 - 1.197 - 1.198 - unsigned int stride = sizeof(Vertex); 1.199 - unsigned int offset = 0; 1.200 - ctx->IASetVertexBuffers(0, 1, &vbuf, &stride, &offset); 1.201 - ctx->IASetPrimitiveTopology(D3D11_PRIMITIVE_TOPOLOGY_TRIANGLELIST); 1.202 - ctx->IASetInputLayout(vertex_layout); 1.203 - 1.204 - ctx->VSSetShader(vsdr, 0, 0); 1.205 - ctx->PSSetShader(psdr, 0, 0); 1.206 - 1.207 - ctx->Draw(3, 0); 1.208 - 1.209 - swap->Present(0, 0); 1.210 -} 1.211 - 1.212 -static void reshape(int x, int y) 1.213 -{ 1.214 - width = x; 1.215 - height = y; 1.216 - 1.217 - D3D11_VIEWPORT vp; 1.218 - vp.Width = (float)x; 1.219 - vp.Height = (float)y; 1.220 - vp.MinDepth = 0; 1.221 - vp.MaxDepth = 1; 1.222 - vp.TopLeftX = 0; 1.223 - vp.TopLeftY = 0; 1.224 - ctx->RSSetViewports(1, &vp); 1.225 - 1.226 - // TODO probably we also need to resize render targets or whatever... 1.227 -} 1.228 - 1.229 -static void keyb(int key, bool pressed) 1.230 -{ 1.231 - if(key == 27) { 1.232 - exit(0); 1.233 - } 1.234 -} 1.235 - 1.236 -// ---- system crap ---- 1.237 - 1.238 -static HWND create_window(int xsz, int ysz) 1.239 -{ 1.240 - HINSTANCE app_inst = GetModuleHandle(0); 1.241 - 1.242 - WNDCLASS wclass; 1.243 - memset(&wclass, 0, sizeof wclass); 1.244 - wclass.hInstance = app_inst; 1.245 - wclass.lpfnWndProc = win_proc; 1.246 - wclass.lpszClassName = "mutantstargoatwin"; 1.247 - wclass.style = CS_HREDRAW | CS_VREDRAW | CS_OWNDC; 1.248 - wclass.hIcon = LoadIcon(0, IDI_APPLICATION); 1.249 - wclass.hCursor = LoadCursor(0, IDC_ARROW); 1.250 - wclass.hbrBackground = (HBRUSH)GetStockObject(BLACK_BRUSH); 1.251 - RegisterClass(&wclass); 1.252 - 1.253 - int posx = (GetSystemMetrics(SM_CXSCREEN) - xsz) / 2; 1.254 - int posy = (GetSystemMetrics(SM_CYSCREEN) - ysz) / 2; 1.255 - 1.256 - HWND win = CreateWindow("mutantstargoatwin", "DX11 Test", WS_OVERLAPPEDWINDOW, posx, posy, 1.257 - xsz, ysz, 0, 0, app_inst, 0); 1.258 - ShowWindow(win, SW_SHOW); 1.259 - 1.260 - // initialize D3D device 1.261 - DXGI_SWAP_CHAIN_DESC swap_desc; 1.262 - memset(&swap_desc, 0, sizeof swap_desc); 1.263 - swap_desc.BufferCount = 1; 1.264 - swap_desc.BufferDesc.Width = xsz; 1.265 - swap_desc.BufferDesc.Height = ysz; 1.266 - swap_desc.BufferDesc.Format = DXGI_FORMAT_R8G8B8A8_UNORM; 1.267 - swap_desc.BufferDesc.RefreshRate.Numerator = 60; 1.268 - swap_desc.BufferDesc.RefreshRate.Denominator = 1; 1.269 - swap_desc.BufferUsage = DXGI_USAGE_RENDER_TARGET_OUTPUT; 1.270 - swap_desc.OutputWindow = win; 1.271 - swap_desc.SampleDesc.Count = 1; 1.272 - swap_desc.SampleDesc.Quality = 0; 1.273 - swap_desc.Windowed = 1; 1.274 - 1.275 - D3D_FEATURE_LEVEL feature_level = D3D_FEATURE_LEVEL_11_0; 1.276 - 1.277 - if(D3D11CreateDeviceAndSwapChain(0, D3D_DRIVER_TYPE_HARDWARE, 0, 0, &feature_level, 1, 1.278 - D3D11_SDK_VERSION, &swap_desc, &swap, &dev, 0, &ctx) != 0) { 1.279 - fprintf(stderr, "Failed to create d3d device and swap chain\n"); 1.280 - return 0; 1.281 - } 1.282 - 1.283 - ID3D11Texture2D *rtex; 1.284 - if(swap->GetBuffer(0, __uuidof(ID3D11Texture2D), (void**)&rtex) != 0) { 1.285 - fprintf(stderr, "Failed to get default render target texture\n"); 1.286 - return 0; 1.287 - } 1.288 - if(dev->CreateRenderTargetView(rtex, 0, &rtarg_view) != 0) { 1.289 - fprintf(stderr, "Failed to create render target view\n"); 1.290 - rtex->Release(); 1.291 - return 0; 1.292 - } 1.293 - rtex->Release(); 1.294 - ctx->OMSetRenderTargets(1, &rtarg_view, 0); 1.295 - 1.296 - reshape(xsz, ysz); 1.297 - return win; 1.298 -} 1.299 - 1.300 -static void destroy_window(HWND win) 1.301 -{ 1.302 - CloseWindow(win); 1.303 - UnregisterClass("mutantstargoatwin", GetModuleHandle(0)); 1.304 - 1.305 - rtarg_view->Release(); 1.306 - ctx->Release(); 1.307 - dev->Release(); 1.308 - swap->Release(); 1.309 -} 1.310 - 1.311 -static void main_loop() 1.312 -{ 1.313 - MSG msg; 1.314 - 1.315 - for(;;) { 1.316 - while(PeekMessage(&msg, win, 0, 0, PM_REMOVE)) { 1.317 - TranslateMessage(&msg); 1.318 - DispatchMessage(&msg); 1.319 - 1.320 - if(msg.message == WM_QUIT) { 1.321 - return; 1.322 - } 1.323 - } 1.324 - 1.325 - display(); 1.326 - } 1.327 -} 1.328 - 1.329 -static long CALLBACK win_proc(HWND win, unsigned int msg, unsigned int wparam, long lparam) 1.330 -{ 1.331 - switch(msg) { 1.332 - case WM_KEYDOWN: 1.333 - keyb(wparam, true); 1.334 - break; 1.335 - 1.336 - case WM_KEYUP: 1.337 - keyb(wparam, false); 1.338 - break; 1.339 - 1.340 - default: 1.341 - return DefWindowProc(win, msg, wparam, lparam); 1.342 - } 1.343 - return 0; 1.344 -} 1.345 +#include <stdio.h> 1.346 +#include <stdlib.h> 1.347 +#include <math.h> 1.348 +#include <stddef.h> 1.349 +#include <d3d11.h> 1.350 +#include <d3dx11.h> 1.351 + 1.352 +struct Vertex { 1.353 + float pos[3]; 1.354 + float color[4]; 1.355 +}; 1.356 + 1.357 +struct RenderState { 1.358 + float modelview[16]; 1.359 + float projection[16]; 1.360 +}; 1.361 + 1.362 +static bool init(); 1.363 +static void cleanup(); 1.364 +static void display(); 1.365 +static void reshape(int x, int y); 1.366 +static void keyb(int key, bool pressed); 1.367 +static HWND create_window(int xsz, int ysz); 1.368 +static void destroy_window(HWND win); 1.369 +static void main_loop(); 1.370 +static long CALLBACK win_proc(HWND win, unsigned int msg, unsigned int wparam, long lparam); 1.371 + 1.372 +static int width, height; 1.373 + 1.374 +static HWND win; 1.375 +static IDXGISwapChain *swap; 1.376 +static ID3D11Device *dev; 1.377 +static ID3D11DeviceContext *ctx; 1.378 +static ID3D11RenderTargetView *rtarg_view; 1.379 +static ID3D11InputLayout *vertex_layout; 1.380 +static ID3D11VertexShader *vsdr; 1.381 +static ID3D11PixelShader *psdr; 1.382 +static ID3D11Buffer *vbuf; 1.383 +static ID3D11Buffer *rstate_buf; 1.384 + 1.385 +static RenderState rstate; 1.386 + 1.387 +int main() 1.388 +{ 1.389 + if(!init()) { 1.390 + return 1; 1.391 + } 1.392 + atexit(cleanup); 1.393 + 1.394 + main_loop(); 1.395 + return 0; 1.396 +} 1.397 + 1.398 +static bool init() 1.399 +{ 1.400 + if(!(win = create_window(800, 600))) { 1.401 + return false; 1.402 + } 1.403 + 1.404 + unsigned int sdrflags = 0;//D3DCOMPILE_ENABLE_STRICTNESS | D3DCOMPILE_DEBUG; 1.405 + 1.406 + ID3DBlob *vsbuf, *psbuf, *msgblob; 1.407 + if(D3DX11CompileFromFile("shader.hlsl", 0, 0, "vertex_main", "vs_4_0", sdrflags, 0, 0, &vsbuf, &msgblob, 0) != 0) { 1.408 + fprintf(stderr, "failed to load vertex shader\n"); 1.409 + if(msgblob->GetBufferSize() > 0) { 1.410 + fprintf(stderr, "Vertex Shader:\n%s\n", (char*)msgblob->GetBufferPointer()); 1.411 + } 1.412 + return false; 1.413 + } 1.414 + if(D3DX11CompileFromFile("shader.hlsl", 0, 0, "pixel_main", "ps_4_0", sdrflags, 0, 0, &psbuf, &msgblob, 0) != 0) { 1.415 + fprintf(stderr, "failed to load pixel shader\n"); 1.416 + if(msgblob->GetBufferSize() > 0) { 1.417 + fprintf(stderr, "Pixel Shader:\n%s\n", (char*)msgblob->GetBufferPointer()); 1.418 + } 1.419 + return false; 1.420 + } 1.421 + 1.422 + if(dev->CreateVertexShader(vsbuf->GetBufferPointer(), vsbuf->GetBufferSize(), 0, &vsdr) != 0) { 1.423 + fprintf(stderr, "failed to create vertex shader\n"); 1.424 + return false; 1.425 + } 1.426 + if(dev->CreatePixelShader(psbuf->GetBufferPointer(), psbuf->GetBufferSize(), 0, &psdr) != 0) { 1.427 + fprintf(stderr, "failed to create pixel shader\n"); 1.428 + return false; 1.429 + } 1.430 + 1.431 + D3D11_INPUT_ELEMENT_DESC elem_desc[2]; 1.432 + elem_desc[0].SemanticName = "position"; 1.433 + elem_desc[0].SemanticIndex = 0; 1.434 + elem_desc[0].Format = DXGI_FORMAT_R32G32B32_FLOAT; 1.435 + elem_desc[0].InputSlot = 0; 1.436 + elem_desc[0].AlignedByteOffset = 0; 1.437 + elem_desc[0].InputSlotClass = D3D11_INPUT_PER_VERTEX_DATA; 1.438 + elem_desc[0].InstanceDataStepRate = 0; 1.439 + 1.440 + elem_desc[1].SemanticName = "color"; 1.441 + elem_desc[1].SemanticIndex = 0; 1.442 + elem_desc[1].Format = DXGI_FORMAT_R32G32B32A32_FLOAT; 1.443 + elem_desc[1].InputSlot = 0; 1.444 + elem_desc[1].AlignedByteOffset = offsetof(Vertex, color); 1.445 + elem_desc[1].InputSlotClass = D3D11_INPUT_PER_VERTEX_DATA; 1.446 + elem_desc[1].InstanceDataStepRate = 0; 1.447 + 1.448 + if(dev->CreateInputLayout(elem_desc, 2, vsbuf->GetBufferPointer(), vsbuf->GetBufferSize(), &vertex_layout) != 0) { 1.449 + fprintf(stderr, "failed to create vertex layout\n"); 1.450 + return 0; 1.451 + } 1.452 + vsbuf->Release(); 1.453 + psbuf->Release(); 1.454 + 1.455 + // --- create vertex buffer --- 1.456 + Vertex varr[] = { 1.457 + {{-0.6, -0.4, 0}, {1, 0, 0, 1}}, 1.458 + {{0.0, 0.6, 0}, {0, 1, 0, 1}}, 1.459 + {{0.6, -0.4, 0}, {0, 0, 1, 1}} 1.460 + }; 1.461 + 1.462 + D3D11_BUFFER_DESC buf_desc; 1.463 + memset(&buf_desc, 0, sizeof buf_desc); 1.464 + buf_desc.Usage = D3D11_USAGE_DEFAULT; 1.465 + buf_desc.ByteWidth = sizeof varr; 1.466 + buf_desc.BindFlags = D3D11_BIND_VERTEX_BUFFER; 1.467 + 1.468 + D3D11_SUBRESOURCE_DATA subdata; 1.469 + memset(&subdata, 0, sizeof subdata); 1.470 + subdata.pSysMem = varr; 1.471 + if(dev->CreateBuffer(&buf_desc, &subdata, &vbuf) != 0) { 1.472 + fprintf(stderr, "failed to create vertex buffer\n"); 1.473 + return false; 1.474 + } 1.475 + 1.476 + // render state buffer 1.477 + memset(&buf_desc, 0, sizeof buf_desc); 1.478 + buf_desc.Usage = D3D11_USAGE_DEFAULT; 1.479 + buf_desc.ByteWidth = sizeof(RenderState); 1.480 + buf_desc.BindFlags = D3D11_BIND_CONSTANT_BUFFER; 1.481 + 1.482 + memset(&subdata, 0, sizeof subdata); 1.483 + subdata.pSysMem = &rstate; 1.484 + if(dev->CreateBuffer(&buf_desc, &subdata, &rstate_buf) != 0) { 1.485 + fprintf(stderr, "failed to create render state buffer\n"); 1.486 + return false; 1.487 + } 1.488 + 1.489 + return true; 1.490 +} 1.491 + 1.492 +static void cleanup() 1.493 +{ 1.494 + vbuf->Release(); 1.495 + rstate_buf->Release(); 1.496 + vsdr->Release(); 1.497 + psdr->Release(); 1.498 + vertex_layout->Release(); 1.499 + destroy_window(win); 1.500 +} 1.501 + 1.502 +static void set_identity(float *mat) 1.503 +{ 1.504 + mat[0] = mat[5] = mat[10] = mat[15] = 1.0; 1.505 + mat[1] = mat[2] = mat[3] = mat[4] = mat[6] = mat[7] = mat[8] = mat[9] = mat[11] = mat[12] = mat[13] = mat[14] = 0.0; 1.506 +} 1.507 + 1.508 +static void set_rotation_z(float *mat, float angle) 1.509 +{ 1.510 + set_identity(mat); 1.511 + 1.512 + mat[0] = cos(angle); 1.513 + mat[1] = -sin(angle); 1.514 + mat[4] = sin(angle); 1.515 + mat[5] = cos(angle); 1.516 +} 1.517 + 1.518 +static void set_ortho(float *mat, float aspect) 1.519 +{ 1.520 + set_identity(mat); 1.521 + mat[0] = 1.0 / aspect; 1.522 +} 1.523 + 1.524 +static void display() 1.525 +{ 1.526 + unsigned int msec = timeGetTime(); 1.527 + 1.528 + float fbcolor[] = {0.2f, 0.2f, 0.2f, 1.0f}; 1.529 + ctx->ClearRenderTargetView(rtarg_view, fbcolor); 1.530 + 1.531 + // set render state constant buffer data 1.532 + set_ortho(rstate.projection, (float)width / (float)height); 1.533 + set_rotation_z(rstate.modelview, msec / 1000.0); 1.534 + 1.535 + ctx->UpdateSubresource(rstate_buf, 0, 0, &rstate, 0, 0); 1.536 + ctx->VSSetConstantBuffers(0, 1, &rstate_buf); 1.537 + 1.538 + 1.539 + unsigned int stride = sizeof(Vertex); 1.540 + unsigned int offset = 0; 1.541 + ctx->IASetVertexBuffers(0, 1, &vbuf, &stride, &offset); 1.542 + ctx->IASetPrimitiveTopology(D3D11_PRIMITIVE_TOPOLOGY_TRIANGLELIST); 1.543 + ctx->IASetInputLayout(vertex_layout); 1.544 + 1.545 + ctx->VSSetShader(vsdr, 0, 0); 1.546 + ctx->PSSetShader(psdr, 0, 0); 1.547 + 1.548 + ctx->Draw(3, 0); 1.549 + 1.550 + swap->Present(0, 0); 1.551 +} 1.552 + 1.553 +static void reshape(int x, int y) 1.554 +{ 1.555 + width = x; 1.556 + height = y; 1.557 + 1.558 + D3D11_VIEWPORT vp; 1.559 + vp.Width = (float)x; 1.560 + vp.Height = (float)y; 1.561 + vp.MinDepth = 0; 1.562 + vp.MaxDepth = 1; 1.563 + vp.TopLeftX = 0; 1.564 + vp.TopLeftY = 0; 1.565 + ctx->RSSetViewports(1, &vp); 1.566 + 1.567 + // TODO probably we also need to resize render targets or whatever... 1.568 +} 1.569 + 1.570 +static void keyb(int key, bool pressed) 1.571 +{ 1.572 + if(key == 27) { 1.573 + exit(0); 1.574 + } 1.575 +} 1.576 + 1.577 +// ---- system crap ---- 1.578 + 1.579 +static HWND create_window(int xsz, int ysz) 1.580 +{ 1.581 + HINSTANCE app_inst = GetModuleHandle(0); 1.582 + 1.583 + WNDCLASS wclass; 1.584 + memset(&wclass, 0, sizeof wclass); 1.585 + wclass.hInstance = app_inst; 1.586 + wclass.lpfnWndProc = win_proc; 1.587 + wclass.lpszClassName = "mutantstargoatwin"; 1.588 + wclass.style = CS_HREDRAW | CS_VREDRAW | CS_OWNDC; 1.589 + wclass.hIcon = LoadIcon(0, IDI_APPLICATION); 1.590 + wclass.hCursor = LoadCursor(0, IDC_ARROW); 1.591 + wclass.hbrBackground = (HBRUSH)GetStockObject(BLACK_BRUSH); 1.592 + RegisterClass(&wclass); 1.593 + 1.594 + int posx = (GetSystemMetrics(SM_CXSCREEN) - xsz) / 2; 1.595 + int posy = (GetSystemMetrics(SM_CYSCREEN) - ysz) / 2; 1.596 + 1.597 + HWND win = CreateWindow("mutantstargoatwin", "DX11 Test", WS_OVERLAPPEDWINDOW, posx, posy, 1.598 + xsz, ysz, 0, 0, app_inst, 0); 1.599 + ShowWindow(win, SW_SHOW); 1.600 + 1.601 + // initialize D3D device 1.602 + DXGI_SWAP_CHAIN_DESC swap_desc; 1.603 + memset(&swap_desc, 0, sizeof swap_desc); 1.604 + swap_desc.BufferCount = 1; 1.605 + swap_desc.BufferDesc.Width = xsz; 1.606 + swap_desc.BufferDesc.Height = ysz; 1.607 + swap_desc.BufferDesc.Format = DXGI_FORMAT_R8G8B8A8_UNORM; 1.608 + swap_desc.BufferDesc.RefreshRate.Numerator = 60; 1.609 + swap_desc.BufferDesc.RefreshRate.Denominator = 1; 1.610 + swap_desc.BufferUsage = DXGI_USAGE_RENDER_TARGET_OUTPUT; 1.611 + swap_desc.OutputWindow = win; 1.612 + swap_desc.SampleDesc.Count = 1; 1.613 + swap_desc.SampleDesc.Quality = 0; 1.614 + swap_desc.Windowed = 1; 1.615 + 1.616 + D3D_FEATURE_LEVEL feature_level = D3D_FEATURE_LEVEL_11_0; 1.617 + 1.618 + if(D3D11CreateDeviceAndSwapChain(0, D3D_DRIVER_TYPE_HARDWARE, 0, 0, &feature_level, 1, 1.619 + D3D11_SDK_VERSION, &swap_desc, &swap, &dev, 0, &ctx) != 0) { 1.620 + fprintf(stderr, "Failed to create d3d device and swap chain\n"); 1.621 + return 0; 1.622 + } 1.623 + 1.624 + ID3D11Texture2D *rtex; 1.625 + if(swap->GetBuffer(0, __uuidof(ID3D11Texture2D), (void**)&rtex) != 0) { 1.626 + fprintf(stderr, "Failed to get default render target texture\n"); 1.627 + return 0; 1.628 + } 1.629 + if(dev->CreateRenderTargetView(rtex, 0, &rtarg_view) != 0) { 1.630 + fprintf(stderr, "Failed to create render target view\n"); 1.631 + rtex->Release(); 1.632 + return 0; 1.633 + } 1.634 + rtex->Release(); 1.635 + ctx->OMSetRenderTargets(1, &rtarg_view, 0); 1.636 + 1.637 + reshape(xsz, ysz); 1.638 + return win; 1.639 +} 1.640 + 1.641 +static void destroy_window(HWND win) 1.642 +{ 1.643 + CloseWindow(win); 1.644 + UnregisterClass("mutantstargoatwin", GetModuleHandle(0)); 1.645 + 1.646 + rtarg_view->Release(); 1.647 + ctx->Release(); 1.648 + dev->Release(); 1.649 + swap->Release(); 1.650 +} 1.651 + 1.652 +static void main_loop() 1.653 +{ 1.654 + MSG msg; 1.655 + 1.656 + for(;;) { 1.657 + while(PeekMessage(&msg, win, 0, 0, PM_REMOVE)) { 1.658 + TranslateMessage(&msg); 1.659 + DispatchMessage(&msg); 1.660 + 1.661 + if(msg.message == WM_QUIT) { 1.662 + return; 1.663 + } 1.664 + } 1.665 + 1.666 + display(); 1.667 + } 1.668 +} 1.669 + 1.670 +static long CALLBACK win_proc(HWND win, unsigned int msg, unsigned int wparam, long lparam) 1.671 +{ 1.672 + switch(msg) { 1.673 + case WM_KEYDOWN: 1.674 + keyb(wparam, true); 1.675 + break; 1.676 + 1.677 + case WM_KEYUP: 1.678 + keyb(wparam, false); 1.679 + break; 1.680 + 1.681 + default: 1.682 + return DefWindowProc(win, msg, wparam, lparam); 1.683 + } 1.684 + return 0; 1.685 +}