summaryrefslogtreecommitdiffstats
path: root/drivers/vulkan/rendering_device_vulkan.cpp
diff options
context:
space:
mode:
authorclayjohn <claynjohn@gmail.com>2023-07-18 11:21:27 +0200
committerclayjohn <claynjohn@gmail.com>2023-07-21 16:42:30 +0200
commite970f5249cd00ad28cd16bc4f07c02d69090affa (patch)
tree1f80cd67935b7d2b024f26f077c681e10e79e8a9 /drivers/vulkan/rendering_device_vulkan.cpp
parentf8dbed4d0aef09ae7f4e3d66213268dba23a31d6 (diff)
downloadredot-engine-e970f5249cd00ad28cd16bc4f07c02d69090affa.tar.gz
Add Shader compile groups to RD Shader system
This allows us to specify a subset of variants to compile at load time and conditionally other variants later. This works seamlessly with shader caching. Needed to ensure that users only pay the cost for variants they use
Diffstat (limited to 'drivers/vulkan/rendering_device_vulkan.cpp')
-rw-r--r--drivers/vulkan/rendering_device_vulkan.cpp15
1 files changed, 12 insertions, 3 deletions
diff --git a/drivers/vulkan/rendering_device_vulkan.cpp b/drivers/vulkan/rendering_device_vulkan.cpp
index 6cf8f2dfac..6f6e9ddfb7 100644
--- a/drivers/vulkan/rendering_device_vulkan.cpp
+++ b/drivers/vulkan/rendering_device_vulkan.cpp
@@ -4835,7 +4835,7 @@ Vector<uint8_t> RenderingDeviceVulkan::shader_compile_binary_from_spirv(const Ve
return ret;
}
-RID RenderingDeviceVulkan::shader_create_from_bytecode(const Vector<uint8_t> &p_shader_binary) {
+RID RenderingDeviceVulkan::shader_create_from_bytecode(const Vector<uint8_t> &p_shader_binary, RID p_placeholder) {
const uint8_t *binptr = p_shader_binary.ptr();
uint32_t binsize = p_shader_binary.size();
@@ -5161,14 +5161,23 @@ RID RenderingDeviceVulkan::shader_create_from_bytecode(const Vector<uint8_t> &p_
ERR_FAIL_V_MSG(RID(), error_text);
}
-
- RID id = shader_owner.make_rid(shader);
+ RID id;
+ if (p_placeholder.is_null()) {
+ id = shader_owner.make_rid(shader);
+ } else {
+ shader_owner.initialize_rid(p_placeholder, shader);
+ id = p_placeholder;
+ }
#ifdef DEV_ENABLED
set_resource_name(id, "RID:" + itos(id.get_id()));
#endif
return id;
}
+RID RenderingDeviceVulkan::shader_create_placeholder() {
+ return shader_owner.allocate_rid();
+}
+
uint32_t RenderingDeviceVulkan::shader_get_vertex_input_attribute_mask(RID p_shader) {
_THREAD_SAFE_METHOD_