port from perforce
This commit is contained in:
258
hgplus/las/framework-dx11/main.cpp
Normal file
258
hgplus/las/framework-dx11/main.cpp
Normal file
@@ -0,0 +1,258 @@
|
||||
#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;
|
||||
}
|
||||
Reference in New Issue
Block a user