From ac7e361f3d55d5bd146aea0de2244d0113242989 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Cl=C3=A9ment=20Foucault?= Date: Wed, 16 Apr 2025 18:49:21 +0200 Subject: [PATCH] GPU: Expose preprocessor through API This is needed to preprocess some source inside the `intern` directory. --- source/blender/gpu/GPU_shader.hh | 6 ++++++ source/blender/gpu/intern/gpu_shader.cc | 18 +++++++++--------- 2 files changed, 15 insertions(+), 9 deletions(-) diff --git a/source/blender/gpu/GPU_shader.hh b/source/blender/gpu/GPU_shader.hh index 4b8bc3abc4f..b0c198d4ac7 100644 --- a/source/blender/gpu/GPU_shader.hh +++ b/source/blender/gpu/GPU_shader.hh @@ -40,6 +40,12 @@ constexpr static int GPU_MAX_UNIFORM_ATTR = 8; /** \name Creation * \{ */ +/** + * Preprocess a raw GLSL source to adhere to our backend compatible shader language. + * Needed if the string was not part of our build system and is used in a #GPUShaderCreateInfo. + */ +std::string GPU_shader_preprocess_source(blender::StringRefNull original); + /** * Create a shader using the given #GPUShaderCreateInfo. * Can return a null pointer if compilation fails. diff --git a/source/blender/gpu/intern/gpu_shader.cc b/source/blender/gpu/intern/gpu_shader.cc index 4c09f17940c..6e67613a264 100644 --- a/source/blender/gpu/intern/gpu_shader.cc +++ b/source/blender/gpu/intern/gpu_shader.cc @@ -269,7 +269,7 @@ GPUShader *GPU_shader_create_from_info(const GPUShaderCreateInfo *_info) return wrap(Context::get()->get_compiler()->compile(info, false)); } -static std::string preprocess_source(StringRefNull original) +std::string GPU_shader_preprocess_source(StringRefNull original) { if (original.is_empty()) { return original; @@ -289,10 +289,10 @@ GPUShader *GPU_shader_create_from_info_python(const GPUShaderCreateInfo *_info) std::string geometry_source_original = info.geometry_source_generated; std::string compute_source_original = info.compute_source_generated; - info.vertex_source_generated = preprocess_source(info.vertex_source_generated); - info.fragment_source_generated = preprocess_source(info.fragment_source_generated); - info.geometry_source_generated = preprocess_source(info.geometry_source_generated); - info.compute_source_generated = preprocess_source(info.compute_source_generated); + info.vertex_source_generated = GPU_shader_preprocess_source(info.vertex_source_generated); + info.fragment_source_generated = GPU_shader_preprocess_source(info.fragment_source_generated); + info.geometry_source_generated = GPU_shader_preprocess_source(info.geometry_source_generated); + info.compute_source_generated = GPU_shader_preprocess_source(info.compute_source_generated); GPUShader *result = wrap(Context::get()->get_compiler()->compile(info, false)); @@ -336,19 +336,19 @@ GPUShader *GPU_shader_create_from_python(std::optional vertcode, std::string library_source_processed; if (vertcode.has_value()) { - vertex_source_processed = preprocess_source(*vertcode); + vertex_source_processed = GPU_shader_preprocess_source(*vertcode); vertcode = vertex_source_processed; } if (fragcode.has_value()) { - fragment_source_processed = preprocess_source(*fragcode); + fragment_source_processed = GPU_shader_preprocess_source(*fragcode); fragcode = fragment_source_processed; } if (geomcode.has_value()) { - geometry_source_processed = preprocess_source(*geomcode); + geometry_source_processed = GPU_shader_preprocess_source(*geomcode); geomcode = geometry_source_processed; } if (libcode.has_value()) { - library_source_processed = preprocess_source(*libcode); + library_source_processed = GPU_shader_preprocess_source(*libcode); libcode = library_source_processed; }