GPU: Expose preprocessor through API

This is needed to preprocess some source inside the
`intern` directory.
This commit is contained in:
Clément Foucault
2025-04-16 18:49:21 +02:00
parent 2d2de60655
commit ac7e361f3d
2 changed files with 15 additions and 9 deletions

View File

@@ -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.

View File

@@ -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<StringRefNull> 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;
}