Files
bluflame/hgplus/las/framework-dx11/main.cpp
2026-04-18 22:31:51 +02:00

258 lines
9.7 KiB
C++

#define VC_EXTRALEAN
#define WIN32_LEAN_AND_MEAN
#include <Windows.h>
#include <cstdlib>
#define D3D11_NO_HELPERS
#include <d3d11.h>
#include <dxgi.h>
#include <d3dcompiler.h>
#define ATOM_EDIT 0xC018
#define ATOM_STATIC 0xC019
#define WIDTH 1280
#define HEIGHT 720
#define _FULLSCREEN
HWND hWnd;
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;
#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,
1, 0, DXGI_USAGE_RENDER_TARGET_OUTPUT | DXGI_USAGE_UNORDERED_ACCESS | 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,
1, 0, DXGI_USAGE_RENDER_TARGET_OUTPUT | DXGI_USAGE_UNORDERED_ACCESS | DXGI_USAGE_SHADER_INPUT, 1, 0, -1, DXGI_SWAP_EFFECT_DISCARD, 0
};
#endif
ID3D11Device* device;
ID3D11DeviceContext* context;
IDXGISwapChain* swapChain;
ID3D11Texture2D* backBufferTexture;
//ID3D11RenderTargetView* renderTargetView;
ID3D11UnorderedAccessView* backBufferUAV;
struct TEXTURE_2D_SRV_UAV_RTV {
ID3D11Texture2D* TEX;
ID3D11ShaderResourceView* SRV;
ID3D11UnorderedAccessView* UAV;
ID3D11RenderTargetView* RTV;
};
void createSRVUAVRTV(TEXTURE_2D_SRV_UAV_RTV* tex, int width, int height) {
static D3D11_TEXTURE2D_DESC texDesc = {
width, height, 0, 1, DXGI_FORMAT_R16G16B16A16_FLOAT,
{1, 0}, D3D11_USAGE_DEFAULT,
D3D11_BIND_RENDER_TARGET | D3D11_BIND_SHADER_RESOURCE | D3D11_BIND_UNORDERED_ACCESS,
0, D3D11_RESOURCE_MISC_GENERATE_MIPS
};
device->CreateTexture2D(&texDesc, NULL, &tex->TEX);
device->CreateShaderResourceView(tex->TEX, NULL, &tex->SRV);
device->CreateUnorderedAccessView(tex->TEX, NULL, &tex->UAV);
device->CreateRenderTargetView(tex->TEX, NULL, &tex->RTV);
}
int main(int argc, char** argv) {
#ifdef FULLSCREEN
ShowCursor(0);
HWND hWnd = CreateWindowExA(0, (LPCSTR)ATOM_STATIC, 0, WS_POPUP | WS_VISIBLE | WS_MAXIMIZE, 0, 0, WIDTH, HEIGHT, 0, 0, 0, 0);
//ShowWindow(hWnd, SW_SHOW);
#else
HWND hWnd = CreateWindowExA(WS_EX_TOPMOST, (LPCSTR)ATOM_STATIC, 0, WS_POPUP | WS_VISIBLE, 0, 0, WIDTH, HEIGHT, 0, 0, 0, 0);
#endif
//ShowWindow(hWnd, SW_SHOW);
swapChainDesc.OutputWindow = hWnd;
D3D11CreateDeviceAndSwapChain(NULL, D3D_DRIVER_TYPE_HARDWARE, NULL, D3D11_CREATE_DEVICE_DEBUG, NULL, 0, D3D11_SDK_VERSION, (DXGI_SWAP_CHAIN_DESC*)&swapChainDesc, &swapChain, &device, NULL, &context);
swapChain->GetBuffer(0, __uuidof(ID3D11Texture2D), (LPVOID*)&backBufferTexture);
device->CreateUnorderedAccessView(backBufferTexture, NULL, &backBufferUAV);
const char src[] =
"RWTexture2D<float4> o0:register(u0);\n"
"[numthreads(16,16,1)]\n"
"void cs(uint3 id:SV_DispatchThreadID) {\n"
"o0[id.xy]=float4(1,id.xy/float2(1280,720),1);\n"
"}"
;
ID3DBlob* blob;
ID3DBlob* errorBlob;
//if (D3DCompile(src, sizeof(src), NULL, NULL, NULL, "cs", "cs_5_0", D3DCOMPILE_OPTIMIZATION_LEVEL3, 0, &blob, &errorBlob)) {
// MessageBoxA(0, (char*)errorBlob->GetBufferPointer(), "ERROR", MB_OK | MB_ICONERROR);
// return EXIT_FAILURE;
//}
if (D3DCompileFromFile(L"test.hlsl", NULL, NULL, "csRaytrace", "cs_5_0", D3DCOMPILE_OPTIMIZATION_LEVEL3, 0, &blob, &errorBlob)) {
MessageBoxA(0, (char*)errorBlob->GetBufferPointer(), "ERROR", MB_OK | MB_ICONERROR);
return EXIT_FAILURE;
}
ID3D11ComputeShader* csRaytrace;
device->CreateComputeShader(blob->GetBufferPointer(), blob->GetBufferSize(), 0, &csRaytrace);
if (D3DCompileFromFile(L"test.hlsl", NULL, NULL, "csLensDirt", "cs_5_0", D3DCOMPILE_OPTIMIZATION_LEVEL3, 0, &blob, &errorBlob)) {
MessageBoxA(0, (char*)errorBlob->GetBufferPointer(), "ERROR", MB_OK | MB_ICONERROR);
return EXIT_FAILURE;
}
ID3D11ComputeShader* csLensDirt;
device->CreateComputeShader(blob->GetBufferPointer(), blob->GetBufferSize(), 0, &csLensDirt);
if (D3DCompileFromFile(L"test.hlsl", NULL, NULL, "csStreaks", "cs_5_0", D3DCOMPILE_OPTIMIZATION_LEVEL3, 0, &blob, &errorBlob)) {
MessageBoxA(0, (char*)errorBlob->GetBufferPointer(), "ERROR", MB_OK | MB_ICONERROR);
return EXIT_FAILURE;
}
ID3D11ComputeShader* csStreaks;
device->CreateComputeShader(blob->GetBufferPointer(), blob->GetBufferSize(), 0, &csStreaks);
if (D3DCompileFromFile(L"test.hlsl", NULL, NULL, "csBlurH", "cs_5_0", D3DCOMPILE_OPTIMIZATION_LEVEL3, 0, &blob, &errorBlob)) {
MessageBoxA(0, (char*)errorBlob->GetBufferPointer(), "ERROR", MB_OK | MB_ICONERROR);
return EXIT_FAILURE;
}
ID3D11ComputeShader* csBlurH;
device->CreateComputeShader(blob->GetBufferPointer(), blob->GetBufferSize(), 0, &csBlurH);
if (D3DCompileFromFile(L"test.hlsl", NULL, NULL, "csBlurV", "cs_5_0", D3DCOMPILE_OPTIMIZATION_LEVEL3, 0, &blob, &errorBlob)) {
MessageBoxA(0, (char*)errorBlob->GetBufferPointer(), "ERROR", MB_OK | MB_ICONERROR);
return EXIT_FAILURE;
}
ID3D11ComputeShader* csBlurV;
device->CreateComputeShader(blob->GetBufferPointer(), blob->GetBufferSize(), 0, &csBlurV);
if (D3DCompileFromFile(L"test.hlsl", NULL, NULL, "csBokehPreprocess", "cs_5_0", D3DCOMPILE_OPTIMIZATION_LEVEL3, 0, &blob, &errorBlob)) {
MessageBoxA(0, (char*)errorBlob->GetBufferPointer(), "ERROR", MB_OK | MB_ICONERROR);
return EXIT_FAILURE;
}
ID3D11ComputeShader* csBokehPreprocess;
device->CreateComputeShader(blob->GetBufferPointer(), blob->GetBufferSize(), 0, &csBokehPreprocess);
if (D3DCompileFromFile(L"test.hlsl", NULL, NULL, "csBokehFirst", "cs_5_0", D3DCOMPILE_OPTIMIZATION_LEVEL3, 0, &blob, &errorBlob)) {
MessageBoxA(0, (char*)errorBlob->GetBufferPointer(), "ERROR", MB_OK | MB_ICONERROR);
return EXIT_FAILURE;
}
ID3D11ComputeShader* csBokehFirst;
device->CreateComputeShader(blob->GetBufferPointer(), blob->GetBufferSize(), 0, &csBokehFirst);
if (D3DCompileFromFile(L"test.hlsl", NULL, NULL, "csBokehSecond", "cs_5_0", D3DCOMPILE_OPTIMIZATION_LEVEL3, 0, &blob, &errorBlob)) {
MessageBoxA(0, (char*)errorBlob->GetBufferPointer(), "ERROR", MB_OK | MB_ICONERROR);
return EXIT_FAILURE;
}
ID3D11ComputeShader* csBokehSecond;
device->CreateComputeShader(blob->GetBufferPointer(), blob->GetBufferSize(), 0, &csBokehSecond);
if (D3DCompileFromFile(L"test.hlsl", NULL, NULL, "csTestScene", "cs_5_0", D3DCOMPILE_OPTIMIZATION_LEVEL0, 0, &blob, &errorBlob)) {
MessageBoxA(0, (char*)errorBlob->GetBufferPointer(), "ERROR", MB_OK | MB_ICONERROR);
return EXIT_FAILURE;
}
ID3D11ComputeShader* csTestScene;
device->CreateComputeShader(blob->GetBufferPointer(), blob->GetBufferSize(), 0, &csTestScene);
if (D3DCompileFromFile(L"test.hlsl", NULL, NULL, "csRadialCircumferentialBlur", "cs_5_0", D3DCOMPILE_OPTIMIZATION_LEVEL0, 0, &blob, &errorBlob)) {
MessageBoxA(0, (char*)errorBlob->GetBufferPointer(), "ERROR", MB_OK | MB_ICONERROR);
return EXIT_FAILURE;
}
ID3D11ComputeShader* csRadialCircumferentialBlur;
device->CreateComputeShader(blob->GetBufferPointer(), blob->GetBufferSize(), 0, &csRadialCircumferentialBlur);
TEXTURE_2D_SRV_UAV_RTV tex0, tex1, tex2, tex3, tex4;
createSRVUAVRTV(&tex0, 1280, 720);
createSRVUAVRTV(&tex1, 1280, 720);
createSRVUAVRTV(&tex2, 1280, 720);
createSRVUAVRTV(&tex3, 1280, 720);
D3D11_SAMPLER_DESC samplerDesc = {
D3D11_FILTER_MIN_MAG_MIP_LINEAR, //D3D11_FILTER_MIN_MAG_MIP_LINEAR, D3D11_FILTER_ANISOTROPIC
D3D11_TEXTURE_ADDRESS_CLAMP,
D3D11_TEXTURE_ADDRESS_CLAMP,
D3D11_TEXTURE_ADDRESS_CLAMP,
0.0f,
1,
D3D11_COMPARISON_ALWAYS,
{0,0,0,0},
0,
D3D11_FLOAT32_MAX
};
ID3D11SamplerState* sampler;
device->CreateSamplerState(&samplerDesc, &sampler);
context->CSSetSamplers(0, 1, &sampler);
do {
//context->CSSetUnorderedAccessViews(0, 1, &backBufferUAV, NULL);
context->CSSetUnorderedAccessViews(0, 1, &tex3.UAV, NULL);
context->CSSetShader(csLensDirt, NULL, 0);
context->Dispatch(80, 45, 1);
if (0) {
context->CSSetUnorderedAccessViews(0, 1, &tex0.UAV, NULL);
context->CSSetShaderResources(0, 1, &tex3.SRV);
context->CSSetShader(csBokehPreprocess, NULL, 0);
context->Dispatch(80, 45, 1);
ID3D11UnorderedAccessView* bokehFirstUAV[] = {tex1.UAV, tex2.UAV};
ID3D11ShaderResourceView* bokehFirstSRV[] = {tex0.SRV};
context->CSSetUnorderedAccessViews(0, 2, bokehFirstUAV, NULL);
context->CSSetShaderResources(0, 1, bokehFirstSRV);
context->CSSetShader(csBokehFirst, NULL, 0);
context->Dispatch(80, 45, 1);
//context->GenerateMips(tex1.SRV);
//context->GenerateMips(tex2.SRV);
ID3D11UnorderedAccessView* bokehSecondUAV[] = {tex3.UAV, NULL};
ID3D11ShaderResourceView* bokehSecondSRV[] = {tex1.SRV, tex2.SRV };
context->CSSetUnorderedAccessViews(0, 2, bokehSecondUAV, NULL);
context->CSSetShaderResources(0, 2, bokehSecondSRV);
context->CSSetShader(csBokehSecond, NULL, 0);
context->Dispatch(80, 45, 1);
}
context->GenerateMips(tex3.SRV);
context->CSSetUnorderedAccessViews(0, 1, &backBufferUAV, NULL);
context->CSSetShaderResources(0, 1, &tex3.SRV);
context->CSSetShader(csRadialCircumferentialBlur, NULL, 0);
context->Dispatch(80, 45, 1);
ID3D11UnorderedAccessView* nullUAV[] = {NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL};
ID3D11ShaderResourceView* nullSRV[] = {NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL};
context->CSSetUnorderedAccessViews(0, 8, nullUAV, NULL);
context->CSSetShaderResources(0, 8, nullSRV);
#ifndef FULLSCREEN
PeekMessageA(0, 0, 0, 0, PM_NOREMOVE);
#endif
swapChain->Present(1, 0);
} while (!GetAsyncKeyState(VK_ESCAPE));
ExitProcess(0);
return EXIT_SUCCESS;
}