Files
bluflame/nordlicht2014-intro/nordlicht2014/shaders.h
2026-04-18 22:31:51 +02:00

236 lines
5.9 KiB
C

#ifdef _DEBUG
#include <process.h>
#include <io.h>
#include <stdio.h>
HANDLE shaderCompileEvent;
static char** lastShader;
static __time64_t shaderChangedDate;
#define shaderDir "E:\\blu-flame.org\\nordlicht2014-intro\\DebugShader\\"
#define shaderFile "E:\\blu-flame.org\\nordlicht2014-intro\\nordlicht2014\\test.hlsl"
char* ReadFile(char* name, SIZE_T* fileLen)
{
FILE *file = 0;
char *buffer = 0;
//Open file
fopen_s(&file, name, "rb");
if (!file)
{
printf("Unable to open file %s\n", name);
return 0;
}
//Get file length
fseek(file, 0, SEEK_END);
*fileLen = ftell(file);
fseek(file, 0, SEEK_SET);
//Allocate memory
buffer = (char *)malloc(*fileLen + 1);
if (!buffer)
{
fprintf(stderr, "Memory error!\n");
fclose(file);
return 0;
}
//Read file contents into buffer
fread(buffer, *fileLen, 1, file);
fclose(file);
return buffer;
}
void log(char* text)
{
printf(text);
OutputDebugStringA(text);
}
DWORD WINAPI filemon(void* args)
{
while (true)
{
_finddata_t fdata;
long hfile = _findfirst(shaderFile, &fdata);
if (hfile != -1)
{
if (fdata.time_write != shaderChangedDate)
{
shaderChangedDate = fdata.time_write;
::SetEvent(shaderCompileEvent);
}
_findclose(hfile);
}
::Sleep(100);
}
return 0;
}
void InitShader()
{
_finddata_t fdata;
long hfile = _findfirst(shaderFile, &fdata);
if (hfile != -1)
{
shaderChangedDate = fdata.time_write;
_findclose(hfile);
}
}
#endif
#ifdef _DEBUG
#ifdef SHADER_DEBUG
#define CompileShader(entryPoint, profile) CompileShaderD(shaderDir entryPoint ".cso", entryPoint, profile);
#else
#define CompileShader(entryPoint, profile) CompileShaderD(shaderFile, entryPoint, profile);
#endif
void CompileShaderD(char* fileName, char* entryPoint, char* profile)
{
#ifdef SHADER_DEBUG
shaderCode = ReadFile(fileName, &shaderSize);
#else
ID3DBlob* errorBlob;
SIZE_T blobLength = 0;
auto blob = ReadFile(fileName, &blobLength);
d3dCompile(blob, blobLength, shaderFile, NULL, NULL, entryPoint, profile, 0, 0, &shaderBlob, &errorBlob);
if (errorBlob != NULL)
{
auto error = errorBlob->GetBufferPointer();
OutputDebugStringA((char*)error);
if (shaderBlob == 0)
{
printf("Error compiling shader: ");
printf((char*)error);
printf("\n");
ExitProcess(-1);
}
}
if (shaderBlob != 0)
{
shaderSize = shaderBlob->GetBufferSize();
shaderCode = shaderBlob->GetBufferPointer();
}
#endif
}
#else
#include "Shader.h"
#define CompileShader(entryPoint, profile) CompileShaderR(entryPoint, profile);
#pragma code_seg(".CompileShader")
void CompileShaderR(char* entryPoint, char* profile)
{
#ifndef COMPRESS
ID3DBlob* errorBlob;
d3dCompile(test_hlsl, sizeof(test_hlsl), NULL, NULL, NULL, entryPoint, profile, 0, 0, &shaderBlob, &errorBlob);
if (errorBlob != NULL)
{
auto error = errorBlob->GetBufferPointer();
OutputDebugStringA((char*)error);
}
#else
d3dCompile(test_hlsl, sizeof(test_hlsl), NULL, NULL, NULL, entryPoint, profile, 0, 0, &shaderBlob, NULL);
#endif
if (shaderBlob != 0)
{
shaderSize = shaderBlob->GetBufferSize();
shaderCode = shaderBlob->GetBufferPointer();
}
};
#endif
#pragma data_seg(".vs_5_0")
static char vs_5_0[] = "vs_5_0";
#pragma data_seg(".gs_5_0")
static char gs_5_0[] = "gs_5_0";
#pragma data_seg(".ds_5_0")
static char ds_5_0[] = "ds_5_0";
#pragma data_seg(".hs_5_0")
static char hs_5_0[] = "hs_5_0";
#pragma data_seg(".ps_5_0")
static char ps_5_0[] = "ps_5_0";
#pragma data_seg(".ps_5_0")
static char cs_5_0[] = "cs_5_0";
#pragma code_seg(".CreateShaders")
void CreateShaders()
{
HINSTANCE hl = LoadLibraryA(d3dcompiler);
if (!hl)
{
d3dcompiler[13] = '3';
hl = LoadLibraryA(d3dcompiler);
}
d3dCompile = (pD3DCompile)GetProcAddress(hl, "D3DCompile");
CompileShader("starInit", cs_5_0);
device->CreateComputeShader(shaderCode, shaderSize, 0, &starInitShader);
CompileShader("event1", cs_5_0);
device->CreateComputeShader(shaderCode, shaderSize, 0, &event1Shader);
CompileShader("event2", cs_5_0);
device->CreateComputeShader(shaderCode, shaderSize, 0, &event2Shader);
CompileShader("update", cs_5_0);
device->CreateComputeShader(shaderCode, shaderSize, 0, &updateShader);
CompileShader("csNoise", cs_5_0);
device->CreateComputeShader(shaderCode, shaderSize, 0, &csNoise);
CompileShader("csFbm", cs_5_0);
device->CreateComputeShader(shaderCode, shaderSize, 0, &csFbm);
CompileShader("pvs", vs_5_0);
device->CreateVertexShader(shaderCode, shaderSize, 0, &particleVertexShader);
CompileShader("pgs", gs_5_0);
device->CreateGeometryShader(shaderCode, shaderSize, 0, &particleGeometryShader);
CompileShader("pps", ps_5_0);
device->CreatePixelShader(shaderCode, shaderSize, 0, &particlePixelShader);
CompileShader("VSCB", vs_5_0);
device->CreateVertexShader(shaderCode, shaderSize, NULL, &constantBufferVertexShader);
device->CreateGeometryShaderWithStreamOutput(shaderCode, shaderSize, constantBufferSODeclarations, 10, &constantBuffer2Desc.ByteWidth, 1, D3D11_SO_NO_RASTERIZED_STREAM, NULL, &constantBufferGeometryShader);
//---
// Compile postprocessing shaders
//---
CompileShader("csDistortChroma", cs_5_0);
device->CreateComputeShader(shaderCode, shaderSize, 0, &csDistortChroma);
CompileShader("csRadialBlur", cs_5_0);
device->CreateComputeShader(shaderCode, shaderSize, 0, &csRadialBlur);
CompileShader("csCircumferentialBlur", cs_5_0);
device->CreateComputeShader(shaderCode, shaderSize, 0, &csCircumferentialBlur);
CompileShader("csStreaks", cs_5_0);
device->CreateComputeShader(shaderCode, shaderSize, 0, &csStreaks);
CompileShader("csLensDirt", cs_5_0);
device->CreateComputeShader(shaderCode, shaderSize, 0, &csLensDirt);
CompileShader("csBlurH", cs_5_0);
device->CreateComputeShader(shaderCode, shaderSize, 0, &csBlurH);
CompileShader("csBlurV", cs_5_0);
device->CreateComputeShader(shaderCode, shaderSize, 0, &csBlurV);
CompileShader("csGhosts", cs_5_0);
device->CreateComputeShader(shaderCode, shaderSize, 0, &csGhosts);
CompileShader("csMerge", cs_5_0);
device->CreateComputeShader(shaderCode, shaderSize, 0, &csMerge);
}