258 lines
9.7 KiB
C++
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;
|
|
} |