summary refs log tree commit diff
path: root/misc/windows/D3D11ShaderGen.c
diff options
context:
space:
mode:
Diffstat (limited to 'misc/windows/D3D11ShaderGen.c')
-rw-r--r--misc/windows/D3D11ShaderGen.c186
1 files changed, 186 insertions, 0 deletions
diff --git a/misc/windows/D3D11ShaderGen.c b/misc/windows/D3D11ShaderGen.c
new file mode 100644
index 0000000..8617f34
--- /dev/null
+++ b/misc/windows/D3D11ShaderGen.c
@@ -0,0 +1,186 @@
+#define _WIN32_WINNT 0x600
+#define COBJMACROS
+#include <stdio.h>
+#include <d3dcompiler.h>
+
+#define GetBlobPointer ID3D10Blob_GetBufferPointer
+#define GetBlobSize    ID3D10Blob_GetBufferSize
+#pragma comment(lib,"d3dcompiler.lib")
+
+static const char VS_SOURCE[] =
+"float4x4 mvpMatrix;                                                \n" \
+"#ifdef VS_TEXTURE_OFFSET                                           \n" \
+"float2 texOffset;                                                  \n" \
+"#endif                                                             \n" \
+"                                                                   \n" \
+"struct INPUT_VERTEX {                                              \n" \
+"   float3 position : POSITION;                                     \n" \
+"   float4 color : COLOR0;                                          \n" \
+"#ifndef VS_COLOR_ONLY                                              \n" \
+"   float2 coords : TEXCOORD0;                                      \n" \
+"#endif                                                             \n" \
+"};                                                                 \n" \
+"struct OUTPUT_VERTEX {                                             \n" \
+"#ifndef VS_COLOR_ONLY                                              \n" \
+"   float2 coords : TEXCOORD0;                                      \n" \
+"#endif                                                             \n" \
+"   float4 color : COLOR0;                                          \n" \
+"   float4 position : VPOS;                                         \n" \
+"};                                                                 \n" \
+"                                                                   \n" \
+"OUTPUT_VERTEX main(INPUT_VERTEX input) {                           \n" \
+"   OUTPUT_VERTEX output;                                           \n" \
+"   // https://stackoverflow.com/questions/16578765/hlsl-mul-variables-clarification \n" \
+"   output.position = mul(mvpMatrix, float4(input.position, 1.0f)); \n" \
+"#ifndef VS_COLOR_ONLY                                              \n" \
+"   output.coords = input.coords;                                   \n" \
+"#endif                                                             \n" \
+"#ifdef VS_TEXTURE_OFFSET                                           \n" \
+"   output.coords += texOffset;                                     \n" \
+"#endif                                                             \n" \
+"   output.color = input.color;                                     \n" \
+"   return output;                                                  \n" \
+"}";
+
+static const char PS_SOURCE[] =
+"#ifndef PS_COLOR_ONLY                                              \n" \
+"Texture2D    texValue;                                             \n" \
+"SamplerState texState;                                             \n" \
+"#endif                                                             \n" \
+"#ifdef PS_FOG_LINEAR                                               \n" \
+"float  fogEnd;                                                     \n" \
+"float3 fogColor;                                                   \n" \
+"#endif                                                             \n" \
+"#ifdef PS_FOG_DENSITY                                              \n" \
+"float  fogDensity;                                                 \n" \
+"float3 fogColor;                                                   \n" \
+"#endif                                                             \n" \
+"                                                                   \n" \
+"struct INPUT_VERTEX {                                              \n" \
+"#ifndef PS_COLOR_ONLY                                              \n" \
+"   float2 coords : TEXCOORD0;                                      \n" \
+"#endif                                                             \n" \
+"   float4 color : COLOR0;                                          \n" \
+"#ifdef PS_FOG_LINEAR                                               \n" \
+"   float4 position : VPOS;                                         \n" \
+"#endif                                                             \n" \
+"#ifdef PS_FOG_DENSITY                                              \n" \
+"   float4 position : VPOS;                                         \n" \
+"#endif                                                             \n" \
+"};                                                                 \n" \
+"                                                                   \n" \
+"//float4 main(float2 coords : TEXCOORD0, float4 color : COLOR0) : SV_TARGET {\n" \
+"float4 main(INPUT_VERTEX input) : SV_TARGET{                       \n" \
+"   float4 color;                                                   \n" \
+"#ifdef PS_COLOR_ONLY                                               \n" \
+"   color = input.color;                                            \n" \
+"#else                                                              \n" \
+"   float4 texColor = texValue.Sample(texState, input.coords);      \n" \
+"   color = texColor * input.color;                                 \n" \
+"#endif                                                             \n" \
+"                                                                   \n" \
+"#ifdef PS_ALPHA_TEST                                               \n" \
+"   // https://jbrd.github.io/2008/02/14/hlsl-discard-doesnt-return.html \n" \
+"   if (color.a < 0.5) { discard; return color; }                   \n" \
+"#endif                                                             \n" \
+"#ifdef PS_FOG_LINEAR                                               \n" \
+"   float depth = input.position.w;                                 \n" \
+"   float fog   = saturate((fogEnd - depth) / fogEnd);              \n" \
+"   color.rgb   = lerp(fogColor, color.rgb, fog);                   \n" \
+"#endif                                                             \n" \
+"#ifdef PS_FOG_DENSITY                                              \n" \
+"   float depth = input.position.w;                                 \n" \
+"   float fog   = saturate(exp(fogDensity * depth));                \n" \
+"   color.rgb   = lerp(fogColor, color.rgb, fog);                   \n" \
+"#endif                                                             \n" \
+"   return color;                                                   \n" \
+"}";
+
+static void CompileShader(LPCSTR src, LPCSTR name, LPCSTR profile, const D3D_SHADER_MACRO* defines) {
+	UINT flags = D3DCOMPILE_ENABLE_STRICTNESS | D3DCOMPILE_OPTIMIZATION_LEVEL1;// | D3DCOMPILE_DEBUG;
+    ID3DBlob* shaderBlob = NULL;
+    ID3DBlob* errorBlob  = NULL;
+    HRESULT hr = D3DCompile(src, strlen(src), name, defines, D3D_COMPILE_STANDARD_FILE_INCLUDE,
+                            "main", profile, flags, 0, &shaderBlob, &errorBlob );
+
+	if (hr && errorBlob) {
+		char* errText = (char*)GetBlobPointer(errorBlob);
+		OutputDebugStringA(errText);
+		printf("// Compiling %s failed\n", name);
+		printf("//   %s\n", errText);
+	}
+	if (hr) {
+		printf("// Compiling %s failed - %08X\n", name, hr);
+		return;
+	}
+
+	unsigned char* data = GetBlobPointer(shaderBlob);
+	SIZE_T size         = GetBlobSize(shaderBlob);
+	printf("static const unsigned char %s[%i] = {\n", name, size);
+
+	for (int i = 0; i < size; )
+	{
+		int count = min(size - i, 32);
+		printf("\t");
+		for (int j = 0; j < count; j++)
+		{
+			printf("0x%02x,", data[i + j]);
+		}
+		printf("\n");
+		i += count;
+	}
+	printf("};\n");
+}
+
+#define CompileVertexShader(name, defines) CompileShader(VS_SOURCE, name, "vs_4_0_level_9_1", defines)
+#define CompilePixelShader( name, defines) CompileShader(PS_SOURCE, name, "ps_4_0_level_9_1", defines)
+int main() {
+	const D3D_SHADER_MACRO vs_colored[]  = { "VS_COLOR_ONLY","1",  NULL,NULL };
+	const D3D_SHADER_MACRO vs_textured[] = {                       NULL,NULL };
+	const D3D_SHADER_MACRO vs_offset[]   = { "VS_TEXTURE_OFFSET","1",  NULL,NULL };
+
+	const D3D_SHADER_MACRO ps_colored[]       = { "PS_COLOR_ONLY","1",  NULL,NULL };
+	const D3D_SHADER_MACRO ps_textured[]      = {                       NULL,NULL };
+	const D3D_SHADER_MACRO ps_colored_test[]  = { "PS_COLOR_ONLY","1",  "PS_ALPHA_TEST","1",  NULL,NULL };
+	const D3D_SHADER_MACRO ps_textured_test[] = {                       "PS_ALPHA_TEST","1",  NULL,NULL };
+
+	const D3D_SHADER_MACRO ps_colored_linear[]       = { "PS_FOG_LINEAR","1",  "PS_COLOR_ONLY","1",  NULL,NULL };
+	const D3D_SHADER_MACRO ps_textured_linear[]      = { "PS_FOG_LINEAR","1",                        NULL,NULL };
+	const D3D_SHADER_MACRO ps_colored_test_linear[]  = { "PS_FOG_LINEAR","1",  "PS_COLOR_ONLY","1",  "PS_ALPHA_TEST","1",  NULL,NULL };
+	const D3D_SHADER_MACRO ps_textured_test_linear[] = { "PS_FOG_LINEAR","1",                        "PS_ALPHA_TEST","1",  NULL,NULL };
+
+	const D3D_SHADER_MACRO ps_colored_density[]       = { "PS_FOG_DENSITY","1",  "PS_COLOR_ONLY","1",  NULL,NULL };
+	const D3D_SHADER_MACRO ps_textured_density[]      = { "PS_FOG_DENSITY","1",                        NULL,NULL };
+	const D3D_SHADER_MACRO ps_colored_test_density[]  = { "PS_FOG_DENSITY","1",  "PS_COLOR_ONLY","1",  "PS_ALPHA_TEST","1",  NULL,NULL };
+	const D3D_SHADER_MACRO ps_textured_test_density[] = { "PS_FOG_DENSITY","1",                        "PS_ALPHA_TEST","1",  NULL,NULL };
+
+	printf("// Generated using misc/D3D11ShaderGen.c\n\n");
+	printf("//########################################################################################################################\n");
+	printf("//------------------------------------------------------Vertex shaders----------------------------------------------------\n");
+	printf("//########################################################################################################################\n");
+	CompileVertexShader("vs_colored",         vs_colored);
+	CompileVertexShader("vs_textured",        vs_textured);
+	CompileVertexShader("vs_textured_offset", vs_offset);
+
+	printf("\n\n");
+	printf("//########################################################################################################################\n");
+	printf("//------------------------------------------------------Pixel shaders-----------------------------------------------------\n");
+	printf("//########################################################################################################################\n");
+	CompilePixelShader("ps_colored",       ps_colored);
+	CompilePixelShader("ps_textured",      ps_textured);
+	CompilePixelShader("ps_colored_test",  ps_colored_test);
+	CompilePixelShader("ps_textured_test", ps_textured_test);
+
+	CompilePixelShader("ps_colored_linear",       ps_colored_linear);
+	CompilePixelShader("ps_textured_linear",      ps_textured_linear);
+	CompilePixelShader("ps_colored_test_linear",  ps_colored_test_linear);
+	CompilePixelShader("ps_textured_test_linear", ps_textured_test_linear);
+
+	CompilePixelShader("ps_colored_density",       ps_colored_density);
+	CompilePixelShader("ps_textured_density",      ps_textured_density);
+	CompilePixelShader("ps_colored_test_density",  ps_colored_test_density);
+	CompilePixelShader("ps_textured_test_density", ps_textured_test_density);
+
+	//Sleep(5000);
+	return 0;
+}