[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