compiling shaders
This commit is contained in:
parent
e93847b187
commit
e7971e7bad
89
src/asset_compiler/dx11_shader_compiler.cpp
Normal file
89
src/asset_compiler/dx11_shader_compiler.cpp
Normal file
@ -0,0 +1,89 @@
|
|||||||
|
#include <d3dcompiler.h>
|
||||||
|
|
||||||
|
#include "shader_compiler.h"
|
||||||
|
|
||||||
|
extern "C" rt_shader_bytecode CompileDX11Shader(rt_shader_stage stage,
|
||||||
|
rt_shader_optimization_level optimization,
|
||||||
|
rt_text_span code,
|
||||||
|
const char *file_path,
|
||||||
|
rt_arena *arena) {
|
||||||
|
rt_shader_bytecode bytecode = {};
|
||||||
|
|
||||||
|
D3D_SHADER_MACRO defines[] = {
|
||||||
|
{"RT_DX11", "1"},
|
||||||
|
{ NULL, NULL},
|
||||||
|
};
|
||||||
|
|
||||||
|
LPCSTR target = NULL;
|
||||||
|
LPCSTR entrypoint = NULL;
|
||||||
|
switch (stage) {
|
||||||
|
case RT_SHADER_STAGE_VERTEX:
|
||||||
|
target = "vs_5_0";
|
||||||
|
entrypoint = "VsMain";
|
||||||
|
break;
|
||||||
|
case RT_SHADER_STAGE_FRAGMENT:
|
||||||
|
target = "ps_5_0";
|
||||||
|
entrypoint = "PsMain";
|
||||||
|
break;
|
||||||
|
case RT_SHADER_STAGE_COMPUTE:
|
||||||
|
target = "cs_5_0";
|
||||||
|
entrypoint = "CsMain";
|
||||||
|
break;
|
||||||
|
default:
|
||||||
|
rtLog("AC", "Tried to compile an invalid shader stage %u for %s", stage, file_path);
|
||||||
|
return bytecode;
|
||||||
|
}
|
||||||
|
|
||||||
|
UINT flags = D3DCOMPILE_PARTIAL_PRECISION | D3DCOMPILE_WARNINGS_ARE_ERRORS;
|
||||||
|
switch (optimization) {
|
||||||
|
case RT_SHADER_OPTIMIZATION_NONE:
|
||||||
|
flags |= D3DCOMPILE_SKIP_OPTIMIZATION | D3DCOMPILE_OPTIMIZATION_LEVEL0;
|
||||||
|
break;
|
||||||
|
case RT_SHADER_OPTIMIZATION_SIZE:
|
||||||
|
flags |= D3DCOMPILE_OPTIMIZATION_LEVEL2;
|
||||||
|
break;
|
||||||
|
case RT_SHADER_OPTIMIZATION_SPEED:
|
||||||
|
flags |= D3DCOMPILE_OPTIMIZATION_LEVEL3;
|
||||||
|
break;
|
||||||
|
}
|
||||||
|
#ifdef RT_DEBUG
|
||||||
|
flags |= D3DCOMPILE_DEBUG;
|
||||||
|
#endif
|
||||||
|
ID3DBlob *bytes = nullptr, *error = nullptr;
|
||||||
|
if (FAILED(D3DCompile2(code.start,
|
||||||
|
code.length,
|
||||||
|
file_path,
|
||||||
|
defines,
|
||||||
|
D3D_COMPILE_STANDARD_FILE_INCLUDE,
|
||||||
|
entrypoint,
|
||||||
|
target,
|
||||||
|
flags,
|
||||||
|
0,
|
||||||
|
0,
|
||||||
|
nullptr,
|
||||||
|
0,
|
||||||
|
&bytes,
|
||||||
|
&error))) {
|
||||||
|
if (error) {
|
||||||
|
rtLog("AC",
|
||||||
|
"Shader compilation failed (%s): %s",file_path,
|
||||||
|
(const char *)error->GetBufferPointer());
|
||||||
|
error->Release();
|
||||||
|
return bytecode;
|
||||||
|
} else {
|
||||||
|
rtLog("AC", "Shader compilation failed (%s): NO ERROR INFORMATION", file_path);
|
||||||
|
return bytecode;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
bytecode.bytes = rtArenaPush(arena, bytes->GetBufferSize());
|
||||||
|
if (bytecode.bytes) {
|
||||||
|
bytecode.len = bytes->GetBufferSize();
|
||||||
|
memcpy(bytecode.bytes, bytes->GetBufferPointer(), bytecode.len);
|
||||||
|
} else {
|
||||||
|
rtLog("AC", "Out of memory while compiling %s", file_path);
|
||||||
|
}
|
||||||
|
bytes->Release();
|
||||||
|
|
||||||
|
return bytecode;
|
||||||
|
}
|
@ -62,6 +62,9 @@ static char *GenerateShaderName(rt_shader_type type,
|
|||||||
case RT_SHADER_TYPE_VULKAN:
|
case RT_SHADER_TYPE_VULKAN:
|
||||||
type_str = ":vk";
|
type_str = ":vk";
|
||||||
break;
|
break;
|
||||||
|
case RT_SHADER_TYPE_DX11:
|
||||||
|
type_str = ":dx11";
|
||||||
|
break;
|
||||||
default:
|
default:
|
||||||
return NULL;
|
return NULL;
|
||||||
}
|
}
|
||||||
@ -135,6 +138,8 @@ static rt_result ParseShader(rt_parse_state *state,
|
|||||||
rt_shader_type in_file_type = RT_SHADER_TYPE_INVALID;
|
rt_shader_type in_file_type = RT_SHADER_TYPE_INVALID;
|
||||||
if (rtCompareSpanToString(shader->attribute, "vk") == 0) {
|
if (rtCompareSpanToString(shader->attribute, "vk") == 0) {
|
||||||
in_file_type = RT_SHADER_TYPE_VULKAN;
|
in_file_type = RT_SHADER_TYPE_VULKAN;
|
||||||
|
} else if (rtCompareSpanToString(shader->attribute, "dx11") == 0) {
|
||||||
|
in_file_type = RT_SHADER_TYPE_DX11;
|
||||||
} else {
|
} else {
|
||||||
rtReportError("GFX",
|
rtReportError("GFX",
|
||||||
"Invalid renderer backend"
|
"Invalid renderer backend"
|
||||||
@ -230,6 +235,8 @@ static rt_result ParsePipeline(rt_parse_state *state,
|
|||||||
rt_shader_type type = RT_SHADER_TYPE_INVALID;
|
rt_shader_type type = RT_SHADER_TYPE_INVALID;
|
||||||
if (strcmp(rt_Renderer.s, "vk") == 0)
|
if (strcmp(rt_Renderer.s, "vk") == 0)
|
||||||
type = RT_SHADER_TYPE_VULKAN;
|
type = RT_SHADER_TYPE_VULKAN;
|
||||||
|
else if (strcmp(rt_Renderer.s, "dx11") == 0)
|
||||||
|
type = RT_SHADER_TYPE_DX11;
|
||||||
|
|
||||||
if (type == RT_SHADER_TYPE_INVALID) {
|
if (type == RT_SHADER_TYPE_INVALID) {
|
||||||
result = RT_ASSET_PROCESSING_FAILED;
|
result = RT_ASSET_PROCESSING_FAILED;
|
||||||
|
@ -39,6 +39,13 @@ if get_option('enable_dxc_shader_compiler')
|
|||||||
ac_cargs += '-DRT_BUILD_DXC_SHADER_COMPILER'
|
ac_cargs += '-DRT_BUILD_DXC_SHADER_COMPILER'
|
||||||
endif
|
endif
|
||||||
|
|
||||||
|
if get_option('enable_dx11_shader_compiler')
|
||||||
|
ac_cargs += '-DRT_BUILD_DX11_SHADER_COMPILER'
|
||||||
|
ac_sources += ['dx11_shader_compiler.cpp']
|
||||||
|
d3dcompiler_dep = declare_dependency(link_args : ['-lD3DCompiler'])
|
||||||
|
ac_deps += d3dcompiler_dep
|
||||||
|
endif
|
||||||
|
|
||||||
asset_compiler = static_library('asset_compiler',
|
asset_compiler = static_library('asset_compiler',
|
||||||
'asset_compiler.h',
|
'asset_compiler.h',
|
||||||
'description_parser.h',
|
'description_parser.h',
|
||||||
|
@ -8,6 +8,14 @@ extern rt_shader_bytecode CompileVulkanShader(rt_shader_stage stage,
|
|||||||
rt_arena *arena);
|
rt_arena *arena);
|
||||||
#endif
|
#endif
|
||||||
|
|
||||||
|
#ifdef RT_BUILD_DX11_SHADER_COMPILER
|
||||||
|
extern rt_shader_bytecode CompileDX11Shader(rt_shader_stage stage,
|
||||||
|
rt_shader_optimization_level optimization,
|
||||||
|
rt_text_span code,
|
||||||
|
const char *file_path,
|
||||||
|
rt_arena *arena);
|
||||||
|
#endif
|
||||||
|
|
||||||
static rt_shader_bytecode CompileNullShader(rt_shader_stage stage,
|
static rt_shader_bytecode CompileNullShader(rt_shader_stage stage,
|
||||||
rt_shader_optimization_level optimization,
|
rt_shader_optimization_level optimization,
|
||||||
rt_text_span code,
|
rt_text_span code,
|
||||||
@ -24,8 +32,11 @@ static rt_shader_bytecode CompileNullShader(rt_shader_stage stage,
|
|||||||
};
|
};
|
||||||
}
|
}
|
||||||
|
|
||||||
typedef rt_shader_bytecode
|
typedef rt_shader_bytecode shader_compiler_fn(rt_shader_stage,
|
||||||
shader_compiler_fn(rt_shader_stage, rt_shader_optimization_level, rt_text_span, const char *, rt_arena *);
|
rt_shader_optimization_level,
|
||||||
|
rt_text_span,
|
||||||
|
const char *,
|
||||||
|
rt_arena *);
|
||||||
|
|
||||||
static shader_compiler_fn *_compiler_funcs[RT_SHADER_TYPE_count] = {
|
static shader_compiler_fn *_compiler_funcs[RT_SHADER_TYPE_count] = {
|
||||||
CompileNullShader,
|
CompileNullShader,
|
||||||
@ -36,6 +47,11 @@ static shader_compiler_fn *_compiler_funcs[RT_SHADER_TYPE_count] = {
|
|||||||
CompileNullShader,
|
CompileNullShader,
|
||||||
#endif
|
#endif
|
||||||
|
|
||||||
|
#ifdef RT_BUILD_DX11_SHADER_COMPILER
|
||||||
|
CompileDX11Shader,
|
||||||
|
#else
|
||||||
|
CompileNullShader,
|
||||||
|
#endif
|
||||||
};
|
};
|
||||||
|
|
||||||
rt_shader_bytecode CompileShader(rt_shader_type type,
|
rt_shader_bytecode CompileShader(rt_shader_type type,
|
||||||
|
@ -25,7 +25,7 @@ static bool _renderer_loaded = false;
|
|||||||
RT_DLLEXPORT
|
RT_DLLEXPORT
|
||||||
RT_CVAR_S(rt_Renderer,
|
RT_CVAR_S(rt_Renderer,
|
||||||
"Select the render backend. Available options: [vk, null], Default: vk",
|
"Select the render backend. Available options: [vk, null], Default: vk",
|
||||||
"vk");
|
"dx11");
|
||||||
|
|
||||||
#ifdef RT_STATIC_LIB
|
#ifdef RT_STATIC_LIB
|
||||||
extern void RT_RENDERER_API_FN(RegisterCVars)(void);
|
extern void RT_RENDERER_API_FN(RegisterCVars)(void);
|
||||||
|
@ -87,6 +87,7 @@ typedef struct {
|
|||||||
typedef enum {
|
typedef enum {
|
||||||
RT_SHADER_TYPE_INVALID,
|
RT_SHADER_TYPE_INVALID,
|
||||||
RT_SHADER_TYPE_VULKAN,
|
RT_SHADER_TYPE_VULKAN,
|
||||||
|
RT_SHADER_TYPE_DX11,
|
||||||
|
|
||||||
RT_SHADER_TYPE_count,
|
RT_SHADER_TYPE_count,
|
||||||
} rt_shader_type;
|
} rt_shader_type;
|
||||||
|
@ -2,12 +2,6 @@
|
|||||||
#pragma warning Building DX11 on non - windows is probably a mistake
|
#pragma warning Building DX11 on non - windows is probably a mistake
|
||||||
#endif
|
#endif
|
||||||
|
|
||||||
#pragma comment(lib, "d3d11.lib")
|
|
||||||
#pragma comment(lib, "dxgi.lib")
|
|
||||||
#pragma comment(lib, "d3dcompiler.lib")
|
|
||||||
#pragma comment(lib, "winmm.lib")
|
|
||||||
#pragma comment(lib, "dxguid.lib")
|
|
||||||
|
|
||||||
#include <d3d11.h>
|
#include <d3d11.h>
|
||||||
#include <dxgi1_3.h>
|
#include <dxgi1_3.h>
|
||||||
#include <wrl.h>
|
#include <wrl.h>
|
||||||
|
@ -1,4 +1,6 @@
|
|||||||
if get_option('build_dx11')
|
if get_option('build_dx11')
|
||||||
|
dx11_dep = declare_dependency(link_args: ['-ld3d11', '-ldxgi', '-lwinmm', '-ldxguid'])
|
||||||
|
|
||||||
dx11_renderer_lib = library('rtdx11',
|
dx11_renderer_lib = library('rtdx11',
|
||||||
# Project Sources
|
# Project Sources
|
||||||
'device_objects.hpp',
|
'device_objects.hpp',
|
||||||
@ -11,7 +13,7 @@ if get_option('build_dx11')
|
|||||||
'init.cpp',
|
'init.cpp',
|
||||||
'render_targets.cpp',
|
'render_targets.cpp',
|
||||||
|
|
||||||
dependencies : [m_dep, windowing_dep],
|
dependencies : [m_dep, windowing_dep, dx11_dep],
|
||||||
include_directories : [engine_incdir, contrib_incdir],
|
include_directories : [engine_incdir, contrib_incdir],
|
||||||
link_with : [runtime_lib],
|
link_with : [runtime_lib],
|
||||||
cpp_pch : 'pch/dx11_pch.h',
|
cpp_pch : 'pch/dx11_pch.h',
|
||||||
|
@ -42,7 +42,8 @@ rt_result InitRenderTargetManagement() {
|
|||||||
}
|
}
|
||||||
|
|
||||||
void ShutdownRenderTargetManagement() {
|
void ShutdownRenderTargetManagement() {
|
||||||
for (int i = 0; i < rt_Dx11MaxRenderTargets.i; ++i) {
|
// Swapchain rtv in slot 1 will be released elsewhere
|
||||||
|
for (int i = 2; i < rt_Dx11MaxRenderTargets.i; ++i) {
|
||||||
if (_render_targets[i].rtv)
|
if (_render_targets[i].rtv)
|
||||||
_render_targets[i].rtv->Release();
|
_render_targets[i].rtv->Release();
|
||||||
if (_render_targets[i].dsv)
|
if (_render_targets[i].dsv)
|
||||||
|
Loading…
Reference in New Issue
Block a user