Compile each static shader using shaderc to Spir-V binaries. The main goal is to make sure that the GLSL created using ShaderCreateInfo and able to compile to Spir-V. For the second stage a correct pipeline needs to be created and some shader would need more adjustments (push constants size). With this patch future changes to GLSL sources can already be checked against vulkan, without the backend finished. Mechanism has been tested using MacOS and MoltenVK. For other OS, we should finetune CMake files to find the right location to shaderc. ``` ************************************************************ *** Build Mon 12 Dec 2022 11:08:07 CET ************************************************************ Shader Test compilation result: 463 / 463 passed (skipped 118 for compatibility reasons) OpenGL backend shader compilation succeeded. Shader Test compilation result: 529 / 529 passed (skipped 52 for compatibility reasons) Vulkan backend shader compilation succeeded. ``` Reviewed By: fclem Maniphest Tasks: T102760 Differential Revision: https://developer.blender.org/D16610
135 lines
3.0 KiB
C++
135 lines
3.0 KiB
C++
/* SPDX-License-Identifier: GPL-2.0-or-later
|
|
* Copyright 2021 Blender Foundation. All rights reserved. */
|
|
|
|
/** \file
|
|
* \ingroup gpu
|
|
*
|
|
* Compile time automation of shader compilation and validation.
|
|
*/
|
|
|
|
#include <iostream>
|
|
|
|
#include "GHOST_C-api.h"
|
|
|
|
#include "GPU_context.h"
|
|
#include "GPU_init_exit.h"
|
|
#include "gpu_shader_create_info_private.hh"
|
|
|
|
#include "BLI_vector.hh"
|
|
|
|
#include "CLG_log.h"
|
|
|
|
namespace blender::gpu::shader_builder {
|
|
|
|
class ShaderBuilder {
|
|
private:
|
|
GHOST_SystemHandle ghost_system_;
|
|
GHOST_ContextHandle ghost_context_;
|
|
GPUContext *gpu_context_ = nullptr;
|
|
|
|
public:
|
|
void init();
|
|
bool bake_create_infos();
|
|
void exit();
|
|
};
|
|
|
|
bool ShaderBuilder::bake_create_infos()
|
|
{
|
|
return gpu_shader_create_info_compile_all();
|
|
}
|
|
|
|
void ShaderBuilder::init()
|
|
{
|
|
CLG_init();
|
|
|
|
GHOST_GLSettings glSettings = {0};
|
|
switch (GPU_backend_type_selection_get()) {
|
|
case GPU_BACKEND_OPENGL:
|
|
glSettings.context_type = GHOST_kDrawingContextTypeOpenGL;
|
|
break;
|
|
|
|
#ifdef WITH_METAL_BACKEND
|
|
case GPU_BACKEND_METAL:
|
|
glSettings.context_type = GHOST_kDrawingContextTypeMetal;
|
|
break;
|
|
#endif
|
|
|
|
#ifdef WITH_VULKAN_BACKEND
|
|
case GPU_BACKEND_VULKAN:
|
|
glSettings.context_type = GHOST_kDrawingContextTypeVulkan;
|
|
break;
|
|
#endif
|
|
|
|
default:
|
|
BLI_assert_unreachable();
|
|
break;
|
|
}
|
|
|
|
ghost_system_ = GHOST_CreateSystemBackground();
|
|
ghost_context_ = GHOST_CreateOpenGLContext(ghost_system_, glSettings);
|
|
GHOST_ActivateOpenGLContext(ghost_context_);
|
|
|
|
gpu_context_ = GPU_context_create(nullptr, ghost_context_);
|
|
GPU_init();
|
|
}
|
|
|
|
void ShaderBuilder::exit()
|
|
{
|
|
GPU_exit();
|
|
|
|
GPU_context_discard(gpu_context_);
|
|
|
|
GHOST_DisposeOpenGLContext(ghost_system_, ghost_context_);
|
|
GHOST_DisposeSystem(ghost_system_);
|
|
|
|
CLG_exit();
|
|
}
|
|
|
|
} // namespace blender::gpu::shader_builder
|
|
|
|
/** \brief Entry point for the shader_builder. */
|
|
int main(int argc, const char *argv[])
|
|
{
|
|
if (argc < 2) {
|
|
printf("Usage: %s <data_file_to>\n", argv[0]);
|
|
exit(1);
|
|
}
|
|
|
|
int exit_code = 0;
|
|
|
|
struct NamedBackend {
|
|
std::string name;
|
|
eGPUBackendType backend;
|
|
};
|
|
|
|
blender::Vector<NamedBackend> backends_to_validate;
|
|
backends_to_validate.append({"OpenGL", GPU_BACKEND_OPENGL});
|
|
#ifdef WITH_METAL_BACKEND
|
|
backends_to_validate.append({"Metal", GPU_BACKEND_METAL});
|
|
#endif
|
|
#ifdef WITH_VULKAN_BACKEND
|
|
backends_to_validate.append({"Vulkan", GPU_BACKEND_VULKAN});
|
|
#endif
|
|
for (NamedBackend &backend : backends_to_validate) {
|
|
GPU_backend_type_selection_set(backend.backend);
|
|
if (!GPU_backend_supported()) {
|
|
printf("%s isn't supported on this platform. Shader compilation is skipped\n",
|
|
backend.name.c_str());
|
|
continue;
|
|
}
|
|
blender::gpu::shader_builder::ShaderBuilder builder;
|
|
builder.init();
|
|
if (!builder.bake_create_infos()) {
|
|
printf("Shader compilation failed for %s backend\n", backend.name.c_str());
|
|
exit_code = 1;
|
|
}
|
|
else {
|
|
printf("%s backend shader compilation succeeded.\n", backend.name.c_str());
|
|
}
|
|
builder.exit();
|
|
}
|
|
|
|
exit(exit_code);
|
|
return exit_code;
|
|
}
|