Welcome to mirror list, hosted at ThFree Co, Russian Federation.

git.blender.org/blender.git - Unnamed repository; edit this file 'description' to name the repository.
summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authorClément Foucault <foucault.clem@gmail.com>2021-04-02 15:44:44 +0300
committerClément Foucault <foucault.clem@gmail.com>2021-04-02 15:44:44 +0300
commitef174ffcb3cca9a52aa12df6449651eec51a7376 (patch)
tree74dbe4dfebaafa6bde4181b36122b1559159c2a9 /source/blender/draw/engines/eevee/eevee_shader.hh
parentad23570fa2dd5333ccc99cdcdd044ce7f2784bcb (diff)
Cleanup: EEVEE: Renaming
- Add eevee_ prefix to shaders to avoid name clashing. - remove plural of eevee_shaders. - rename eevee_shared.hh to eevee_shader_shared.hh.
Diffstat (limited to 'source/blender/draw/engines/eevee/eevee_shader.hh')
-rw-r--r--source/blender/draw/engines/eevee/eevee_shader.hh150
1 files changed, 150 insertions, 0 deletions
diff --git a/source/blender/draw/engines/eevee/eevee_shader.hh b/source/blender/draw/engines/eevee/eevee_shader.hh
new file mode 100644
index 00000000000..877891ad298
--- /dev/null
+++ b/source/blender/draw/engines/eevee/eevee_shader.hh
@@ -0,0 +1,150 @@
+/*
+ * This program is free software; you can redistribute it and/or
+ * modify it under the terms of the GNU General Public License
+ * as published by the Free Software Foundation; either version 2
+ * of the License, or (at your option) any later version.
+ *
+ * This program is distributed in the hope that it will be useful,
+ * but WITHOUT ANY WARRANTY; without even the implied warranty of
+ * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
+ * GNU General Public License for more details.
+ *
+ * You should have received a copy of the GNU General Public License
+ * along with this program; if not, write to the Free Software Foundation,
+ * Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301, USA.
+ *
+ * Copyright 2021, Blender Foundation.
+ */
+
+/** \file
+ * \ingroup eevee
+ *
+ * Shader module that manage shader libraries, deferred compilation,
+ * and static shader usage.
+ */
+
+#pragma once
+
+#include "BLI_vector.hh"
+
+#include "DRW_render.h"
+#include "GPU_shader.h"
+
+extern char datatoc_common_fullscreen_vert_glsl[];
+extern char datatoc_common_hair_lib_glsl[];
+extern char datatoc_common_math_geom_lib_glsl[];
+extern char datatoc_common_math_lib_glsl[];
+extern char datatoc_common_view_lib_glsl[];
+
+extern char datatoc_eevee_camera_lib_glsl[];
+extern char datatoc_eevee_film_filter_frag_glsl[];
+extern char datatoc_eevee_film_lib_glsl[];
+extern char datatoc_eevee_film_resolve_frag_glsl[];
+extern char datatoc_eevee_object_forward_frag_glsl[];
+extern char datatoc_eevee_object_lib_glsl[];
+extern char datatoc_eevee_object_mesh_vert_glsl[];
+
+extern char datatoc_eevee_shader_shared_hh[];
+
+namespace blender::eevee {
+
+/* Keep alphabetical order and clean prefix. */
+enum eShaderType {
+ FILM_FILTER = 0,
+ FILM_RESOLVE,
+ MESH, /* TEST */
+
+ MAX_SHADER_TYPE,
+};
+
+typedef struct ShaderModule {
+ private:
+ struct ShaderDescription {
+ const char *name;
+ const char *vertex_shader_code;
+ const char *geometry_shader_code;
+ const char *fragment_shader_code;
+ };
+
+ DRWShaderLibrary *shader_lib_ = nullptr;
+ Vector<GPUShader *> shaders_;
+ Vector<ShaderDescription> shader_descriptions_;
+
+ public:
+ ShaderModule()
+ {
+ shaders_.resize(MAX_SHADER_TYPE);
+ shader_descriptions_.resize(MAX_SHADER_TYPE);
+
+ for (GPUShader *&shader : shaders_) {
+ shader = nullptr;
+ }
+
+ shader_lib_ = DRW_shader_library_create();
+ /* NOTE: These need to be ordered by dependencies. */
+ DRW_shader_library_add_file(
+ shader_lib_, datatoc_eevee_shader_shared_hh, "eevee_shader_shared.hh");
+ DRW_SHADER_LIB_ADD(shader_lib_, common_math_lib);
+ DRW_SHADER_LIB_ADD(shader_lib_, common_math_geom_lib);
+ DRW_SHADER_LIB_ADD(shader_lib_, common_hair_lib);
+ DRW_SHADER_LIB_ADD(shader_lib_, common_view_lib);
+ DRW_SHADER_LIB_ADD(shader_lib_, eevee_camera_lib);
+ DRW_SHADER_LIB_ADD(shader_lib_, eevee_film_lib);
+ DRW_SHADER_LIB_ADD(shader_lib_, eevee_object_lib);
+
+ /* Meh ¯\_(ツ)_/¯. */
+ char *datatoc_nullptr_glsl = nullptr;
+
+#define SHADER(enum_, vert_, geom_, frag_) \
+ shader_descriptions_[enum_].name = STRINGIFY(enum_); \
+ shader_descriptions_[enum_].vertex_shader_code = datatoc_##vert_##_glsl; \
+ shader_descriptions_[enum_].geometry_shader_code = datatoc_##geom_##_glsl; \
+ shader_descriptions_[enum_].fragment_shader_code = datatoc_##frag_##_glsl;
+
+#define SHADER_FULLSCREEN(enum_, frag_) SHADER(enum_, common_fullscreen_vert, nullptr, frag_)
+
+ SHADER_FULLSCREEN(FILM_FILTER, eevee_film_filter_frag);
+ SHADER_FULLSCREEN(FILM_RESOLVE, eevee_film_resolve_frag);
+ SHADER(MESH, eevee_object_mesh_vert, nullptr, eevee_object_forward_frag);
+
+#undef SHADER
+#undef SHADER_FULLSCREEN
+
+#ifdef DEBUG
+ /* Ensure all shader are described. */
+ for (ShaderDescription &desc : shader_descriptions_) {
+ BLI_assert(desc.name != nullptr);
+ BLI_assert(desc.vertex_shader_code != nullptr);
+ BLI_assert(desc.fragment_shader_code != nullptr);
+ }
+#endif
+ }
+
+ ~ShaderModule()
+ {
+ for (GPUShader *&shader : shaders_) {
+ DRW_SHADER_FREE_SAFE(shader);
+ }
+ DRW_SHADER_LIB_FREE_SAFE(shader_lib_);
+ }
+
+ GPUShader *static_shader_get(eShaderType shader_type)
+ {
+ if (shaders_[shader_type] == nullptr) {
+ ShaderDescription &desc = shader_descriptions_[shader_type];
+ shaders_[shader_type] = DRW_shader_create_with_shaderlib_ex(desc.vertex_shader_code,
+ desc.geometry_shader_code,
+ desc.fragment_shader_code,
+ shader_lib_,
+ nullptr,
+ desc.name);
+ if (shaders_[shader_type] == nullptr) {
+ fprintf(stderr, "EEVEE: error: Could not compile static shader \"%s\"\n", desc.name);
+ }
+ BLI_assert(shaders_[shader_type] != nullptr);
+ }
+ return shaders_[shader_type];
+ }
+} ShaderModule;
+
+} // namespace blender::eevee