Skip to content

Commit 1e8372b

Browse files
authored
Merge pull request #223 from Devsh-Graphics-Programming/precompiled_shaders
Precompiled shaders
2 parents e5d5ae2 + eb7d4fe commit 1e8372b

File tree

37 files changed

+877
-401
lines changed

37 files changed

+877
-401
lines changed

03_DeviceSelectionAndSharedSources/main.cpp

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -257,7 +257,7 @@ class DeviceSelectionAndSharedSourcesApp final : public application_templates::M
257257
}
258258

259259
const auto* metadata = assetBundle.getMetadata();
260-
const auto hlslMetadata = static_cast<const CHLSLMetadata*>(metadata);
260+
const auto hlslMetadata = static_cast<const CHLSLMetadata*>(metadata);
261261
const auto shaderStage = hlslMetadata->shaderStages->front();
262262

263263
// It would be super weird if loading a shader from a file produced more than 1 asset

05_StreamingAndBufferDeviceAddressApp/CMakeLists.txt

Lines changed: 46 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -21,4 +21,49 @@ if(NBL_EMBED_BUILTIN_RESOURCES)
2121
ADD_CUSTOM_BUILTIN_RESOURCES(${_BR_TARGET_} RESOURCES_TO_EMBED "${_SEARCH_DIRECTORIES_}" "${RESOURCE_DIR}" "nbl::this_example::builtin" "${_OUTPUT_DIRECTORY_HEADER_}" "${_OUTPUT_DIRECTORY_SOURCE_}")
2222

2323
LINK_BUILTIN_RESOURCES_TO_TARGET(${EXECUTABLE_NAME} ${_BR_TARGET_})
24-
endif()
24+
endif()
25+
26+
set(OUTPUT_DIRECTORY "${CMAKE_CURRENT_BINARY_DIR}/auto-gen")
27+
set(DEPENDS
28+
app_resources/common.hlsl
29+
app_resources/shader.comp.hlsl
30+
)
31+
target_sources(${EXECUTABLE_NAME} PRIVATE ${DEPENDS})
32+
set_source_files_properties(${DEPENDS} PROPERTIES HEADER_FILE_ONLY ON)
33+
34+
set(SM 6_8)
35+
set(JSON [=[
36+
[
37+
{
38+
"INPUT": "app_resources/shader.comp.hlsl",
39+
"KEY": "shader",
40+
}
41+
]
42+
]=])
43+
string(CONFIGURE "${JSON}" JSON)
44+
45+
set(COMPILE_OPTIONS
46+
-I "${CMAKE_CURRENT_SOURCE_DIR}"
47+
-T lib_${SM}
48+
)
49+
50+
NBL_CREATE_NSC_COMPILE_RULES(
51+
TARGET ${EXECUTABLE_NAME}SPIRV
52+
LINK_TO ${EXECUTABLE_NAME}
53+
DEPENDS ${DEPENDS}
54+
BINARY_DIR ${OUTPUT_DIRECTORY}
55+
MOUNT_POINT_DEFINE NBL_THIS_EXAMPLE_BUILD_MOUNT_POINT
56+
COMMON_OPTIONS ${COMPILE_OPTIONS}
57+
OUTPUT_VAR KEYS
58+
INCLUDE nbl/this_example/builtin/build/spirv/keys.hpp
59+
NAMESPACE nbl::this_example::builtin::build
60+
INPUTS ${JSON}
61+
)
62+
63+
NBL_CREATE_RESOURCE_ARCHIVE(
64+
NAMESPACE nbl::this_example::builtin::build
65+
TARGET ${EXECUTABLE_NAME}_builtinsBuild
66+
LINK_TO ${EXECUTABLE_NAME}
67+
BIND ${OUTPUT_DIRECTORY}
68+
BUILTINS ${KEYS}
69+
)

05_StreamingAndBufferDeviceAddressApp/app_resources/shader.comp.hlsl

Lines changed: 1 addition & 4 deletions
Original file line numberDiff line numberDiff line change
@@ -1,12 +1,9 @@
11
#include "common.hlsl"
22

3-
// just a small test
4-
#include "nbl/builtin/hlsl/jit/device_capabilities.hlsl"
5-
63
[[vk::push_constant]] PushConstantData pushConstants;
74

85
// does absolutely nothing, a later example will show how it gets used
9-
template<typename capability_traits=nbl::hlsl::jit::device_capabilities_traits>
6+
template<typename capability_traits=DeviceConfigCaps>
107
void dummyTraitTest() {}
118

129
[numthreads(WorkgroupSize,1,1)]

05_StreamingAndBufferDeviceAddressApp/main.cpp

Lines changed: 6 additions & 5 deletions
Original file line numberDiff line numberDiff line change
@@ -6,6 +6,7 @@
66
// I've moved out a tiny part of this example into a shared header for reuse, please open and read it.
77
#include "nbl/application_templates/MonoDeviceApplication.hpp"
88
#include "nbl/examples/common/BuiltinResourcesApplication.hpp"
9+
#include "nbl/this_example/builtin/build/spirv/keys.hpp"
910

1011

1112
using namespace nbl;
@@ -95,15 +96,15 @@ class StreamingAndBufferDeviceAddressApp final : public application_templates::M
9596
{
9697
IAssetLoader::SAssetLoadParams lp = {};
9798
lp.logger = m_logger.get();
98-
lp.workingDirectory = ""; // virtual root
99-
auto assetBundle = m_assetMgr->getAsset("app_resources/shader.comp.hlsl",lp);
99+
lp.workingDirectory = "app_resources"; // virtual root
100+
101+
auto key = nbl::this_example::builtin::build::get_spirv_key<"shader">(m_device.get());
102+
auto assetBundle = m_assetMgr->getAsset(key.data(), lp);
100103
const auto assets = assetBundle.getContents();
101104
if (assets.empty())
102105
return logFail("Could not load shader!");
103106

104-
// lets go straight from ICPUSpecializedShader to IGPUSpecializedShader
105-
const auto shaderSource = IAsset::castDown<IShader>(assets[0]);
106-
shader = m_device->compileShader({shaderSource.get()});
107+
shader = IAsset::castDown<IShader>(assets[0]);
107108
// The down-cast should not fail!
108109
assert(shader);
109110
}

07_StagingAndMultipleQueues/CMakeLists.txt

Lines changed: 46 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -21,4 +21,49 @@ if(NBL_EMBED_BUILTIN_RESOURCES)
2121
ADD_CUSTOM_BUILTIN_RESOURCES(${_BR_TARGET_} RESOURCES_TO_EMBED "${_SEARCH_DIRECTORIES_}" "${RESOURCE_DIR}" "nbl::this_example::builtin" "${_OUTPUT_DIRECTORY_HEADER_}" "${_OUTPUT_DIRECTORY_SOURCE_}")
2222

2323
LINK_BUILTIN_RESOURCES_TO_TARGET(${EXECUTABLE_NAME} ${_BR_TARGET_})
24-
endif()
24+
endif()
25+
26+
set(OUTPUT_DIRECTORY "${CMAKE_CURRENT_BINARY_DIR}/auto-gen")
27+
set(DEPENDS
28+
app_resources/common.hlsl
29+
app_resources/comp_shader.hlsl
30+
)
31+
target_sources(${EXECUTABLE_NAME} PRIVATE ${DEPENDS})
32+
set_source_files_properties(${DEPENDS} PROPERTIES HEADER_FILE_ONLY ON)
33+
34+
set(SM 6_8)
35+
set(JSON [=[
36+
[
37+
{
38+
"INPUT": "app_resources/comp_shader.hlsl",
39+
"KEY": "comp_shader",
40+
}
41+
]
42+
]=])
43+
string(CONFIGURE "${JSON}" JSON)
44+
45+
set(COMPILE_OPTIONS
46+
-I "${CMAKE_CURRENT_SOURCE_DIR}"
47+
-T lib_${SM}
48+
)
49+
50+
NBL_CREATE_NSC_COMPILE_RULES(
51+
TARGET ${EXECUTABLE_NAME}SPIRV
52+
LINK_TO ${EXECUTABLE_NAME}
53+
DEPENDS ${DEPENDS}
54+
BINARY_DIR ${OUTPUT_DIRECTORY}
55+
MOUNT_POINT_DEFINE NBL_THIS_EXAMPLE_BUILD_MOUNT_POINT
56+
COMMON_OPTIONS ${COMPILE_OPTIONS}
57+
OUTPUT_VAR KEYS
58+
INCLUDE nbl/this_example/builtin/build/spirv/keys.hpp
59+
NAMESPACE nbl::this_example::builtin::build
60+
INPUTS ${JSON}
61+
)
62+
63+
NBL_CREATE_RESOURCE_ARCHIVE(
64+
NAMESPACE nbl::this_example::builtin::build
65+
TARGET ${EXECUTABLE_NAME}_builtinsBuild
66+
LINK_TO ${EXECUTABLE_NAME}
67+
BIND ${OUTPUT_DIRECTORY}
68+
BUILTINS ${KEYS}
69+
)

07_StagingAndMultipleQueues/main.cpp

Lines changed: 28 additions & 16 deletions
Original file line numberDiff line numberDiff line change
@@ -4,6 +4,7 @@
44

55
// I've moved out a tiny part of this example into a shared header for reuse, please open and read it.
66
#include "nbl/examples/examples.hpp"
7+
#include "nbl/this_example/builtin/build/spirv/keys.hpp"
78

89
using namespace nbl;
910
using namespace nbl::core;
@@ -189,7 +190,7 @@ class StagingAndMultipleQueuesApp final : public application_templates::BasicMul
189190
for (uint32_t imageIdx = 0; imageIdx < IMAGE_CNT; ++imageIdx)
190191
{
191192
const auto imagePathToLoad = imagesToLoad[imageIdx];
192-
auto cpuImage = loadFistAssetInBundle<ICPUImage>(imagePathToLoad);
193+
auto cpuImage = loadImageAsset(imagePathToLoad);
193194
if (!cpuImage)
194195
logFailAndTerminate("Failed to load image from path %s",ILogger::ELL_ERROR,imagePathToLoad);
195196

@@ -279,17 +280,10 @@ class StagingAndMultipleQueuesApp final : public application_templates::BasicMul
279280
}
280281

281282
// LOAD SHADER FROM FILE
282-
smart_refctd_ptr<IShader> source;
283-
{
284-
source = loadFistAssetInBundle<IShader>("../app_resources/comp_shader.hlsl");
285-
}
283+
smart_refctd_ptr<IShader> shader = loadPreCompiledShader<"comp_shader">(); // "../app_resources/comp_shader.hlsl"
286284

287-
if (!source)
288-
logFailAndTerminate("Could not create a CPU shader!");
289-
290-
core::smart_refctd_ptr<IShader> shader = m_device->compileShader({ source.get() });
291-
if(!shader)
292-
logFailAndTerminate("Could not compile shader to spirv!");
285+
if (!shader)
286+
logFailAndTerminate("Could not load the precompiled shader!");
293287

294288
// CREATE COMPUTE PIPELINE
295289
SPushConstantRange pc[1];
@@ -534,21 +528,39 @@ class StagingAndMultipleQueuesApp final : public application_templates::BasicMul
534528

535529
return false;
536530
}
537-
538-
template<typename AssetType>
539-
core::smart_refctd_ptr<AssetType> loadFistAssetInBundle(const std::string& path)
531+
532+
core::smart_refctd_ptr<ICPUImage> loadImageAsset(const std::string& path)
540533
{
541534
IAssetLoader::SAssetLoadParams lp;
542535
SAssetBundle bundle = m_assetMgr->getAsset(path, lp);
543536
if (bundle.getContents().empty())
544-
logFailAndTerminate("Couldn't load an asset.",ILogger::ELL_ERROR);
537+
logFailAndTerminate("Couldn't load an image.",ILogger::ELL_ERROR);
545538

546-
auto asset = IAsset::castDown<AssetType>(bundle.getContents()[0]);
539+
auto asset = IAsset::castDown<ICPUImage>(bundle.getContents()[0]);
547540
if (!asset)
548541
logFailAndTerminate("Incorrect asset loaded.",ILogger::ELL_ERROR);
549542

550543
return asset;
551544
}
545+
546+
template<core::StringLiteral ShaderKey>
547+
core::smart_refctd_ptr<IShader> loadPreCompiledShader()
548+
{
549+
IAssetLoader::SAssetLoadParams lp;
550+
lp.logger = m_logger.get();
551+
lp.workingDirectory = "app_resources";
552+
553+
auto key = nbl::this_example::builtin::build::get_spirv_key<ShaderKey>(m_device.get());
554+
SAssetBundle bundle = m_assetMgr->getAsset(key.data(), lp);
555+
if (bundle.getContents().empty())
556+
logFailAndTerminate("Couldn't load a shader.", ILogger::ELL_ERROR);
557+
558+
auto asset = IAsset::castDown<IShader>(bundle.getContents()[0]);
559+
if (!asset)
560+
logFailAndTerminate("Incorrect asset loaded.", ILogger::ELL_ERROR);
561+
562+
return asset;
563+
}
552564
};
553565

554566
NBL_MAIN_FUNC(StagingAndMultipleQueuesApp)

10_CountingSort/CMakeLists.txt

Lines changed: 67 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -22,3 +22,70 @@ if(NBL_EMBED_BUILTIN_RESOURCES)
2222

2323
LINK_BUILTIN_RESOURCES_TO_TARGET(${EXECUTABLE_NAME} ${_BR_TARGET_})
2424
endif()
25+
26+
set(OUTPUT_DIRECTORY "${CMAKE_CURRENT_BINARY_DIR}/auto-gen")
27+
set(DEPENDS
28+
app_resources/common.hlsl
29+
app_resources/prefix_sum_shader.comp.hlsl
30+
app_resources/scatter_shader.comp.hlsl
31+
)
32+
target_sources(${EXECUTABLE_NAME} PRIVATE ${DEPENDS})
33+
set_source_files_properties(${DEPENDS} PROPERTIES HEADER_FILE_ONLY ON)
34+
35+
set(SM 6_8)
36+
set(REQUIRED_CAPS [=[
37+
{
38+
"kind": "limits",
39+
"name": "maxComputeWorkGroupInvocations",
40+
"type": "uint32_t",
41+
"values": [256,512,1024]
42+
},
43+
{
44+
"kind": "limits",
45+
"name": "maxComputeSharedMemorySize",
46+
"type": "uint32_t",
47+
"values": [16384, 32768, 65536]
48+
}
49+
]=])
50+
51+
set(JSON [=[
52+
[
53+
{
54+
"INPUT": "app_resources/prefix_sum_shader.comp.hlsl",
55+
"KEY": "prefix_sum_shader",
56+
"CAPS": [${REQUIRED_CAPS}]
57+
},
58+
{
59+
"INPUT": "app_resources/scatter_shader.comp.hlsl",
60+
"KEY": "scatter_shader",
61+
"CAPS": [${REQUIRED_CAPS}]
62+
}
63+
]
64+
]=])
65+
string(CONFIGURE "${JSON}" JSON)
66+
67+
set(COMPILE_OPTIONS
68+
-I "${CMAKE_CURRENT_SOURCE_DIR}"
69+
-T lib_${SM}
70+
)
71+
72+
NBL_CREATE_NSC_COMPILE_RULES(
73+
TARGET ${EXECUTABLE_NAME}SPIRV
74+
LINK_TO ${EXECUTABLE_NAME}
75+
DEPENDS ${DEPENDS}
76+
BINARY_DIR ${OUTPUT_DIRECTORY}
77+
MOUNT_POINT_DEFINE NBL_THIS_EXAMPLE_BUILD_MOUNT_POINT
78+
COMMON_OPTIONS ${COMPILE_OPTIONS}
79+
OUTPUT_VAR KEYS
80+
INCLUDE nbl/this_example/builtin/build/spirv/keys.hpp
81+
NAMESPACE nbl::this_example::builtin::build
82+
INPUTS ${JSON}
83+
)
84+
85+
NBL_CREATE_RESOURCE_ARCHIVE(
86+
NAMESPACE nbl::this_example::builtin::build
87+
TARGET ${EXECUTABLE_NAME}_builtinsBuild
88+
LINK_TO ${EXECUTABLE_NAME}
89+
BIND ${OUTPUT_DIRECTORY}
90+
BUILTINS ${KEYS}
91+
)

10_CountingSort/app_resources/common.hlsl

Lines changed: 6 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -22,6 +22,10 @@ using namespace nbl::hlsl;
2222
#ifdef __HLSL_VERSION
2323
#include "nbl/builtin/hlsl/bda/bda_accessor.hlsl"
2424

25+
static const uint32_t WorkgroupSize = DeviceConfigCaps::maxComputeWorkGroupInvocations;
26+
static const uint32_t MaxBucketCount = (DeviceConfigCaps::maxComputeSharedMemorySize / sizeof(uint32_t)) / 2;
27+
static const uint32_t BucketCount = (MaxBucketCount > 3000) ? 3000 : MaxBucketCount;
28+
2529
using Ptr = bda::__ptr<uint32_t>;
2630
using PtrAccessor = BdaAccessor<uint32_t>;
2731

@@ -54,6 +58,8 @@ uint32_t3 glsl::gl_WorkGroupSize()
5458
{
5559
return uint32_t3(WorkgroupSize, 1, 1);
5660
}
61+
62+
5763
#endif
5864

5965
#endif

0 commit comments

Comments
 (0)