#define VC_EXTRALEAN #define WIN32_LEAN_AND_MEAN #include #include #define D3D11_NO_HELPERS #include #include #include #define ATOM_EDIT 0xC018 #define ATOM_STATIC 0xC019 #define WIDTH 1280 #define HEIGHT 720 #define _FULLSCREEN typedef struct { // DXGI_MODE_DESC BufferDesc; UINT Width; UINT Height; //DXGI_RATIONAL RefreshRate; UINT Numerator; UINT Denominator; DXGI_FORMAT Format; DXGI_MODE_SCANLINE_ORDER ScanlineOrdering; DXGI_MODE_SCALING Scaling; // DXGI_SAMPLE_DESC SampleDesc; UINT Count; UINT Quality; DXGI_USAGE BufferUsage; UINT BufferCount; HWND OutputWindow; BOOL Windowed; DXGI_SWAP_EFFECT SwapEffect; UINT Flags; } HG_DXGI_SWAP_CHAIN_DESC; struct ConstantBufferType { float demoTime; float deltaTime; float dummy1; float dummy2; }; #pragma bss_seg(".bss") static HWND hWnd; static ID3D11Device* device; static ID3D11DeviceContext* context; static IDXGISwapChain* swapChain; static ID3D11Texture2D* backBufferTexture; static ID3D11RenderTargetView* renderTargetView; static ID3D11UnorderedAccessView* particleBuffer1UAV; static ID3D11ShaderResourceView* particleBuffer1SRV; static ID3D11UnorderedAccessView* particleBuffer2UAV; static ID3D11ShaderResourceView* particleBuffer2SRV; static ID3D11Buffer* particleBuffer1; static ID3D11Buffer* particleBuffer2; static ID3D11Texture2D* depthBuffer; static ID3D11Buffer* constantBuffer; static ID3D11ComputeShader* initShader; static ID3D11ComputeShader* updateShader; static ID3D11ComputeShader* drawShader; static ID3D11VertexShader* particleVertexShader; static ID3D11GeometryShader* particleGeometryShader; static ID3D11PixelShader* particlePixelShader; static ID3D11InputLayout* particleInputLayout; static ID3D11RenderTargetView* backBufferRtv; static ID3D11DepthStencilState* depthStencilState; static ID3D11DepthStencilView* depthStencilView; static ID3D11BlendState* alphaBlendState; static pD3DCompile d3dCompile; static ID3DBlob* shaderBlob; static void* shaderCode; static SIZE_T shaderSize; static D3D11_MAPPED_SUBRESOURCE mappedResource; static float zero[4]; #pragma data_seg(".d3dcompiler") static char* d3dcompiler = "d3dcompiler_47.dll"; #pragma data_seg(".swapChainDesc") #ifdef FULLSCREEN HG_DXGI_SWAP_CHAIN_DESC swapChainDesc = { WIDTH, HEIGHT, 0, 1, DXGI_FORMAT_R16G16B16A16_FLOAT, DXGI_MODE_SCANLINE_ORDER_UNSPECIFIED, DXGI_MODE_SCALING_UNSPECIFIED, 4, 0, DXGI_USAGE_RENDER_TARGET_OUTPUT | DXGI_USAGE_SHADER_INPUT, 1, 0, 0, DXGI_SWAP_EFFECT_DISCARD, 0 }; #else HG_DXGI_SWAP_CHAIN_DESC swapChainDesc = { WIDTH, HEIGHT, 0, 1, DXGI_FORMAT_R16G16B16A16_FLOAT, DXGI_MODE_SCANLINE_ORDER_UNSPECIFIED, DXGI_MODE_SCALING_UNSPECIFIED, 4, 0, DXGI_USAGE_RENDER_TARGET_OUTPUT | DXGI_USAGE_SHADER_INPUT, 1, 0, -1, DXGI_SWAP_EFFECT_DISCARD, 0 }; #endif #pragma data_seg(".depthBufferDesc") static D3D11_TEXTURE2D_DESC depthBufferDesc = { WIDTH, HEIGHT, 1, 1, DXGI_FORMAT_D32_FLOAT, { 1, 0 }, D3D11_USAGE_DEFAULT, D3D11_BIND_DEPTH_STENCIL, 0, 0 }; #pragma data_seg(".constantBufferDesc") static D3D11_BUFFER_DESC constantBufferDesc = { 16, D3D11_USAGE_DYNAMIC, D3D11_BIND_CONSTANT_BUFFER, D3D11_CPU_ACCESS_WRITE, 0, 0 }; #pragma data_seg(".particleBufferDesc") static D3D11_BUFFER_DESC particleBufferDesc = { 1024 * 1024 * 48, D3D11_USAGE_DEFAULT, D3D11_BIND_UNORDERED_ACCESS | D3D11_BIND_SHADER_RESOURCE, 0, D3D11_RESOURCE_MISC_BUFFER_STRUCTURED, 48 }; #pragma data_seg(".particleBufferDesc") static D3D11_SHADER_RESOURCE_VIEW_DESC particleSrvDesc = { DXGI_FORMAT_UNKNOWN, D3D11_SRV_DIMENSION_BUFFER, { 0, 1024 * 1024 } }; #pragma data_seg(".particleUavDesc") static D3D11_UNORDERED_ACCESS_VIEW_DESC particleUavDesc = { DXGI_FORMAT_UNKNOWN, D3D11_UAV_DIMENSION_BUFFER, 0, 1024 * 1024, D3D11_BUFFER_UAV_FLAG_APPEND }; #pragma data_seg(".vertexUavDesc") static D3D11_UNORDERED_ACCESS_VIEW_DESC vertexUavDesc = { DXGI_FORMAT_UNKNOWN, D3D11_UAV_DIMENSION_BUFFER, 0, 1024 * 1024, 0 }; #pragma data_seg(".particleInputElementDescs") static D3D11_INPUT_ELEMENT_DESC particleInputElementDescs[] = { { "SV_POSITION", 0, DXGI_FORMAT_R32G32B32A32_FLOAT, 0, 0, D3D11_INPUT_PER_VERTEX_DATA, 0 }, { "LENGTH", 0, DXGI_FORMAT_R32_FLOAT, 0, 16, D3D11_INPUT_PER_VERTEX_DATA, 0 }, { "AGE", 0, DXGI_FORMAT_R32_FLOAT, 0, 20, D3D11_INPUT_PER_VERTEX_DATA, 0 }, }; #pragma data_seg(".backBufferRtvDesc") static D3D11_RENDER_TARGET_VIEW_DESC backBufferRtvDesc = { DXGI_FORMAT_R16G16B16A16_FLOAT, D3D11_RTV_DIMENSION_TEXTURE2DMS, { 0 } }; #pragma data_seg(".depthStencilStateDesc") static D3D11_DEPTH_STENCIL_DESC depthStencilStateDesc = { FALSE, // TRUE D3D11_DEPTH_WRITE_MASK_ALL, D3D11_COMPARISON_LESS, FALSE, 0, 0, {}, {} }; #pragma data_seg(".swapChainViewport") static D3D11_VIEWPORT swapChainViewport = { 0, 0, WIDTH, HEIGHT, 0.0f, 1.0f, }; #pragma data_seg(".depthStencilViewDesc") static D3D11_DEPTH_STENCIL_VIEW_DESC depthStencilViewDesc = { DXGI_FORMAT_D32_FLOAT, D3D11_DSV_DIMENSION_TEXTURE2D, 0, { 0 } }; #pragma data_seg(".alphaBlendDesc") static D3D11_BLEND_DESC alphaBlendDesc = { FALSE, FALSE, { TRUE, D3D11_BLEND_SRC_ALPHA, D3D11_BLEND_INV_SRC_ALPHA, D3D11_BLEND_OP_ADD, D3D11_BLEND_ONE, D3D11_BLEND_ONE, D3D11_BLEND_OP_ADD, D3D11_COLOR_WRITE_ENABLE_ALL, } };