[Bf-blender-cvs] [e4ee9de6389] master: GPU: Move gpu_shader.c to C++
Clément Foucault
noreply at git.blender.org
Wed Jul 29 15:03:12 CEST 2020
Commit: e4ee9de63899e2da58cdfdd9cbf2ac5bb2e3755a
Author: Clément Foucault
Date: Tue Jul 28 20:04:15 2020 +0200
Branches: master
https://developer.blender.org/rBe4ee9de63899e2da58cdfdd9cbf2ac5bb2e3755a
GPU: Move gpu_shader.c to C++
We split builtin shader support to its own file to avoid
converting code (lack of designated initializer in C++)
and to reduce file size.
===================================================================
M source/blender/gpu/CMakeLists.txt
A source/blender/gpu/intern/gpu_shader.cc
R051 source/blender/gpu/intern/gpu_shader.c source/blender/gpu/intern/gpu_shader_builtin.c
===================================================================
diff --git a/source/blender/gpu/CMakeLists.txt b/source/blender/gpu/CMakeLists.txt
index de57bc012e0..925c873181f 100644
--- a/source/blender/gpu/CMakeLists.txt
+++ b/source/blender/gpu/CMakeLists.txt
@@ -75,7 +75,8 @@ set(SRC
intern/gpu_select.c
intern/gpu_select_pick.c
intern/gpu_select_sample_query.c
- intern/gpu_shader.c
+ intern/gpu_shader.cc
+ intern/gpu_shader_builtin.c
intern/gpu_shader_interface.c
intern/gpu_state.cc
intern/gpu_texture.cc
diff --git a/source/blender/gpu/intern/gpu_shader.c b/source/blender/gpu/intern/gpu_shader.cc
similarity index 51%
copy from source/blender/gpu/intern/gpu_shader.c
copy to source/blender/gpu/intern/gpu_shader.cc
index 9ea798e5669..e0a1456d92c 100644
--- a/source/blender/gpu/intern/gpu_shader.c
+++ b/source/blender/gpu/intern/gpu_shader.cc
@@ -44,129 +44,19 @@
#include "gpu_shader_private.h"
+extern char datatoc_gpu_shader_colorspace_lib_glsl[];
+
/* Adjust these constants as needed. */
#define MAX_DEFINE_LENGTH 256
#define MAX_EXT_DEFINE_LENGTH 512
-/* Non-generated shaders */
-extern char datatoc_gpu_shader_depth_only_frag_glsl[];
-extern char datatoc_gpu_shader_uniform_color_frag_glsl[];
-extern char datatoc_gpu_shader_checker_frag_glsl[];
-extern char datatoc_gpu_shader_diag_stripes_frag_glsl[];
-extern char datatoc_gpu_shader_simple_lighting_frag_glsl[];
-extern char datatoc_gpu_shader_flat_color_frag_glsl[];
-extern char datatoc_gpu_shader_flat_color_alpha_test_0_frag_glsl[];
-extern char datatoc_gpu_shader_flat_id_frag_glsl[];
-extern char datatoc_gpu_shader_2D_area_borders_vert_glsl[];
-extern char datatoc_gpu_shader_2D_area_borders_frag_glsl[];
-extern char datatoc_gpu_shader_2D_vert_glsl[];
-extern char datatoc_gpu_shader_2D_flat_color_vert_glsl[];
-extern char datatoc_gpu_shader_2D_smooth_color_uniform_alpha_vert_glsl[];
-extern char datatoc_gpu_shader_2D_smooth_color_vert_glsl[];
-extern char datatoc_gpu_shader_2D_smooth_color_frag_glsl[];
-extern char datatoc_gpu_shader_2D_image_vert_glsl[];
-extern char datatoc_gpu_shader_2D_image_rect_vert_glsl[];
-extern char datatoc_gpu_shader_2D_image_multi_rect_vert_glsl[];
-extern char datatoc_gpu_shader_2D_widget_base_vert_glsl[];
-extern char datatoc_gpu_shader_2D_widget_base_frag_glsl[];
-extern char datatoc_gpu_shader_2D_widget_shadow_vert_glsl[];
-extern char datatoc_gpu_shader_2D_widget_shadow_frag_glsl[];
-extern char datatoc_gpu_shader_2D_nodelink_frag_glsl[];
-extern char datatoc_gpu_shader_2D_nodelink_vert_glsl[];
-
-extern char datatoc_gpu_shader_3D_image_vert_glsl[];
-extern char datatoc_gpu_shader_image_frag_glsl[];
-extern char datatoc_gpu_shader_image_overlays_merge_frag_glsl[];
-extern char datatoc_gpu_shader_image_overlays_stereo_merge_frag_glsl[];
-extern char datatoc_gpu_shader_image_color_frag_glsl[];
-extern char datatoc_gpu_shader_image_desaturate_frag_glsl[];
-extern char datatoc_gpu_shader_image_varying_color_frag_glsl[];
-extern char datatoc_gpu_shader_image_shuffle_color_frag_glsl[];
-extern char datatoc_gpu_shader_3D_vert_glsl[];
-extern char datatoc_gpu_shader_3D_normal_vert_glsl[];
-extern char datatoc_gpu_shader_3D_flat_color_vert_glsl[];
-extern char datatoc_gpu_shader_3D_polyline_frag_glsl[];
-extern char datatoc_gpu_shader_3D_polyline_geom_glsl[];
-extern char datatoc_gpu_shader_3D_polyline_vert_glsl[];
-extern char datatoc_gpu_shader_3D_smooth_color_vert_glsl[];
-extern char datatoc_gpu_shader_3D_smooth_color_frag_glsl[];
-extern char datatoc_gpu_shader_3D_passthrough_vert_glsl[];
-extern char datatoc_gpu_shader_3D_clipped_uniform_color_vert_glsl[];
-
-extern char datatoc_gpu_shader_instance_variying_size_variying_color_vert_glsl[];
-
-extern char datatoc_gpu_shader_point_uniform_color_frag_glsl[];
-extern char datatoc_gpu_shader_point_uniform_color_aa_frag_glsl[];
-extern char datatoc_gpu_shader_point_uniform_color_outline_aa_frag_glsl[];
-extern char datatoc_gpu_shader_point_varying_color_outline_aa_frag_glsl[];
-extern char datatoc_gpu_shader_point_varying_color_varying_outline_aa_frag_glsl[];
-extern char datatoc_gpu_shader_point_varying_color_frag_glsl[];
-extern char datatoc_gpu_shader_3D_point_fixed_size_varying_color_vert_glsl[];
-extern char datatoc_gpu_shader_3D_point_varying_size_vert_glsl[];
-extern char datatoc_gpu_shader_3D_point_varying_size_varying_color_vert_glsl[];
-extern char datatoc_gpu_shader_3D_point_uniform_size_aa_vert_glsl[];
-extern char datatoc_gpu_shader_3D_point_uniform_size_outline_aa_vert_glsl[];
-extern char datatoc_gpu_shader_2D_point_varying_size_varying_color_vert_glsl[];
-extern char datatoc_gpu_shader_2D_point_uniform_size_aa_vert_glsl[];
-extern char datatoc_gpu_shader_2D_point_uniform_size_outline_aa_vert_glsl[];
-extern char datatoc_gpu_shader_2D_point_uniform_size_varying_color_outline_aa_vert_glsl[];
-
-extern char datatoc_gpu_shader_2D_edituvs_points_vert_glsl[];
-extern char datatoc_gpu_shader_2D_edituvs_facedots_vert_glsl[];
-extern char datatoc_gpu_shader_2D_edituvs_edges_vert_glsl[];
-extern char datatoc_gpu_shader_2D_edituvs_edges_frag_glsl[];
-extern char datatoc_gpu_shader_2D_edituvs_faces_vert_glsl[];
-extern char datatoc_gpu_shader_2D_edituvs_stretch_vert_glsl[];
-
-extern char datatoc_gpu_shader_2D_line_dashed_uniform_color_vert_glsl[];
-extern char datatoc_gpu_shader_2D_line_dashed_frag_glsl[];
-extern char datatoc_gpu_shader_3D_line_dashed_uniform_color_vert_glsl[];
-
-extern char datatoc_gpu_shader_text_vert_glsl[];
-extern char datatoc_gpu_shader_text_frag_glsl[];
-extern char datatoc_gpu_shader_keyframe_diamond_vert_glsl[];
-extern char datatoc_gpu_shader_keyframe_diamond_frag_glsl[];
-
-extern char datatoc_gpu_shader_gpencil_stroke_vert_glsl[];
-extern char datatoc_gpu_shader_gpencil_stroke_frag_glsl[];
-extern char datatoc_gpu_shader_gpencil_stroke_geom_glsl[];
-
-extern char datatoc_gpu_shader_gpencil_fill_vert_glsl[];
-extern char datatoc_gpu_shader_gpencil_fill_frag_glsl[];
-extern char datatoc_gpu_shader_cfg_world_clip_lib_glsl[];
-
-extern char datatoc_gpu_shader_colorspace_lib_glsl[];
-
-const struct GPUShaderConfigData GPU_shader_cfg_data[GPU_SHADER_CFG_LEN] = {
- [GPU_SHADER_CFG_DEFAULT] =
- {
- .lib = "",
- .def = "#define blender_srgb_to_framebuffer_space(a) a\n",
- },
- [GPU_SHADER_CFG_CLIPPED] =
- {
- .lib = datatoc_gpu_shader_cfg_world_clip_lib_glsl,
- .def = "#define USE_WORLD_CLIP_PLANES\n"
- "#define blender_srgb_to_framebuffer_space(a) a\n",
- },
-};
-
-/* cache of built-in shaders (each is created on first use) */
-static GPUShader *builtin_shaders[GPU_SHADER_CFG_LEN][GPU_SHADER_BUILTIN_LEN] = {{NULL}};
-static int g_shader_builtin_srgb_transform = 0;
-
#ifndef NDEBUG
static uint g_shaderid = 0;
#endif
-typedef struct {
- const char *vert;
- /** Optional. */
- const char *geom;
- const char *frag;
- /** Optional. */
- const char *defs;
-} GPUShaderStages;
+/* -------------------------------------------------------------------- */
+/** \name Convenience functions
+ * \{ */
static void shader_print_errors(const char *task, const char *log, const char **code, int totcode)
{
@@ -281,6 +171,59 @@ static void gpu_shader_standard_defines(char defines[MAX_DEFINE_LENGTH])
}
}
+#define DEBUG_SHADER_NONE ""
+#define DEBUG_SHADER_VERTEX "vert"
+#define DEBUG_SHADER_FRAGMENT "frag"
+#define DEBUG_SHADER_GEOMETRY "geom"
+
+/**
+ * Dump GLSL shaders to disk
+ *
+ * This is used for profiling shader performance externally and debug if shader code is correct.
+ * If called with no code, it simply bumps the shader index, so different shaders for the same
+ * program share the same index.
+ */
+static void gpu_dump_shaders(const char **code, const int num_shaders, const char *extension)
+{
+ if ((G.debug & G_DEBUG_GPU_SHADERS) == 0) {
+ return;
+ }
+
+ /* We use the same shader index for shaders in the same program.
+ * So we call this function once before calling for the individual shaders. */
+ static int shader_index = 0;
+ if (code == NULL) {
+ shader_index++;
+ BLI_assert(STREQ(DEBUG_SHADER_NONE, extension));
+ return;
+ }
+
+ /* Determine the full path of the new shader. */
+ char shader_path[FILE_MAX];
+
+ char file_name[512] = {'\0'};
+ sprintf(file_name, "%04d.%s", shader_index, extension);
+
+ BLI_join_dirfile(shader_path, sizeof(shader_path), BKE_tempdir_session(), file_name);
+
+ /* Write shader to disk. */
+ FILE *f = fopen(shader_path, "w");
+ if (f == NULL) {
+ printf("Error writing to file: %s\n", shader_path);
+ }
+ for (int j = 0; j < num_shaders; j++) {
+ fprintf(f, "%s", code[j]);
+ }
+ fclose(f);
+ printf("Shader file written to disk: %s\n", shader_path);
+}
+
+/** \} */
+
+/* -------------------------------------------------------------------- */
+/** \name Creation / Destruction
+ * \{ */
+
GPUShader *GPU_shader_create(const char *vertexcode,
const char *fragcode,
const char *geocode,
@@ -329,7 +272,7 @@ GPUShader *GPU_shader_load_from_binary(const char *binary,
if (success) {
glUseProgram(program);
- GPUShader *shader = MEM_callocN(sizeof(*shader), __func__);
+ GPUShader *shader = (GPUShader *)MEM_callocN(sizeof(*shader), __func__);
shader->interface = GPU_shaderinterface_create(program);
shader->program = program;
@@ -346,53 +289,6 @@ GPUShader *GPU_shader_load_from_binary(const char *binary,
return NULL;
}
-#define DEBUG_SHADER_NONE ""
-#define DEBUG_SHADER_VERTEX "vert"
-#define DEBUG_SHADER_FRAGMENT "frag"
-#define DEBUG_SHADER_GEOMETRY "geom"
-
-/**
- * Dump GLSL shaders to disk
- *
- * This is used for profiling shader performance externally and debug if shader code is correct.
- * If called with no code, it simply bumps the shader index, so different shaders for the same
- * program share the same index.
- */
-static void gpu_dump_shaders(const char **code, const int num_shaders, const char *extension)
-{
- if ((G.debug & G_DEBUG_GPU_SHADERS) == 0) {
- return;
- }
-
- /* We use the same shader index for shaders in the same program.
- * So we call this function once before calling for the individual shaders. */
- static int shader_index = 0;
@@ Diff output truncated at 10240 characters. @@
More information about the Bf-blender-cvs
mailing list