# HG changeset patch # User John Tsiombikas # Date 1371789186 -10800 # Node ID 647ba0689512d1b7a3842a1074184894bc971b74 initial commit diff -r 000000000000 -r 647ba0689512 .hgignore --- /dev/null Thu Jan 01 00:00:00 1970 +0000 +++ b/.hgignore Fri Jun 21 07:33:06 2013 +0300 @@ -0,0 +1,7 @@ +\.o$ +\.swp$ +Debug$ +Release$ +\.suo$ +\.user$ +\.sdf$ diff -r 000000000000 -r 647ba0689512 dx11test.sln --- /dev/null Thu Jan 01 00:00:00 1970 +0000 +++ b/dx11test.sln Fri Jun 21 07:33:06 2013 +0300 @@ -0,0 +1,20 @@ + +Microsoft Visual Studio Solution File, Format Version 12.00 +# Visual Studio 2012 +Project("{8BC9CEB8-8B4A-11D0-8D11-00A0C91BC942}") = "dx11test", "dx11test.vcxproj", "{F55C35D3-5A5C-4438-B8AA-E5DFA0EED734}" +EndProject +Global + GlobalSection(SolutionConfigurationPlatforms) = preSolution + Debug|Win32 = Debug|Win32 + Release|Win32 = Release|Win32 + EndGlobalSection + GlobalSection(ProjectConfigurationPlatforms) = postSolution + {F55C35D3-5A5C-4438-B8AA-E5DFA0EED734}.Debug|Win32.ActiveCfg = Debug|Win32 + {F55C35D3-5A5C-4438-B8AA-E5DFA0EED734}.Debug|Win32.Build.0 = Debug|Win32 + {F55C35D3-5A5C-4438-B8AA-E5DFA0EED734}.Release|Win32.ActiveCfg = Release|Win32 + {F55C35D3-5A5C-4438-B8AA-E5DFA0EED734}.Release|Win32.Build.0 = Release|Win32 + EndGlobalSection + GlobalSection(SolutionProperties) = preSolution + HideSolutionNode = FALSE + EndGlobalSection +EndGlobal diff -r 000000000000 -r 647ba0689512 dx11test.vcxproj --- /dev/null Thu Jan 01 00:00:00 1970 +0000 +++ b/dx11test.vcxproj Fri Jun 21 07:33:06 2013 +0300 @@ -0,0 +1,95 @@ + + + + + Debug + Win32 + + + Release + Win32 + + + + {F55C35D3-5A5C-4438-B8AA-E5DFA0EED734} + Win32Proj + dx11test + + + + Application + true + v110 + MultiByte + + + Application + false + v110 + true + MultiByte + + + + + + + + + + + + + true + + + false + + + + + + Level3 + Disabled + WIN32;_DEBUG;_CONSOLE;%(PreprocessorDefinitions) + + + Console + true + dxgi.lib;d3d11.lib;d3dx11.lib;winmm.lib;%(AdditionalDependencies) + + + + + Level3 + + + MaxSpeed + true + true + WIN32;NDEBUG;_CONSOLE;%(PreprocessorDefinitions) + + + Console + true + true + true + dxgi.lib;d3d11.lib;d3dx11.lib;winmm.lib;%(AdditionalDependencies) + + + + + + + + + + + + Document + + + + + + \ No newline at end of file diff -r 000000000000 -r 647ba0689512 dx11test.vcxproj.filters --- /dev/null Thu Jan 01 00:00:00 1970 +0000 +++ b/dx11test.vcxproj.filters Fri Jun 21 07:33:06 2013 +0300 @@ -0,0 +1,33 @@ + + + + + {4FC737F1-C7A5-4376-A066-2A32D752A2FF} + cpp;c;cc;cxx;def;odl;idl;hpj;bat;asm;asmx + + + {93995380-89BD-4b04-88EB-625FBE52EBFB} + h;hpp;hxx;hm;inl;inc;xsd + + + {67DA6AB6-F800-4c08-8B7A-83BB121AAD01} + rc;ico;cur;bmp;dlg;rc2;rct;bin;rgs;gif;jpg;jpeg;jpe;resx;tiff;tif;png;wav;mfcribbon-ms + + + + + Source Files + + + Source Files + + + + + Header Files + + + + + + \ No newline at end of file diff -r 000000000000 -r 647ba0689512 main.cc --- /dev/null Thu Jan 01 00:00:00 1970 +0000 +++ b/main.cc Fri Jun 21 07:33:06 2013 +0300 @@ -0,0 +1,342 @@ +#include +#include +#include +#include +#include +#include +#include "vec.h" + +struct Vertex { + float pos[3]; + float color[4]; +}; + +struct RenderState { + float modelview[16]; + float projection[16]; +}; + +static bool init(); +static void cleanup(); +static void display(); +static void reshape(int x, int y); +static void keyb(int key, bool pressed); +static HWND create_window(int xsz, int ysz); +static void destroy_window(HWND win); +static void main_loop(); +static long CALLBACK win_proc(HWND win, unsigned int msg, unsigned int wparam, long lparam); + +static int width, height; + +static HWND win; +static IDXGISwapChain *swap; +static ID3D11Device *dev; +static ID3D11DeviceContext *ctx; +static ID3D11RenderTargetView *rtarg_view; +static ID3D11InputLayout *vertex_layout; +static ID3D11VertexShader *vsdr; +static ID3D11PixelShader *psdr; +static ID3D11Buffer *vbuf; +static ID3D11Buffer *rstate_buf; + +static RenderState rstate; + +int main() +{ + if(!init()) { + return 1; + } + atexit(cleanup); + + main_loop(); + return 0; +} + +static bool init() +{ + if(!(win = create_window(800, 600))) { + return false; + } + + unsigned int sdrflags = 0;//D3DCOMPILE_ENABLE_STRICTNESS | D3DCOMPILE_DEBUG; + + ID3DBlob *vsbuf, *psbuf, *msgblob; + if(D3DX11CompileFromFile("shader.hlsl", 0, 0, "vertex_main", "vs_4_0", sdrflags, 0, 0, &vsbuf, &msgblob, 0) != 0) { + fprintf(stderr, "failed to load vertex shader\n"); + if(msgblob->GetBufferSize() > 0) { + fprintf(stderr, "Vertex Shader:\n%s\n", (char*)msgblob->GetBufferPointer()); + } + return false; + } + if(D3DX11CompileFromFile("shader.hlsl", 0, 0, "pixel_main", "ps_4_0", sdrflags, 0, 0, &psbuf, &msgblob, 0) != 0) { + fprintf(stderr, "failed to load pixel shader\n"); + if(msgblob->GetBufferSize() > 0) { + fprintf(stderr, "Pixel Shader:\n%s\n", (char*)msgblob->GetBufferPointer()); + } + return false; + } + + if(dev->CreateVertexShader(vsbuf->GetBufferPointer(), vsbuf->GetBufferSize(), 0, &vsdr) != 0) { + fprintf(stderr, "failed to create vertex shader\n"); + return false; + } + if(dev->CreatePixelShader(psbuf->GetBufferPointer(), psbuf->GetBufferSize(), 0, &psdr) != 0) { + fprintf(stderr, "failed to create pixel shader\n"); + return false; + } + + D3D11_INPUT_ELEMENT_DESC elem_desc[2]; + elem_desc[0].SemanticName = "position"; + elem_desc[0].SemanticIndex = 0; + elem_desc[0].Format = DXGI_FORMAT_R32G32B32_FLOAT; + elem_desc[0].InputSlot = 0; + elem_desc[0].AlignedByteOffset = 0; + elem_desc[0].InputSlotClass = D3D11_INPUT_PER_VERTEX_DATA; + elem_desc[0].InstanceDataStepRate = 0; + + elem_desc[1].SemanticName = "color"; + elem_desc[1].SemanticIndex = 0; + elem_desc[1].Format = DXGI_FORMAT_R32G32B32A32_FLOAT; + elem_desc[1].InputSlot = 0; + elem_desc[1].AlignedByteOffset = offsetof(Vertex, color); + elem_desc[1].InputSlotClass = D3D11_INPUT_PER_VERTEX_DATA; + elem_desc[1].InstanceDataStepRate = 0; + + if(dev->CreateInputLayout(elem_desc, 2, vsbuf->GetBufferPointer(), vsbuf->GetBufferSize(), &vertex_layout) != 0) { + fprintf(stderr, "failed to create vertex layout\n"); + return 0; + } + vsbuf->Release(); + psbuf->Release(); + + // --- create vertex buffer --- + Vertex varr[] = { + {{-0.6, -0.4, 0}, {1, 0, 0, 1}}, + {{0.0, 0.6, 0}, {0, 1, 0, 1}}, + {{0.6, -0.4, 0}, {0, 0, 1, 1}} + }; + + D3D11_BUFFER_DESC buf_desc; + memset(&buf_desc, 0, sizeof buf_desc); + buf_desc.Usage = D3D11_USAGE_DEFAULT; + buf_desc.ByteWidth = sizeof varr; + buf_desc.BindFlags = D3D11_BIND_VERTEX_BUFFER; + + D3D11_SUBRESOURCE_DATA subdata; + memset(&subdata, 0, sizeof subdata); + subdata.pSysMem = varr; + if(dev->CreateBuffer(&buf_desc, &subdata, &vbuf) != 0) { + fprintf(stderr, "failed to create vertex buffer\n"); + return false; + } + + // render state buffer + memset(&buf_desc, 0, sizeof buf_desc); + buf_desc.Usage = D3D11_USAGE_DEFAULT; + buf_desc.ByteWidth = sizeof(RenderState); + buf_desc.BindFlags = D3D11_BIND_CONSTANT_BUFFER; + + memset(&subdata, 0, sizeof subdata); + subdata.pSysMem = &rstate; + if(dev->CreateBuffer(&buf_desc, &subdata, &rstate_buf) != 0) { + fprintf(stderr, "failed to create render state buffer\n"); + return false; + } + + return true; +} + +static void cleanup() +{ + vbuf->Release(); + rstate_buf->Release(); + vsdr->Release(); + psdr->Release(); + vertex_layout->Release(); + destroy_window(win); +} + +static void set_identity(float *mat) +{ + mat[0] = mat[5] = mat[10] = mat[15] = 1.0; + 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; +} + +static void set_rotation_z(float *mat, float angle) +{ + set_identity(mat); + + mat[0] = cos(angle); + mat[1] = -sin(angle); + mat[4] = sin(angle); + mat[5] = cos(angle); +} + +static void set_ortho(float *mat, float aspect) +{ + set_identity(mat); + mat[0] = 1.0 / aspect; +} + +static void display() +{ + unsigned int msec = timeGetTime(); + + float fbcolor[] = {0.2f, 0.2f, 0.2f, 1.0f}; + ctx->ClearRenderTargetView(rtarg_view, fbcolor); + + // set render state constant buffer data + set_ortho(rstate.projection, (float)width / (float)height); + set_rotation_z(rstate.modelview, msec / 1000.0); + + ctx->UpdateSubresource(rstate_buf, 0, 0, &rstate, 0, 0); + ctx->VSSetConstantBuffers(0, 1, &rstate_buf); + + + unsigned int stride = sizeof(Vertex); + unsigned int offset = 0; + ctx->IASetVertexBuffers(0, 1, &vbuf, &stride, &offset); + ctx->IASetPrimitiveTopology(D3D11_PRIMITIVE_TOPOLOGY_TRIANGLELIST); + ctx->IASetInputLayout(vertex_layout); + + ctx->VSSetShader(vsdr, 0, 0); + ctx->PSSetShader(psdr, 0, 0); + + ctx->Draw(3, 0); + + swap->Present(0, 0); +} + +static void reshape(int x, int y) +{ + width = x; + height = y; + + D3D11_VIEWPORT vp; + vp.Width = (float)x; + vp.Height = (float)y; + vp.MinDepth = 0; + vp.MaxDepth = 1; + vp.TopLeftX = 0; + vp.TopLeftY = 0; + ctx->RSSetViewports(1, &vp); + + // TODO probably we also need to resize render targets or whatever... +} + +static void keyb(int key, bool pressed) +{ + if(key == 27) { + exit(0); + } +} + +// ---- system crap ---- + +static HWND create_window(int xsz, int ysz) +{ + HINSTANCE app_inst = GetModuleHandle(0); + + WNDCLASS wclass; + memset(&wclass, 0, sizeof wclass); + wclass.hInstance = app_inst; + wclass.lpfnWndProc = win_proc; + wclass.lpszClassName = "mutantstargoatwin"; + wclass.style = CS_HREDRAW | CS_VREDRAW | CS_OWNDC; + wclass.hIcon = LoadIcon(0, IDI_APPLICATION); + wclass.hCursor = LoadCursor(0, IDC_ARROW); + wclass.hbrBackground = (HBRUSH)GetStockObject(BLACK_BRUSH); + RegisterClass(&wclass); + + int posx = (GetSystemMetrics(SM_CXSCREEN) - xsz) / 2; + int posy = (GetSystemMetrics(SM_CYSCREEN) - ysz) / 2; + + HWND win = CreateWindow("mutantstargoatwin", "DX11 Test", WS_OVERLAPPEDWINDOW, posx, posy, + xsz, ysz, 0, 0, app_inst, 0); + ShowWindow(win, SW_SHOW); + + // initialize D3D device + DXGI_SWAP_CHAIN_DESC swap_desc; + memset(&swap_desc, 0, sizeof swap_desc); + swap_desc.BufferCount = 1; + swap_desc.BufferDesc.Width = xsz; + swap_desc.BufferDesc.Height = ysz; + swap_desc.BufferDesc.Format = DXGI_FORMAT_R8G8B8A8_UNORM; + swap_desc.BufferDesc.RefreshRate.Numerator = 60; + swap_desc.BufferDesc.RefreshRate.Denominator = 1; + swap_desc.BufferUsage = DXGI_USAGE_RENDER_TARGET_OUTPUT; + swap_desc.OutputWindow = win; + swap_desc.SampleDesc.Count = 1; + swap_desc.SampleDesc.Quality = 0; + swap_desc.Windowed = 1; + + D3D_FEATURE_LEVEL feature_level = D3D_FEATURE_LEVEL_11_0; + + if(D3D11CreateDeviceAndSwapChain(0, D3D_DRIVER_TYPE_HARDWARE, 0, 0, &feature_level, 1, + D3D11_SDK_VERSION, &swap_desc, &swap, &dev, 0, &ctx) != 0) { + fprintf(stderr, "Failed to create d3d device and swap chain\n"); + return 0; + } + + ID3D11Texture2D *rtex; + if(swap->GetBuffer(0, __uuidof(ID3D11Texture2D), (void**)&rtex) != 0) { + fprintf(stderr, "Failed to get default render target texture\n"); + return 0; + } + if(dev->CreateRenderTargetView(rtex, 0, &rtarg_view) != 0) { + fprintf(stderr, "Failed to create render target view\n"); + rtex->Release(); + return 0; + } + rtex->Release(); + ctx->OMSetRenderTargets(1, &rtarg_view, 0); + + reshape(xsz, ysz); + return win; +} + +static void destroy_window(HWND win) +{ + CloseWindow(win); + UnregisterClass("mutantstargoatwin", GetModuleHandle(0)); + + rtarg_view->Release(); + ctx->Release(); + dev->Release(); + swap->Release(); +} + +static void main_loop() +{ + MSG msg; + + for(;;) { + while(PeekMessage(&msg, win, 0, 0, PM_REMOVE)) { + TranslateMessage(&msg); + DispatchMessage(&msg); + + if(msg.message == WM_QUIT) { + return; + } + } + + display(); + } +} + +static long CALLBACK win_proc(HWND win, unsigned int msg, unsigned int wparam, long lparam) +{ + switch(msg) { + case WM_KEYDOWN: + keyb(wparam, true); + break; + + case WM_KEYUP: + keyb(wparam, false); + break; + + default: + return DefWindowProc(win, msg, wparam, lparam); + } + return 0; +} \ No newline at end of file diff -r 000000000000 -r 647ba0689512 shader.hlsl --- /dev/null Thu Jan 01 00:00:00 1970 +0000 +++ b/shader.hlsl Fri Jun 21 07:33:06 2013 +0300 @@ -0,0 +1,31 @@ +cbuffer RenderState : register(b0) { + matrix modelview_matrix : packoffset(c0); + matrix projection_matrix : packoffset(c4); +}; + +struct VSInput { + float4 pos : POSITION; + float4 color : COLOR; +}; + +struct VSOutput { + float4 pos : SV_POSITION; + float4 color : COLOR0; +}; + +VSOutput vertex_main(VSInput input) +{ + VSOutput res; + + float4 vpos = mul(input.pos, modelview_matrix); + + res.pos = mul(vpos, projection_matrix); + res.color = input.color; + return res; +} + + +float4 pixel_main(VSOutput input) : SV_TARGET +{ + return input.color; +} \ No newline at end of file diff -r 000000000000 -r 647ba0689512 vec.h --- /dev/null Thu Jan 01 00:00:00 1970 +0000 +++ b/vec.h Fri Jun 21 07:33:06 2013 +0300 @@ -0,0 +1,24 @@ +#ifndef VEC_H_ +#define VEC_H_ + +class Vector3 { +public: + float x, y, z; + + Vector3(); + Vector3(float x, float y, float z); +}; + +Vector3::Vector3() +{ + x = y = z = 0.0f; +} + +Vector3::Vector3(float x, float y, float z) +{ + this->x = x; + this->y = y; + this->z = z; +} + +#endif // VEC_H_ \ No newline at end of file