diff options
Diffstat (limited to 'source/blender/draw/engines/eevee_next/eevee_shader.hh')
-rw-r--r-- | source/blender/draw/engines/eevee_next/eevee_shader.hh | 70 |
1 files changed, 70 insertions, 0 deletions
diff --git a/source/blender/draw/engines/eevee_next/eevee_shader.hh b/source/blender/draw/engines/eevee_next/eevee_shader.hh new file mode 100644 index 00000000000..ba7c97b3b6a --- /dev/null +++ b/source/blender/draw/engines/eevee_next/eevee_shader.hh @@ -0,0 +1,70 @@ +/* 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 <array> +#include <string> + +#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 { + MAX_SHADER_TYPE = 0, +}; + +/** + * Shader module. shared between instances. + */ +class ShaderModule { + private: + std::array<GPUShader *, MAX_SHADER_TYPE> shaders_; + + /** Shared shader module accross 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 |