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:
authorCampbell Barton <ideasman42@gmail.com>2019-01-24 07:02:40 +0300
committerCampbell Barton <ideasman42@gmail.com>2019-01-24 08:14:00 +0300
commit04d18b117c2f95b0b28df12c9ddac06b018d6236 (patch)
tree2c2975e479dc40083c664e48f26d683b61010846 /source/blender/draw/intern
parent1d908bffddb4c9815a986305ad4588032b81deee (diff)
DRW: API for own versions of builtin GPU shaders
DRW_shader_get_builtin_shader can replace GPU_shader_get_builtin_shader when we need to support clipping. Use this for loose point & wire drawing in object mode, clips edges in lattice edit mode.
Diffstat (limited to 'source/blender/draw/intern')
-rw-r--r--source/blender/draw/intern/draw_builtin_shader.c131
-rw-r--r--source/blender/draw/intern/draw_builtin_shader.h34
-rw-r--r--source/blender/draw/intern/draw_manager.c2
3 files changed, 167 insertions, 0 deletions
diff --git a/source/blender/draw/intern/draw_builtin_shader.c b/source/blender/draw/intern/draw_builtin_shader.c
new file mode 100644
index 00000000000..3f49f9d2731
--- /dev/null
+++ b/source/blender/draw/intern/draw_builtin_shader.c
@@ -0,0 +1,131 @@
+/*
+ * ***** BEGIN GPL LICENSE BLOCK *****
+ *
+ * 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.
+ *
+ * ***** END GPL LICENSE BLOCK *****
+ *
+ */
+
+/** \file draw_armature.c
+ * \ingroup draw
+ * Draw manager versions of #eGPUBuiltinShader, see #GPU_shader_get_builtin_shader.
+ *
+ * Allows for modifications to shaders (currently only clipping support).
+ * Follow GPU_shader.h conventions to avoid annoyance.
+ */
+
+#include "BLI_utildefines.h"
+
+#include "GPU_shader.h"
+
+#include "DRW_render.h"
+
+#include "draw_builtin_shader.h" /* own include */
+
+
+extern char datatoc_common_world_clip_lib_glsl[];
+
+extern char datatoc_drw_shader_3D_vert_glsl[];
+extern char datatoc_drw_shader_3D_smooth_color_vert_glsl[];
+
+extern char datatoc_gpu_shader_uniform_color_frag_glsl[];
+extern char datatoc_gpu_shader_3D_smooth_color_frag_glsl[];
+
+
+/* cache of built-in shaders (each is created on first use) */
+static struct {
+ GPUShader *builtin_shaders[GPU_NUM_BUILTIN_SHADERS];
+} g_sh_data[DRW_SHADER_SLOT_LEN - 1] = {{{NULL}}};
+
+static GPUShader *drw_shader_get_builtin_shader_clipped(eGPUBuiltinShader shader_id, bool *r_test_only)
+{
+ const char *world_clip_lib = datatoc_common_world_clip_lib_glsl;
+ const char *world_clip_def = "#define USE_WORLD_CLIP_PLANES\n";
+
+ if (r_test_only) {
+ *r_test_only = true;
+ }
+
+ GPUShader *shader = NULL;
+ switch (shader_id) {
+ case GPU_SHADER_3D_UNIFORM_COLOR:
+ if (r_test_only) {
+ break;
+ }
+ shader = DRW_shader_create_from_arrays({
+ .vert = (const char *[]){world_clip_lib, datatoc_drw_shader_3D_vert_glsl, NULL},
+ .frag = (const char *[]){datatoc_gpu_shader_uniform_color_frag_glsl, NULL},
+ .defs = (const char *[]){world_clip_def, NULL}});
+ break;
+ case GPU_SHADER_3D_SMOOTH_COLOR:
+ if (r_test_only) {
+ break;
+ }
+ shader = DRW_shader_create_from_arrays({
+ .vert = (const char *[]){world_clip_lib, datatoc_drw_shader_3D_smooth_color_vert_glsl, NULL},
+ .frag = (const char *[]){datatoc_gpu_shader_3D_smooth_color_frag_glsl, NULL},
+ .defs = (const char *[]){world_clip_def, NULL}});
+ break;
+ default:
+ /* Unsupported, caller asserts. */
+ if (r_test_only) {
+ *r_test_only = false;
+ }
+ }
+ return shader;
+}
+
+static bool drw_shader_get_builtin_shader_test_all(eGPUBuiltinShader shader_id)
+{
+ bool test = false;
+ drw_shader_get_builtin_shader_clipped(shader_id, &test);
+ return test;
+}
+
+GPUShader *DRW_shader_get_builtin_shader(eGPUBuiltinShader shader_id, eDRW_ShaderSlot slot)
+{
+ BLI_assert(drw_shader_get_builtin_shader_test_all(shader_id));
+ if (slot == DRW_SHADER_SLOT_DEFAULT) {
+ return GPU_shader_get_builtin_shader(shader_id);
+ }
+
+ GPUShader **builtin_shaders = g_sh_data[slot - 1].builtin_shaders;
+
+ if (builtin_shaders[shader_id] != NULL) {
+ return builtin_shaders[shader_id];
+ }
+
+ if (slot == DRW_SHADER_SLOT_CLIPPED) {
+ builtin_shaders[shader_id] = drw_shader_get_builtin_shader_clipped(shader_id, NULL);
+ return builtin_shaders[shader_id];
+ }
+ else {
+ BLI_assert(0);
+ }
+}
+
+void DRW_shader_free_builtin_shaders(void)
+{
+ for (int j = 0; j < (DRW_SHADER_SLOT_LEN - 1); j++) {
+ GPUShader **builtin_shaders = g_sh_data[j].builtin_shaders;
+ for (int i = 0; i < GPU_NUM_BUILTIN_SHADERS; i++) {
+ if (builtin_shaders[i]) {
+ GPU_shader_free(builtin_shaders[i]);
+ builtin_shaders[i] = NULL;
+ }
+ }
+ }
+}
diff --git a/source/blender/draw/intern/draw_builtin_shader.h b/source/blender/draw/intern/draw_builtin_shader.h
new file mode 100644
index 00000000000..f9eb42a7026
--- /dev/null
+++ b/source/blender/draw/intern/draw_builtin_shader.h
@@ -0,0 +1,34 @@
+/*
+ * ***** BEGIN GPL LICENSE BLOCK *****
+ *
+ * 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.
+ *
+ * ***** END GPL LICENSE BLOCK *****
+ *
+ */
+
+/** \file draw_builtin_shader.h
+ * \ingroup draw
+ */
+
+#ifndef __DRAW_BUILTIN_SHADER_H__
+#define __DRAW_BUILTIN_SHADER_H__
+
+struct GPUShader;
+
+struct GPUShader *DRW_shader_get_builtin_shader(eGPUBuiltinShader shader_id, eDRW_ShaderSlot slot);
+void DRW_shader_free_builtin_shaders(void);
+
+#endif /* __DRAW_BUILTIN_SHADER_H__ */
diff --git a/source/blender/draw/intern/draw_manager.c b/source/blender/draw/intern/draw_manager.c
index c47ab00c841..d311b3e8156 100644
--- a/source/blender/draw/intern/draw_manager.c
+++ b/source/blender/draw/intern/draw_manager.c
@@ -82,6 +82,7 @@
#include "draw_cache_impl.h"
#include "draw_mode_engines.h"
+#include "draw_builtin_shader.h"
#include "engines/eevee/eevee_engine.h"
#include "engines/basic/basic_engine.h"
#include "engines/workbench/workbench_engine.h"
@@ -2610,6 +2611,7 @@ void DRW_engines_free(void)
DRW_shape_cache_free();
DRW_stats_free();
DRW_globals_free();
+ DRW_shader_free_builtin_shaders();
DrawEngineType *next;
for (DrawEngineType *type = DRW_engines.first; type; type = next) {