Advertisement
Tkap1

Untitled

Oct 1st, 2024
94
0
Never
Not a member of Pastebin yet? Sign Up, it unlocks many cool features!
C++ 18.19 KB | None | 0 0
  1.  
  2.  
  3. #define zero {}
  4. #define func static
  5. #define global static
  6. #define null nullptr
  7. #define array_count(arr) (sizeof(arr) / sizeof(arr[0]))
  8. #define assert(cond) if(!(cond)) { on_failed_assert(__LINE__); }
  9.  
  10. #define COBJMACROS
  11. #define WIN32_LEAN_AND_MEAN
  12. #include <Windows.h>
  13. #include <d3d11.h>
  14. #include <dxgi1_3.h>
  15. #include <d3dcompiler.h>
  16.  
  17. #ifdef m_debug
  18. #include <dxgidebug.h>
  19. #endif // m_debug
  20.  
  21. #include <stdint.h>
  22. #include <stdlib.h>
  23. #include <stdio.h>
  24. #include <math.h>
  25.  
  26. typedef uint64_t u64;
  27. typedef double f64;
  28.  
  29. #include "main.h"
  30. // vvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvv     globals start       vvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvv
  31. global u64 g_cycle_frequency;
  32. global u64 g_start_cycles;
  33.  
  34. global s_sarray<s_transform, 65536> g_transform_arr;
  35.  
  36. // ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^     globals end     ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^
  37.  
  38.  
  39. LRESULT window_proc(HWND window, UINT msg, WPARAM wparam, LPARAM lparam)
  40. {
  41.     LRESULT result = 0;
  42.     switch(msg) {
  43.         case WM_CLOSE:
  44.         case WM_DESTROY:
  45.         {
  46.             PostQuitMessage(0);
  47.         } break;
  48.  
  49.         default: {
  50.             result = DefWindowProc(window, msg, wparam, lparam);
  51.         }
  52.     }
  53.     return result;
  54. }
  55.  
  56. int main()
  57. {
  58.     HRESULT hr = 0;
  59.     char* class_name = "azenris_class";
  60.     HINSTANCE instance = GetModuleHandle(null);
  61.     ID3D11RenderTargetView* rtView = null;
  62.     ID3D11DepthStencilView* dsView = null;
  63.     ID3D11DeviceContext* context = null;
  64.     IDXGISwapChain1* swap_chain = null;
  65.     ID3D11Device* device = null;
  66.     ID3D11InputLayout* layout;
  67.     ID3D11Buffer* vbuffer0 = null;
  68.     ID3D11Buffer* vbuffer1 = null;
  69.     ID3D11VertexShader* vshader;
  70.     ID3D11PixelShader* pshader;
  71.     ID3D11RasterizerState* rasterizerState;
  72.     ID3D11SamplerState* sampler;
  73.     ID3D11BlendState* blendState;
  74.     ID3D11DepthStencilState* depthState;
  75.     ID3D11Buffer* ubuffer;
  76.  
  77.     WNDCLASSEX window_class = zero;
  78.     window_class.cbSize = sizeof(window_class);
  79.     window_class.lpfnWndProc = window_proc;
  80.     window_class.hInstance = instance;
  81.     window_class.lpszClassName = class_name;
  82.     RegisterClassEx(&window_class);
  83.  
  84.     HWND window = CreateWindowEx(
  85.         WS_EX_APPWINDOW | WS_EX_NOREDIRECTIONBITMAP, class_name, "D3D11", WS_OVERLAPPEDWINDOW | WS_VISIBLE, CW_USEDEFAULT, CW_USEDEFAULT, CW_USEDEFAULT, CW_USEDEFAULT,
  86.         null, null, instance, null
  87.     );
  88.  
  89.     // vvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvv     d3d11 start     vvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvv
  90.     {
  91.         {
  92.             int flags = 0;
  93.             #ifdef m_debug
  94.             flags |= D3D11_CREATE_DEVICE_DEBUG;
  95.             #endif // m_debug
  96.  
  97.             D3D_FEATURE_LEVEL level_arr[] = {D3D_FEATURE_LEVEL_11_0};
  98.             HRESULT result = D3D11CreateDevice(null, D3D_DRIVER_TYPE_HARDWARE, null,
  99.                 flags, level_arr,
  100.                 array_count(level_arr), D3D11_SDK_VERSION, &device, null, &context
  101.             );
  102.         }
  103.  
  104.         {
  105.             #ifdef m_debug
  106.             ID3D11InfoQueue* info = null;
  107.             device->QueryInterface(__uuidof(ID3D11InfoQueue), (void**)&info);
  108.             info->SetBreakOnSeverity(D3D11_MESSAGE_SEVERITY_CORRUPTION, TRUE);
  109.             info->SetBreakOnSeverity(D3D11_MESSAGE_SEVERITY_ERROR, TRUE);
  110.             info->Release();
  111.             #endif // m_debug
  112.         }
  113.  
  114.         {
  115.             #ifdef m_debug
  116.             IDXGIInfoQueue* dxgi_info;
  117.             DXGIGetDebugInterface1(0, IID_IDXGIInfoQueue, (void**)&dxgi_info);
  118.             dxgi_info->SetBreakOnSeverity(DXGI_DEBUG_ALL, DXGI_INFO_QUEUE_MESSAGE_SEVERITY_CORRUPTION, TRUE);
  119.             dxgi_info->SetBreakOnSeverity(DXGI_DEBUG_ALL, DXGI_INFO_QUEUE_MESSAGE_SEVERITY_ERROR, TRUE);
  120.             dxgi_info->Release();
  121.             #endif // m_debug
  122.         }
  123.  
  124.         {
  125.             IDXGIDevice* dxgi_device = null;
  126.             device->QueryInterface(IID_IDXGIDevice, (void**)&dxgi_device);
  127.  
  128.             IDXGIAdapter* dxgi_adapter;
  129.             dxgi_device->GetAdapter(&dxgi_adapter);
  130.  
  131.             IDXGIFactory2* factory = null;
  132.             dxgi_adapter->GetParent(IID_IDXGIFactory2, (void**)&factory);
  133.  
  134.              DXGI_SWAP_CHAIN_DESC1 desc = {
  135.                 // default 0 value for width & height means to get it from HWND automatically
  136.                 //.Width = 0,
  137.                 //.Height = 0,
  138.  
  139.                 // or use DXGI_FORMAT_R8G8B8A8_UNORM_SRGB for storing sRGB
  140.                 .Format = DXGI_FORMAT_R8G8B8A8_UNORM,
  141.  
  142.                 // FLIP presentation model does not allow MSAA framebuffer
  143.                 // if you want MSAA then you'll need to render offscreen and manually
  144.                 // resolve to non-MSAA framebuffer
  145.                 .SampleDesc = { 1, 0 },
  146.  
  147.                 .BufferUsage = DXGI_USAGE_RENDER_TARGET_OUTPUT,
  148.                 .BufferCount = 2,
  149.  
  150.                 // we don't want any automatic scaling of window content
  151.                 // this is supported only on FLIP presentation model
  152.                 .Scaling = DXGI_SCALING_NONE,
  153.  
  154.                 // use more efficient FLIP presentation model
  155.                 // Windows 10 allows to use DXGI_SWAP_EFFECT_FLIP_DISCARD
  156.                 // for Windows 8 compatibility use DXGI_SWAP_EFFECT_FLIP_SEQUENTIAL
  157.                 // for Windows 7 compatibility use DXGI_SWAP_EFFECT_DISCARD
  158.                 .SwapEffect = DXGI_SWAP_EFFECT_FLIP_DISCARD,
  159.             };
  160.  
  161.             factory->CreateSwapChainForHwnd((IUnknown*)device, window, &desc, null, null, &swap_chain);
  162.  
  163.             // disable silly Alt+Enter changing monitor resolution to match window size
  164.             factory->MakeWindowAssociation(window, DXGI_MWA_NO_ALT_ENTER);
  165.  
  166.             factory->Release();
  167.             dxgi_adapter->Release();
  168.             dxgi_device->Release();
  169.         }
  170.  
  171.         {
  172.             constexpr float c_size = 0.5f;
  173.             s_vertex data0[] = {
  174.                 {{-c_size, c_size}, {0, 0}, {1, 1, 1}},
  175.                 {{c_size, c_size}, {1, 0}, {1, 1, 1}},
  176.                 {{c_size, -c_size}, {1, 1}, {1, 1, 1}},
  177.                 {{-c_size, c_size}, {0, 0}, {1, 1, 1}},
  178.                 {{c_size, -c_size}, {1, 1}, {1, 1, 1}},
  179.                 {{-c_size, -c_size}, {0, 1}, {1, 1, 1}},
  180.             };
  181.  
  182.             D3D11_BUFFER_DESC desc = {
  183.                 .ByteWidth = sizeof(data0),
  184.                 .Usage = D3D11_USAGE_IMMUTABLE,
  185.                 .BindFlags = D3D11_BIND_VERTEX_BUFFER,
  186.             };
  187.             D3D11_SUBRESOURCE_DATA initial = {.pSysMem = data0};
  188.             device->CreateBuffer(&desc, &initial, &vbuffer0);
  189.         }
  190.  
  191.         {
  192.             D3D11_BUFFER_DESC desc = {
  193.                 .ByteWidth = sizeof(g_transform_arr.element_arr),
  194.                 .Usage = D3D11_USAGE_DYNAMIC,
  195.                 .BindFlags = D3D11_BIND_VERTEX_BUFFER,
  196.                 .CPUAccessFlags = D3D11_CPU_ACCESS_WRITE,
  197.             };
  198.             device->CreateBuffer(&desc, null, &vbuffer1);
  199.             assert(vbuffer1);
  200.         }
  201.  
  202.         D3D11_INPUT_ELEMENT_DESC desc[] = {
  203.             {"POSITION", 0, DXGI_FORMAT_R32G32_FLOAT,    0, offsetof(s_vertex, pos), D3D11_INPUT_PER_VERTEX_DATA, 0 },
  204.             {"TEXCOORD", 0, DXGI_FORMAT_R32G32_FLOAT,    0, offsetof(s_vertex, uv),       D3D11_INPUT_PER_VERTEX_DATA, 0 },
  205.             {"COLOR",    0, DXGI_FORMAT_R32G32B32_FLOAT, 0, offsetof(s_vertex, color),    D3D11_INPUT_PER_VERTEX_DATA, 0 },
  206.             {"AZEN_POS",    0, DXGI_FORMAT_R32G32_FLOAT, 1, offsetof(s_transform, pos),    D3D11_INPUT_PER_INSTANCE_DATA, 1 },
  207.             {"AZEN_SIZE",    0, DXGI_FORMAT_R32G32_FLOAT, 1, offsetof(s_transform, size),    D3D11_INPUT_PER_INSTANCE_DATA, 1 },
  208.         };
  209.  
  210.         const char hlsl[] =
  211.             "#line 194                                  \n\n" // actual line number in this file for nicer error messages
  212.             "                                                           \n"
  213.             "struct VS_INPUT                                            \n"
  214.             "{                                                          \n"
  215.             "     float2 pos   : POSITION;                              \n" // these names must match D3D11_INPUT_ELEMENT_DESC array
  216.             "     float2 uv    : TEXCOORD;                              \n"
  217.             "     float3 color : COLOR;                                 \n"
  218.             "     float2 pos2 : AZEN_POS;                                 \n"
  219.             "     float2 size2 : AZEN_SIZE;                                 \n"
  220.             "};                                                         \n"
  221.             "                                                           \n"
  222.             "struct PS_INPUT                                            \n"
  223.             "{                                                          \n"
  224.             "  float4 pos   : SV_POSITION;                              \n" // these names do not matter, except SV_... ones
  225.             "  float2 uv    : TEXCOORD;                                 \n"
  226.             "  float4 color : COLOR;                                    \n"
  227.             "};                                                         \n"
  228.             "                                                           \n"
  229.             "cbuffer cbuffer0 : register(b0)                            \n" // b0 = constant buffer bound to slot 0
  230.             "{                                                          \n"
  231.             "    float4x4 u_transform;                                   \n"
  232.             "}                                                                                                      \n"
  233.             "                                                           \n"
  234.             "                                                           \n"
  235.             "PS_INPUT vs(VS_INPUT input)                                \n"
  236.             "{                                                          \n"
  237.             "    PS_INPUT output;                                       \n"
  238.             "    output.pos = mul(u_transform, float4(input.pos * input.size2 + input.pos2, 0, 1)); \n"
  239.             "    output.uv = input.uv;                                  \n"
  240.             "    output.color = float4(input.color, 1);                 \n"
  241.             "    return output;                                         \n"
  242.             "}                                                          \n"
  243.             "                                                           \n"
  244.             "float4 ps(PS_INPUT input) : SV_TARGET                      \n"
  245.             "{                                                          \n"
  246.             "    float4 color = float4(input.uv.x, input.uv.y, 0.0, 1.0);                              \n"
  247.             "    return input.color * color;                              \n"
  248.             "}                                                          \n";
  249.         ;
  250.  
  251.         UINT flags = D3DCOMPILE_PACK_MATRIX_COLUMN_MAJOR | D3DCOMPILE_ENABLE_STRICTNESS | D3DCOMPILE_WARNINGS_ARE_ERRORS;
  252.  
  253.         #ifdef m_debug
  254.         flags |= D3DCOMPILE_DEBUG | D3DCOMPILE_SKIP_OPTIMIZATION;
  255.         #endif // m_debug
  256.  
  257.         ID3DBlob* error;
  258.         ID3DBlob* vblob;
  259.         hr = D3DCompile(hlsl, sizeof(hlsl), null, null, null, "vs", "vs_5_0", flags, 0, &vblob, &error);
  260.         if(FAILED(hr)) {
  261.             const char* message = (char*)error->GetBufferPointer();
  262.             printf("%s\n", message);
  263.             assert(!"Failed to compile vertex shader!");
  264.         }
  265.  
  266.         ID3DBlob* pblob;
  267.         hr = D3DCompile(hlsl, sizeof(hlsl), null, null, null, "ps", "ps_5_0", flags, 0, &pblob, &error);
  268.         if(FAILED(hr)) {
  269.             const char* message = (char*)error->GetBufferPointer();
  270.             printf("%s\n", message);
  271.             assert(!"Failed to compile pixel shader!");
  272.         }
  273.  
  274.         device->CreateVertexShader(vblob->GetBufferPointer(), vblob->GetBufferSize(), null, &vshader);
  275.         device->CreatePixelShader(pblob->GetBufferPointer(), pblob->GetBufferSize(), null, &pshader);
  276.         device->CreateInputLayout(desc, array_count(desc), vblob->GetBufferPointer(), vblob->GetBufferSize(), &layout);
  277.  
  278.         pblob->Release();
  279.         vblob->Release();
  280.  
  281.         {
  282.             D3D11_BUFFER_DESC desc =
  283.             {
  284.                 // space for 4x4 float matrix (cbuffer0 from pixel shader)
  285.                 .ByteWidth = 4 * 4 * sizeof(float),
  286.                 .Usage = D3D11_USAGE_DYNAMIC,
  287.                 .BindFlags = D3D11_BIND_CONSTANT_BUFFER,
  288.                 .CPUAccessFlags = D3D11_CPU_ACCESS_WRITE,
  289.             };
  290.             device->CreateBuffer(&desc, NULL, &ubuffer);
  291.         }
  292.  
  293.         {
  294.             D3D11_SAMPLER_DESC desc = {
  295.                 .Filter = D3D11_FILTER_MIN_MAG_MIP_POINT,
  296.                 .AddressU = D3D11_TEXTURE_ADDRESS_WRAP,
  297.                 .AddressV = D3D11_TEXTURE_ADDRESS_WRAP,
  298.                 .AddressW = D3D11_TEXTURE_ADDRESS_WRAP,
  299.                 .MipLODBias = 0,
  300.                 .MaxAnisotropy = 1,
  301.                 .MinLOD = 0,
  302.                 .MaxLOD = D3D11_FLOAT32_MAX,
  303.             };
  304.  
  305.             device->CreateSamplerState(&desc, &sampler);
  306.         }
  307.  
  308.         {
  309.             // enable alpha blending
  310.             D3D11_BLEND_DESC desc = {
  311.                 .RenderTarget = {{
  312.                     .BlendEnable = TRUE,
  313.                     .SrcBlend = D3D11_BLEND_SRC_ALPHA,
  314.                     .DestBlend = D3D11_BLEND_INV_SRC_ALPHA,
  315.                     .BlendOp = D3D11_BLEND_OP_ADD,
  316.                     .SrcBlendAlpha = D3D11_BLEND_SRC_ALPHA,
  317.                     .DestBlendAlpha = D3D11_BLEND_INV_SRC_ALPHA,
  318.                     .BlendOpAlpha = D3D11_BLEND_OP_ADD,
  319.                     .RenderTargetWriteMask = D3D11_COLOR_WRITE_ENABLE_ALL,
  320.                 }},
  321.             };
  322.             device->CreateBlendState(&desc, &blendState);
  323.         }
  324.  
  325.         {
  326.             // disable culling
  327.             D3D11_RASTERIZER_DESC desc = {
  328.                 .FillMode = D3D11_FILL_SOLID,
  329.                 .CullMode = D3D11_CULL_NONE,
  330.                 .DepthClipEnable = TRUE,
  331.             };
  332.             device->CreateRasterizerState(&desc, &rasterizerState);
  333.         }
  334.  
  335.         {
  336.             // disable depth & stencil test
  337.             D3D11_DEPTH_STENCIL_DESC desc =
  338.             {
  339.                 .DepthEnable = FALSE,
  340.                 .DepthWriteMask = D3D11_DEPTH_WRITE_MASK_ALL,
  341.                 .DepthFunc = D3D11_COMPARISON_LESS,
  342.                 .StencilEnable = FALSE,
  343.                 .StencilReadMask = D3D11_DEFAULT_STENCIL_READ_MASK,
  344.                 .StencilWriteMask = D3D11_DEFAULT_STENCIL_WRITE_MASK,
  345.                 // .FrontFace = ...
  346.                 // .BackFace = ...
  347.             };
  348.             device->CreateDepthStencilState(&desc, &depthState);
  349.         }
  350.  
  351.     }
  352.     // ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^     d3d11 end       ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^
  353.  
  354.     QueryPerformanceFrequency((LARGE_INTEGER*)&g_cycle_frequency);
  355.     QueryPerformanceCounter((LARGE_INTEGER*)&g_start_cycles);
  356.  
  357.     DWORD curr_width = 0;
  358.     DWORD curr_height = 0;
  359.  
  360.     MSG msg = zero;
  361.     u64 before = get_cycles();
  362.     while(true) {
  363.         u64 after = get_cycles();
  364.         u64 passed_cycles = after - before;
  365.         f64 passed_seconds = passed_cycles / (f64)g_cycle_frequency;
  366.         before = after;
  367.         float delta = (float)passed_seconds;
  368.         printf("FPS: %f\n", 1.0 / delta);
  369.  
  370.         while(PeekMessage(&msg, null, 0, 0, PM_REMOVE) > 0) {
  371.             if(msg.message == WM_QUIT) {
  372.                 return 0;
  373.             }
  374.             TranslateMessage(&msg);
  375.             DispatchMessage(&msg);
  376.         }
  377.  
  378.         RECT rect;
  379.         GetClientRect(window, &rect);
  380.         UINT width = rect.right - rect.left;
  381.         UINT height = rect.bottom - rect.top;
  382.  
  383.         if(rtView == NULL || width != curr_width || height != curr_height) {
  384.             if(rtView) {
  385.                 // release old swap chain buffers
  386.                 context->ClearState();
  387.                 rtView->Release();
  388.                 dsView->Release();
  389.                 rtView = null;
  390.             }
  391.  
  392.             // resize to new size for non-zero size
  393.             if(width != 0 && height != 0) {
  394.                 hr = swap_chain->ResizeBuffers(0, width, height, DXGI_FORMAT_UNKNOWN, 0);
  395.                 if(FAILED(hr)) {
  396.                     printf("Failed to resize swap chain!");
  397.                     assert(false);
  398.                 }
  399.  
  400.                 // create RenderTarget view for new backbuffer texture
  401.                 ID3D11Texture2D* backbuffer;
  402.                 swap_chain->GetBuffer(0, IID_ID3D11Texture2D, (void**)&backbuffer);
  403.                 device->CreateRenderTargetView((ID3D11Resource*)backbuffer, null, &rtView);
  404.                 backbuffer->Release();
  405.  
  406.                 D3D11_TEXTURE2D_DESC depthDesc =
  407.                 {
  408.                         .Width = width,
  409.                         .Height = height,
  410.                         .MipLevels = 1,
  411.                         .ArraySize = 1,
  412.                         .Format = DXGI_FORMAT_D32_FLOAT, // or use DXGI_FORMAT_D32_FLOAT_S8X24_UINT if you need stencil
  413.                         .SampleDesc = { 1, 0 },
  414.                         .Usage = D3D11_USAGE_DEFAULT,
  415.                         .BindFlags = D3D11_BIND_DEPTH_STENCIL,
  416.                 };
  417.  
  418.                 // create new depth stencil texture & DepthStencil view
  419.                 ID3D11Texture2D* depth;
  420.                 device->CreateTexture2D(&depthDesc, NULL, &depth);
  421.                 device->CreateDepthStencilView((ID3D11Resource*)depth, NULL, &dsView);
  422.                 depth->Release();
  423.             }
  424.  
  425.             curr_width = width;
  426.             curr_height = height;
  427.         }
  428.  
  429.         if(rtView) {
  430.             // output viewport covering all client area of window
  431.             D3D11_VIEWPORT viewport = {
  432.                 .TopLeftX = 0,
  433.                 .TopLeftY = 0,
  434.                 .Width = (FLOAT)width,
  435.                 .Height = (FLOAT)height,
  436.                 .MinDepth = 0,
  437.                 .MaxDepth = 1,
  438.             };
  439.  
  440.             // clear screen
  441.             FLOAT color[] = { 0.392f, 0.584f, 0.929f, 1.f };
  442.             context->ClearRenderTargetView(rtView, color);
  443.             context->ClearDepthStencilView(dsView, D3D11_CLEAR_DEPTH | D3D11_CLEAR_STENCIL, 1.f, 0);
  444.  
  445.  
  446.             POINT point;
  447.             GetCursorPos(&point);
  448.             ScreenToClient(window, &point);
  449.             float x = point.x;
  450.             float y = point.y;
  451.  
  452.             g_transform_arr.count = 0;
  453.  
  454.             srand(0);
  455.             for(int i = 0; i < 65536; i += 1) {
  456.                 float x = rand() % width;
  457.                 float y = rand() % height;
  458.                 draw_rect_center(v2(x, y), 0, v2(8));
  459.             }
  460.             // draw_rect_center(v2(width, 0), 0, v2(128));
  461.             // draw_rect_center(v2(width, height), 0, v2(128));
  462.             // draw_rect_center(v2(0, height), 0, v2(128));
  463.  
  464.             {
  465.                 D3D11_MAPPED_SUBRESOURCE mapped = zero;
  466.                 context->Map(vbuffer1, 0, D3D11_MAP_WRITE_DISCARD, 0, &mapped);
  467.  
  468.  
  469.                 memcpy(mapped.pData, g_transform_arr.element_arr, sizeof(s_transform) * g_transform_arr.count);
  470.  
  471.  
  472.                 context->Unmap(vbuffer1, 0);
  473.             }
  474.  
  475.             {
  476.                 float matrix[16] = {
  477.                     2.0f/width,0,0,0,
  478.                     0,-2.0f/height,0,0,
  479.                     0,0,1,0,
  480.                     -1,1,0,1,
  481.                 };
  482.  
  483.                 // float matrix[16] = {
  484.                 //  1,0,0,0,
  485.                 //  0,1,0,0,
  486.                 //  0,0,1,0,
  487.                 //  0,0,0,1,
  488.                 // };
  489.  
  490.  
  491.                 D3D11_MAPPED_SUBRESOURCE mapped;
  492.                 context->Map(ubuffer, 0, D3D11_MAP_WRITE_DISCARD, 0, &mapped);
  493.                 memcpy(mapped.pData, matrix, sizeof(matrix));
  494.                 context->Unmap(ubuffer, 0);
  495.             }
  496.  
  497.             // Input Assembler
  498.             context->IASetInputLayout(layout);
  499.             context->IASetPrimitiveTopology(D3D11_PRIMITIVE_TOPOLOGY_TRIANGLELIST);
  500.             {
  501.                 UINT stride[] = {sizeof(s_vertex), sizeof(s_transform)};
  502.                 UINT offset[] = {0, 0};
  503.                 ID3D11Buffer* buffer[] = {vbuffer0, vbuffer1};
  504.                 context->IASetVertexBuffers(0, 2, buffer, stride, offset);
  505.             }
  506.  
  507.             // Vertex Shader
  508.             context->VSSetConstantBuffers(0, 1, &ubuffer);
  509.             context->VSSetShader(vshader, NULL, 0);
  510.  
  511.             // Rasterizer Stage
  512.             context->RSSetViewports(1, &viewport);
  513.             context->RSSetState(rasterizerState);
  514.  
  515.             // Pixel Shader
  516.             // context->PSSetSamplers(0, 1, &sampler);
  517.             // context->PSSetShaderResources(0, 1, &textureView);
  518.             context->PSSetShader(pshader, NULL, 0);
  519.  
  520.             // Output Merger
  521.             context->OMSetBlendState(blendState, NULL, ~0U);
  522.             context->OMSetDepthStencilState(depthState, 0);
  523.             context->OMSetRenderTargets(1, &rtView, dsView);
  524.  
  525.             // draw 3 vertices
  526.             context->DrawInstanced(6, g_transform_arr.count, 0, 0);
  527.         }
  528.  
  529.         BOOL vsync = TRUE;
  530.         hr = swap_chain->Present(vsync ? 1 : 0, 0);
  531.         if(hr == DXGI_STATUS_OCCLUDED) {
  532.             if(vsync) {
  533.                 Sleep(10);
  534.             }
  535.         }
  536.         else if(FAILED(hr)) {
  537.             printf("Failed to present swap chain! Device lost?\n");
  538.             assert(false);
  539.         }
  540.     }
  541.  
  542. }
  543.  
  544. func void on_failed_assert(int line)
  545. {
  546.     printf("FAILED ASSERT AT %i\n", line);
  547.     MessageBox(null, "Failed assert", "ERROR", MB_OK);
  548.     exit(1);
  549. }
  550.  
  551. template <typename t0, typename t1>
  552. func s_v2 v2(t0 x, t1 y)
  553. {
  554.     return {(float)x, (float)y};
  555. }
  556.  
  557. template <typename t>
  558. func s_v2 v2(t v)
  559. {
  560.     return {(float)v, (float)v};
  561. }
  562.  
  563. func void draw_rect_center(s_v2 pos, float z, s_v2 size)
  564. {
  565.     s_transform t = zero;
  566.     t.pos = pos;
  567.     t.size = size;
  568.     g_transform_arr.add(t);
  569. }
  570.  
  571. func u64 get_cycles()
  572. {
  573.     u64 cycles;
  574.     QueryPerformanceCounter((LARGE_INTEGER*)&cycles);
  575.     return cycles;
  576. }
  577.  
  578. func float get_seconds()
  579. {
  580.     u64 cycles = get_cycles();
  581.     f64 result = (cycles - g_start_cycles) / (f64)g_cycle_frequency;
  582.     return (float)result;
  583. }
Advertisement
Add Comment
Please, Sign In to add comment
Advertisement