/* SPDX-License-Identifier: GPL-2.0-or-later * Copyright 2021 Blender Foundation. */ /** \file * \ingroup eevee * * Shader module that manage shader libraries, deferred compilation, * and static shader usage. */ #pragma once #include #include #include "BLI_string_ref.hh" #include "DRW_render.h" #include "GPU_material.h" #include "GPU_shader.h" #include "eevee_material.hh" #include "eevee_sync.hh" namespace blender::eevee { /* Keep alphabetical order and clean prefix. */ enum eShaderType { FILM_FRAG = 0, FILM_COMP, MOTION_BLUR_GATHER, MOTION_BLUR_TILE_DILATE, MOTION_BLUR_TILE_FLATTEN_RENDER, MOTION_BLUR_TILE_FLATTEN_VIEWPORT, MAX_SHADER_TYPE, }; /** * Shader module. shared between instances. */ class ShaderModule { private: std::array shaders_; /** Shared shader module across all engine instances. */ static ShaderModule *g_shader_module; public: ShaderModule(); ~ShaderModule(); GPUShader *static_shader_get(eShaderType shader_type); GPUMaterial *material_shader_get(::Material *blender_mat, struct bNodeTree *nodetree, eMaterialPipeline pipeline_type, eMaterialGeometry geometry_type, bool deferred_compilation); GPUMaterial *world_shader_get(::World *blender_world, struct bNodeTree *nodetree); GPUMaterial *material_shader_get(const char *name, ListBase &materials, struct bNodeTree *nodetree, eMaterialPipeline pipeline_type, eMaterialGeometry geometry_type, bool is_lookdev); void material_create_info_ammend(GPUMaterial *mat, GPUCodegenOutput *codegen); /** Only to be used by Instance constructor. */ static ShaderModule *module_get(); static void module_free(); private: const char *static_shader_create_info_name_get(eShaderType shader_type); }; } // namespace blender::eevee