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-11-24 23:41:25 +0300
committerClément Foucault <foucault.clem@gmail.com>2021-11-24 23:41:25 +0300
commitf240ac1673302003bdec3e615bde950de2751f4f (patch)
treecc4fc29bf146d7bdadd41ad340b7372f6d9ca91a
parenta590474f4c8bee7321b8882e4dde9d46def53d22 (diff)
Improve formatinggpu-shader-descriptor
-rw-r--r--.clang-format4
-rw-r--r--source/blender/draw/engines/workbench/shaders/workbench_effect_cavity.desc.h45
-rw-r--r--source/blender/draw/engines/workbench/shaders/workbench_prepass.desc.h404
-rw-r--r--source/blender/draw/intern/shaders/draw_fullscreen.desc.h24
-rw-r--r--source/blender/draw/intern/shaders/draw_object_infos.desc.h21
-rw-r--r--source/blender/draw/intern/shaders/draw_view.desc.h24
-rw-r--r--source/blender/gpu/intern/gpu_shader_builder.c64
-rw-r--r--source/blender/gpu/intern/gpu_shader_descriptor.h12
-rw-r--r--source/blender/gpu/shaders/gpu_clip_planes.desc.h28
-rw-r--r--source/blender/gpu/shaders/gpu_shader_3D_flat_color.desc.h68
10 files changed, 359 insertions, 335 deletions
diff --git a/.clang-format b/.clang-format
index 41f828787b2..0359b6f7027 100644
--- a/.clang-format
+++ b/.clang-format
@@ -269,5 +269,9 @@ StatementMacros:
- PyObject_HEAD
- PyObject_VAR_HEAD
+StatementMacros:
+ - GPU_STAGE_INTERFACE_CREATE
+ - GPU_SHADER_DESCRIPTOR
+
MacroBlockBegin: "^BSDF_CLOSURE_CLASS_BEGIN$"
MacroBlockEnd: "^BSDF_CLOSURE_CLASS_END$"
diff --git a/source/blender/draw/engines/workbench/shaders/workbench_effect_cavity.desc.h b/source/blender/draw/engines/workbench/shaders/workbench_effect_cavity.desc.h
index ddc79f8edad..7fcc1c5308c 100644
--- a/source/blender/draw/engines/workbench/shaders/workbench_effect_cavity.desc.h
+++ b/source/blender/draw/engines/workbench/shaders/workbench_effect_cavity.desc.h
@@ -1,26 +1,25 @@
#include "gpu_shader_descriptor.h"
-GPU_SHADER_DESCRIPTOR(
- workbench_effect_cavity,
- {
- .do_static_compilation = true,
- .fragment_outputs =
- {
- [0] = FRAGMENT_OUTPUT(VEC4, "fragColor"),
- },
- .resources =
- {
- [DESCRIPTOR_SET_1] =
- {
- [0] = SAMPLER(FLOAT_2D, "depthBuffer", GPU_SAMPLER_DEFAULT),
- [1] = SAMPLER(FLOAT_2D, "normalBuffer", GPU_SAMPLER_DEFAULT),
- [2] = SAMPLER(UINT_2D, "objectIdBuffer", GPU_SAMPLER_DEFAULT),
- },
- },
- .fragment_source = "workbench_effect_cavity_frag.glsl",
- .additional_descriptors =
- {
- &draw_fullscreen,
- },
- })
+GPU_SHADER_DESCRIPTOR(workbench_effect_cavity)
+{
+ .do_static_compilation = true,
+ .fragment_outputs =
+ {
+ [0] = FRAGMENT_OUTPUT(VEC4, "fragColor"),
+ },
+ .resources =
+ {
+ [DESCRIPTOR_SET_1] =
+ {
+ [0] = SAMPLER(FLOAT_2D, "depthBuffer", GPU_SAMPLER_DEFAULT),
+ [1] = SAMPLER(FLOAT_2D, "normalBuffer", GPU_SAMPLER_DEFAULT),
+ [2] = SAMPLER(UINT_2D, "objectIdBuffer", GPU_SAMPLER_DEFAULT),
+ },
+ },
+ .fragment_source = "workbench_effect_cavity_frag.glsl",
+ .additional_descriptors =
+ {
+ "draw_fullscreen",
+ },
+};
diff --git a/source/blender/draw/engines/workbench/shaders/workbench_prepass.desc.h b/source/blender/draw/engines/workbench/shaders/workbench_prepass.desc.h
index 8b502944648..9b788d74ebb 100644
--- a/source/blender/draw/engines/workbench/shaders/workbench_prepass.desc.h
+++ b/source/blender/draw/engines/workbench/shaders/workbench_prepass.desc.h
@@ -5,54 +5,46 @@
/** \name Object Type
* \{ */
-GPU_SHADER_DESCRIPTOR(workbench_mesh,
- {
- .vertex_inputs =
- {
- [0] = VERTEX_INPUT(VEC3, "pos"),
- [1] = VERTEX_INPUT(VEC3, "nor"),
- [2] = VERTEX_INPUT(VEC4, "ac"),
- [3] = VERTEX_INPUT(VEC2, "au"),
- },
- .vertex_source = "workbench_prepass_vert.glsl",
- })
+GPU_SHADER_DESCRIPTOR(workbench_mesh)
+{
+ .vertex_inputs =
+ {
+ [0] = VERTEX_INPUT(VEC3, "pos"),
+ [1] = VERTEX_INPUT(VEC3, "nor"),
+ [2] = VERTEX_INPUT(VEC4, "ac"),
+ [3] = VERTEX_INPUT(VEC2, "au"),
+ },
+ .vertex_source = "workbench_prepass_vert.glsl",
+};
-GPU_SHADER_DESCRIPTOR(workbench_hair,
- {
- .vertex_source = "workbench_prepass_hair_vert.glsl",
- .resources =
- {
- [DESCRIPTOR_SET_0] =
- {
- [0] = SAMPLER(FLOAT_BUFFER, "ac", GPU_SAMPLER_DEFAULT),
- [1] = SAMPLER(FLOAT_BUFFER, "au", GPU_SAMPLER_DEFAULT),
- },
- },
- .additional_descriptors =
- {
- 0,
- /* TODO */
- // &draw_hair,
- },
- })
+GPU_SHADER_DESCRIPTOR(workbench_hair)
+{
+ .resources =
+ {
+ [DESCRIPTOR_SET_0] =
+ {
+ [0] = SAMPLER(FLOAT_BUFFER, "ac", GPU_SAMPLER_DEFAULT),
+ [1] = SAMPLER(FLOAT_BUFFER, "au", GPU_SAMPLER_DEFAULT),
+ },
+ },
+ .vertex_source = "workbench_prepass_hair_vert.glsl",
+ /* TODO */
+ // .additional_descriptors = { "draw_hair", },
+};
-GPU_SHADER_DESCRIPTOR(workbench_pointcloud,
- {
- .vertex_inputs =
- {
- [0] = VERTEX_INPUT(VEC4, "pos"),
- /* ---- Instanced attribs ---- */
- [1] = VERTEX_INPUT(VEC3, "pos_inst"),
- [2] = VERTEX_INPUT(VEC3, "nor"),
- },
- .vertex_source = "workbench_prepass_pointcloud_vert.glsl",
- .additional_descriptors =
- {
- 0,
- /* TODO */
- // &draw_pointcloud,
- },
- })
+GPU_SHADER_DESCRIPTOR(workbench_pointcloud)
+{
+ .vertex_inputs =
+ {
+ [0] = VERTEX_INPUT(VEC4, "pos"),
+ /* ---- Instanced attribs ---- */
+ [1] = VERTEX_INPUT(VEC3, "pos_inst"),
+ [2] = VERTEX_INPUT(VEC3, "nor"),
+ },
+ .vertex_source = "workbench_prepass_pointcloud_vert.glsl",
+ /* TODO */
+ // .additional_descriptors = { "draw_pointcloud", },
+};
/** \} */
@@ -60,52 +52,50 @@ GPU_SHADER_DESCRIPTOR(workbench_pointcloud,
/** \name Texture Type
* \{ */
-GPU_SHADER_DESCRIPTOR(workbench_texture_none,
- {
- .defines =
- {
- [0] = "#define TEXTURE_NONE\n",
- },
- })
+GPU_SHADER_DESCRIPTOR(workbench_texture_none)
+{
+ .defines =
+ {
+ [0] = "#define TEXTURE_NONE\n",
+ },
+};
-GPU_SHADER_DESCRIPTOR(
- workbench_texture_single,
- {
- .resources =
- {
- [DESCRIPTOR_SET_0] =
- {
- /* ---- Hair buffers ---- */
- // [0] = SAMPLER(FLOAT_BUFFER, "ac", GPU_SAMPLER_DEFAULT),
- // [1] = SAMPLER(FLOAT_BUFFER, "au", GPU_SAMPLER_DEFAULT),
- [2] = SAMPLER(FLOAT_2D, "imageTexture", GPU_SAMPLER_DEFAULT),
- },
- },
- .defines =
- {
- [0] = "#define V3D_SHADING_TEXTURE_COLOR\n",
- },
- })
+GPU_SHADER_DESCRIPTOR(workbench_texture_single)
+{
+ .resources =
+ {
+ [DESCRIPTOR_SET_0] =
+ {
+ /* ---- Hair buffers ---- */
+ // [0] = SAMPLER(FLOAT_BUFFER, "ac", GPU_SAMPLER_DEFAULT),
+ // [1] = SAMPLER(FLOAT_BUFFER, "au", GPU_SAMPLER_DEFAULT),
+ [2] = SAMPLER(FLOAT_2D, "imageTexture", GPU_SAMPLER_DEFAULT),
+ },
+ },
+ .defines =
+ {
+ [0] = "#define V3D_SHADING_TEXTURE_COLOR\n",
+ },
+};
-GPU_SHADER_DESCRIPTOR(
- workbench_texture_tile,
- {
- .resources =
- {
- [DESCRIPTOR_SET_0] =
- {
- /* ---- Hair buffers ---- */
- // [0] = SAMPLER(FLOAT_BUFFER, "ac", GPU_SAMPLER_DEFAULT),
- // [1] = SAMPLER(FLOAT_BUFFER, "au", GPU_SAMPLER_DEFAULT),
- [2] = SAMPLER(FLOAT_2D_ARRAY, "imageTileArray", GPU_SAMPLER_DEFAULT),
- [3] = SAMPLER(FLOAT_1D_ARRAY, "imageTileData", GPU_SAMPLER_DEFAULT),
- },
- },
- .defines =
- {
- [0] = "#define TEXTURE_IMAGE_ARRAY\n",
- },
- })
+GPU_SHADER_DESCRIPTOR(workbench_texture_tile)
+{
+ .resources =
+ {
+ [DESCRIPTOR_SET_0] =
+ {
+ /* ---- Hair buffers ---- */
+ // [0] = SAMPLER(FLOAT_BUFFER, "ac", GPU_SAMPLER_DEFAULT),
+ // [1] = SAMPLER(FLOAT_BUFFER, "au", GPU_SAMPLER_DEFAULT),
+ [2] = SAMPLER(FLOAT_2D_ARRAY, "imageTileArray", GPU_SAMPLER_DEFAULT),
+ [3] = SAMPLER(FLOAT_1D_ARRAY, "imageTileData", GPU_SAMPLER_DEFAULT),
+ },
+ },
+ .defines =
+ {
+ [0] = "#define TEXTURE_IMAGE_ARRAY\n",
+ },
+};
/** \} */
@@ -113,29 +103,29 @@ GPU_SHADER_DESCRIPTOR(
/** \name Lighting Type
* \{ */
-GPU_SHADER_DESCRIPTOR(workbench_lighting_studio,
- {
- .defines =
- {
- [1] = "#define V3D_LIGHTING_STUDIO\n",
- },
- })
+GPU_SHADER_DESCRIPTOR(workbench_lighting_studio)
+{
+ .defines =
+ {
+ [1] = "#define V3D_LIGHTING_STUDIO\n",
+ },
+};
-GPU_SHADER_DESCRIPTOR(workbench_lighting_matcap,
- {
- .defines =
- {
- [1] = "#define V3D_LIGHTING_MATCAP\n",
- },
- })
+GPU_SHADER_DESCRIPTOR(workbench_lighting_matcap)
+{
+ .defines =
+ {
+ [1] = "#define V3D_LIGHTING_MATCAP\n",
+ },
+};
-GPU_SHADER_DESCRIPTOR(workbench_lighting_flat,
- {
- .defines =
- {
- [1] = "#define V3D_LIGHTING_FLAT\n",
- },
- })
+GPU_SHADER_DESCRIPTOR(workbench_lighting_flat)
+{
+ .defines =
+ {
+ [1] = "#define V3D_LIGHTING_FLAT\n",
+ },
+};
/** \} */
@@ -143,28 +133,28 @@ GPU_SHADER_DESCRIPTOR(workbench_lighting_flat,
/** \name Material Interface
* \{ */
-GPU_STAGE_INTERFACE_CREATE(workbench_material_iface,
- {
- {VEC3, "normal_interp"},
- {VEC3, "color_interp"},
- {FLOAT, "alpha_interp"},
- {VEC2, "uv_interp"},
- {INT, "object_id", FLAT},
- {FLOAT, "roughness", FLAT},
- {FLOAT, "metallic", FLAT},
- })
+GPU_STAGE_INTERFACE_CREATE(workbench_material_iface)
+{
+ {VEC3, "normal_interp"},
+ {VEC3, "color_interp"},
+ {FLOAT, "alpha_interp"},
+ {VEC2, "uv_interp"},
+ {INT, "object_id", FLAT},
+ {FLOAT, "roughness", FLAT},
+ {FLOAT, "metallic", FLAT},
+};
-GPU_SHADER_DESCRIPTOR(workbench_material,
- {
- .vertex_out_interfaces =
- {
- [0] = STAGE_INTERFACE("", workbench_material_iface),
- },
- .additional_descriptors =
- {
- &draw_view,
- },
- })
+GPU_SHADER_DESCRIPTOR(workbench_material)
+{
+ .vertex_out_interfaces =
+ {
+ [0] = STAGE_INTERFACE("", workbench_material_iface),
+ },
+ .additional_descriptors =
+ {
+ "draw_view",
+ },
+};
/** \} */
@@ -172,46 +162,48 @@ GPU_SHADER_DESCRIPTOR(workbench_material,
/** \name Pipeline Type
* \{ */
-GPU_SHADER_DESCRIPTOR(workbench_transparent_accum,
- {
- .fragment_outputs =
- {
- /* Note: Blending will be skipped on objectId because output is a
- non-normalized integer buffer. */
- [0] = FRAGMENT_OUTPUT(VEC4, "transparentAccum"),
- [1] = FRAGMENT_OUTPUT(VEC4, "revealageAccum"),
- [2] = FRAGMENT_OUTPUT(UINT, "objectId"),
- },
- .fragment_source = "workbench_effect_cavity_frag.glsl",
- .additional_descriptors =
- {
- &workbench_material,
- },
- })
+GPU_SHADER_DESCRIPTOR(workbench_transparent_accum)
+{
-GPU_SHADER_DESCRIPTOR(workbench_opaque,
- {
- .fragment_outputs =
- {
- /* Note: Blending will be skipped on objectId because output is a
- non-normalized integer buffer. */
- [0] = FRAGMENT_OUTPUT(VEC4, "materialData"),
- [1] = FRAGMENT_OUTPUT(VEC2, "normalData"),
- [2] = FRAGMENT_OUTPUT(UINT, "objectId"),
- },
- .resources =
- {
- [DESCRIPTOR_SET_0] =
- {
- [4] = UNIFORM_BUFFER("WB_Scene", "scene"),
- },
- },
- .fragment_source = "workbench_effect_cavity_frag.glsl",
- .additional_descriptors =
- {
- &workbench_material,
- },
- })
+ .fragment_outputs =
+ {
+ /* Note: Blending will be skipped on objectId because output is a
+ non-normalized integer buffer. */
+ [0] = FRAGMENT_OUTPUT(VEC4, "transparentAccum"),
+ [1] = FRAGMENT_OUTPUT(VEC4, "revealageAccum"),
+ [2] = FRAGMENT_OUTPUT(UINT, "objectId"),
+ },
+ .fragment_source = "workbench_effect_cavity_frag.glsl",
+ .additional_descriptors =
+ {
+ "workbench_material",
+ },
+};
+
+GPU_SHADER_DESCRIPTOR(workbench_opaque)
+{
+
+ .fragment_outputs =
+ {
+ /* Note: Blending will be skipped on objectId because output is a
+ non-normalized integer buffer. */
+ [0] = FRAGMENT_OUTPUT(VEC4, "materialData"),
+ [1] = FRAGMENT_OUTPUT(VEC2, "normalData"),
+ [2] = FRAGMENT_OUTPUT(UINT, "objectId"),
+ },
+ .resources =
+ {
+ [DESCRIPTOR_SET_0] =
+ {
+ [4] = UNIFORM_BUFFER("WB_Scene", "scene"),
+ },
+ },
+ .fragment_source = "workbench_effect_cavity_frag.glsl",
+ .additional_descriptors =
+ {
+ "workbench_material",
+ },
+};
/** \} */
@@ -220,46 +212,48 @@ GPU_SHADER_DESCRIPTOR(workbench_opaque,
* \{ */
#define WORKBENCH_SURFACETYPE_VARIATIONS(prefix, ...) \
- GPU_SHADER_DESCRIPTOR(prefix##_mesh, \
- { \
- .additional_descriptors = \
- { \
- &workbench_mesh, \
- __VA_ARGS__, \
- }, \
- }) \
- GPU_SHADER_DESCRIPTOR(prefix##_hair, \
- { \
- .additional_descriptors = \
- { \
- &workbench_hair, \
- __VA_ARGS__, \
- }, \
- }) \
- GPU_SHADER_DESCRIPTOR(prefix##_pointcloud, \
- { \
- .additional_descriptors = \
- { \
- &workbench_pointcloud, \
- __VA_ARGS__, \
- }, \
- })
+ GPU_SHADER_DESCRIPTOR(prefix##_mesh) \
+ { \
+ .additional_descriptors = \
+ { \
+ "workbench_mesh", \
+ __VA_ARGS__, \
+ }, \
+ }; \
+ GPU_SHADER_DESCRIPTOR(prefix##_hair) \
+ { \
+ .additional_descriptors = \
+ { \
+ "workbench_hair", \
+ __VA_ARGS__, \
+ }, \
+ }; \
+ GPU_SHADER_DESCRIPTOR(prefix##_ptcloud) \
+ { \
+ .additional_descriptors = \
+ { \
+ "workbench_pointcloud", \
+ __VA_ARGS__, \
+ }, \
+ };
#define WORKBENCH_PIPELINE_VARIATIONS(prefix, ...) \
WORKBENCH_SURFACETYPE_VARIATIONS(prefix##_transp_studio, \
- &workbench_transparent_accum, \
- &workbench_lighting_studio, \
+ "workbench_transparent_accum", \
+ "workbench_lighting_studio", \
__VA_ARGS__) \
WORKBENCH_SURFACETYPE_VARIATIONS(prefix##_transp_matcap, \
- &workbench_transparent_accum, \
- &workbench_lighting_matcap, \
+ "workbench_transparent_accum", \
+ "workbench_lighting_matcap", \
+ __VA_ARGS__) \
+ WORKBENCH_SURFACETYPE_VARIATIONS(prefix##_transp_flat, \
+ "workbench_transparent_accum", \
+ "workbench_lighting_flat", \
__VA_ARGS__) \
- WORKBENCH_SURFACETYPE_VARIATIONS( \
- prefix##_transp_flat, &workbench_transparent_accum, &workbench_lighting_flat, __VA_ARGS__) \
- WORKBENCH_SURFACETYPE_VARIATIONS(prefix##_opaque, &workbench_opaque, __VA_ARGS__)
+ WORKBENCH_SURFACETYPE_VARIATIONS(prefix##_opaque, "workbench_opaque", __VA_ARGS__)
-WORKBENCH_PIPELINE_VARIATIONS(workbench_tex_none, &workbench_texture_none)
-WORKBENCH_PIPELINE_VARIATIONS(workbench_tex_single, &workbench_texture_single)
-WORKBENCH_PIPELINE_VARIATIONS(workbench_tex_tile, &workbench_texture_tile)
+WORKBENCH_PIPELINE_VARIATIONS(workbench_tex_none, "workbench_texture_none")
+WORKBENCH_PIPELINE_VARIATIONS(workbench_tex_single, "workbench_texture_single")
+WORKBENCH_PIPELINE_VARIATIONS(workbench_tex_tile, "workbench_texture_tile")
/** \} */
diff --git a/source/blender/draw/intern/shaders/draw_fullscreen.desc.h b/source/blender/draw/intern/shaders/draw_fullscreen.desc.h
index f01496ecf49..06a7243542c 100644
--- a/source/blender/draw/intern/shaders/draw_fullscreen.desc.h
+++ b/source/blender/draw/intern/shaders/draw_fullscreen.desc.h
@@ -1,16 +1,16 @@
#include "gpu_shader_descriptor.h"
-GPU_STAGE_INTERFACE_CREATE(fullscreen_iface,
- {
- {VEC4, "uvcoordsvar"},
- })
+GPU_STAGE_INTERFACE_CREATE(fullscreen_iface)
+{
+ {VEC4, "uvcoordsvar"},
+};
-GPU_SHADER_DESCRIPTOR(draw_fullscreen,
- {
- .vertex_out_interfaces =
- {
- [0] = STAGE_INTERFACE("", fullscreen_iface),
- },
- .vertex_source = "common_fullscreen_vert.glsl",
- })
+GPU_SHADER_DESCRIPTOR(draw_fullscreen)
+{
+ .vertex_out_interfaces =
+ {
+ [0] = STAGE_INTERFACE("", fullscreen_iface),
+ },
+ .vertex_source = "common_fullscreen_vert.glsl",
+};
diff --git a/source/blender/draw/intern/shaders/draw_object_infos.desc.h b/source/blender/draw/intern/shaders/draw_object_infos.desc.h
index 03a68cf6363..038d96011b7 100644
--- a/source/blender/draw/intern/shaders/draw_object_infos.desc.h
+++ b/source/blender/draw/intern/shaders/draw_object_infos.desc.h
@@ -1,14 +1,13 @@
#include "gpu_shader_descriptor.h"
-GPU_SHADER_DESCRIPTOR(
- draw_object_infos,
- {
- .resources =
- {
- [DESCRIPTOR_SET_1] =
- {
- [2] = UNIFORM_BUFFER("ObjectInfos", "drw_infos[DRW_RESOURCE_CHUNK_LEN]"),
- },
- },
- })
+GPU_SHADER_DESCRIPTOR(draw_object_infos)
+{
+ .resources =
+ {
+ [DESCRIPTOR_SET_1] =
+ {
+ [2] = UNIFORM_BUFFER("ObjectInfos", "drw_infos[DRW_RESOURCE_CHUNK_LEN]"),
+ },
+ },
+};
diff --git a/source/blender/draw/intern/shaders/draw_view.desc.h b/source/blender/draw/intern/shaders/draw_view.desc.h
index ca9b5d8ec0f..2310812830c 100644
--- a/source/blender/draw/intern/shaders/draw_view.desc.h
+++ b/source/blender/draw/intern/shaders/draw_view.desc.h
@@ -1,16 +1,14 @@
#include "gpu_shader_descriptor.h"
-GPU_SHADER_DESCRIPTOR(
- draw_view,
- {
- .resources =
- {
- [DESCRIPTOR_SET_1] =
- {
- [0] = UNIFORM_BUFFER("ViewInfos", "drw_view"),
- [1] = UNIFORM_BUFFER("ObjectMatrices",
- "drw_matrices[DRW_RESOURCE_CHUNK_LEN]"),
- },
- },
- })
+GPU_SHADER_DESCRIPTOR(draw_view)
+{
+ .resources =
+ {
+ [DESCRIPTOR_SET_1] =
+ {
+ [0] = UNIFORM_BUFFER("ViewInfos", "drw_view"),
+ [1] = UNIFORM_BUFFER("ObjectMatrices", "drw_matrices[DRW_RESOURCE_CHUNK_LEN]"),
+ },
+ },
+};
diff --git a/source/blender/gpu/intern/gpu_shader_builder.c b/source/blender/gpu/intern/gpu_shader_builder.c
index 7c1ba12178c..31298758ea8 100644
--- a/source/blender/gpu/intern/gpu_shader_builder.c
+++ b/source/blender/gpu/intern/gpu_shader_builder.c
@@ -34,8 +34,23 @@
#undef GPU_STAGE_INTERFACE_CREATE
#undef GPU_SHADER_DESCRIPTOR
+static const GPUShaderDescriptor *find_descriptor_by_name(const GPUShaderDescriptor **descriptors,
+ const char *name)
+{
+ const GPUShaderDescriptor **result = descriptors;
+ while (*result) {
+ if (strcmp((*result)->name, name) == 0) {
+ return *result;
+ }
+ result++;
+ }
+ return NULL;
+}
+
/* Return 0 on success. (Recursive). */
-static bool descriptor_flatten(const GPUShaderDescriptor *input, GPUShaderDescriptor *output)
+static bool descriptor_flatten(const GPUShaderDescriptor **descriptors,
+ const GPUShaderDescriptor *input,
+ GPUShaderDescriptor *output)
{
int errors = 0;
@@ -192,7 +207,17 @@ static bool descriptor_flatten(const GPUShaderDescriptor *input, GPUShaderDescri
for (int i = 0; i < ARRAY_SIZE(input->additional_descriptors); i++) {
if (input->additional_descriptors[i]) {
- errors += descriptor_flatten(input->additional_descriptors[i], output);
+ const GPUShaderDescriptor *deps = find_descriptor_by_name(descriptors,
+ input->additional_descriptors[i]);
+ if (deps) {
+ errors += descriptor_flatten(descriptors, deps, output);
+ }
+ else {
+ printf("Error: %s : Could not find dependency %s.\n",
+ input->name,
+ input->additional_descriptors[i]);
+ errors++;
+ }
}
}
return errors;
@@ -418,32 +443,39 @@ int main(int argc, char const *argv[])
}
size_t descriptors_len = 0;
-/* Count number of descriptors. */
-#define GPU_STAGE_INTERFACE_CREATE(_interface, ...)
-#define GPU_SHADER_DESCRIPTOR(_descriptor, ...) descriptors_len++;
+/* Count number of descriptors. Define interfaces. */
+#define GPU_STAGE_INTERFACE_CREATE(_interface) GPUInOut _interface[] =
+#define GPU_SHADER_DESCRIPTOR(_descriptor) \
+ descriptors_len++; \
+ (void)(GPUShaderDescriptor)
#include "gpu_shader_descriptor_list.h"
#undef GPU_STAGE_INTERFACE_CREATE
#undef GPU_SHADER_DESCRIPTOR
+/* Discard interfaces then. */
+#define GPU_STAGE_INTERFACE_CREATE(_interface) (void)(GPUInOut[])
- GPUShaderDescriptor **descriptors = calloc(descriptors_len, sizeof(void *));
+ /* Null ended array. */
+ GPUShaderDescriptor **descriptors = calloc(descriptors_len + 1, sizeof(void *));
size_t index = 0;
/* Declare everything first to be able to avoid dependency for references. */
-#define GPU_STAGE_INTERFACE_CREATE(_interface, ...) GPUInOut _interface[] = __VA_ARGS__;
-#define GPU_SHADER_DESCRIPTOR(_descriptor, ...) \
+#define GPU_SHADER_DESCRIPTOR(_descriptor) \
GPUShaderDescriptor _descriptor; \
- descriptors[index++] = &_descriptor;
+ descriptors[index++] = &_descriptor; \
+ (void)(GPUShaderDescriptor)
#include "gpu_shader_descriptor_list.h"
-#undef GPU_STAGE_INTERFACE_CREATE
#undef GPU_SHADER_DESCRIPTOR
/* Set values. */
-#define GPU_STAGE_INTERFACE_CREATE(_interface, ...)
-#define GPU_SHADER_DESCRIPTOR(_descriptor, ...) \
- _descriptor = (GPUShaderDescriptor)__VA_ARGS__; \
- _descriptor.name = #_descriptor;
+#define GPU_SHADER_DESCRIPTOR(_descriptor) _descriptor = (GPUShaderDescriptor)
+#include "gpu_shader_descriptor_list.h"
+#undef GPU_SHADER_DESCRIPTOR
+
+/* Set name. */
+#define GPU_SHADER_DESCRIPTOR(_descriptor) \
+ _descriptor.name = #_descriptor; \
+ (void)(GPUShaderDescriptor)
#include "gpu_shader_descriptor_list.h"
-#undef GPU_STAGE_INTERFACE_CREATE
#undef GPU_SHADER_DESCRIPTOR
FILE *fp = fopen(argv[1], "w");
@@ -460,7 +492,7 @@ int main(int argc, char const *argv[])
GPUShaderDescriptor flattened_descriptor = {0};
- int errors = descriptor_flatten(descriptor, &flattened_descriptor);
+ int errors = descriptor_flatten(descriptors, descriptor, &flattened_descriptor);
if (errors != 0) {
result = 1;
continue;
diff --git a/source/blender/gpu/intern/gpu_shader_descriptor.h b/source/blender/gpu/intern/gpu_shader_descriptor.h
index 09e1b52fefe..a937a0cf2af 100644
--- a/source/blender/gpu/intern/gpu_shader_descriptor.h
+++ b/source/blender/gpu/intern/gpu_shader_descriptor.h
@@ -24,18 +24,16 @@
*
* Some rule of thumb:
* - Do not include anything else than this file in each descriptor file.
- * - You can assume all descriptors will be defined and you can reference any of them in
- * additional_descriptors.
*/
#pragma once
#include <stdbool.h>
-/* For helping code suggestion. */
+/* For helping intellisense. */
#ifndef GPU_SHADER_DESCRIPTOR
-# define GPU_STAGE_INTERFACE_CREATE(_interface, ...) GPUInOut _interface[] = __VA_ARGS__;
-# define GPU_SHADER_DESCRIPTOR(_descriptor, ...) GPUShaderDescriptor _descriptor = __VA_ARGS__;
+# define GPU_STAGE_INTERFACE_CREATE(_interface) GPUInOut _interface[] =
+# define GPU_SHADER_DESCRIPTOR(_descriptor) GPUShaderDescriptor _descriptor =
#endif
#ifndef ARRAY_SIZE
@@ -238,8 +236,8 @@ typedef struct GPUShaderDescriptor {
const char *defines[8];
/**
- * Link to other descriptors to recursively merge with this one.
+ * Name of other descriptors to recursively merge with this one.
* No data slot must overlap otherwise we throw an error.
*/
- struct GPUShaderDescriptor *additional_descriptors[4];
+ const char *additional_descriptors[4];
} GPUShaderDescriptor;
diff --git a/source/blender/gpu/shaders/gpu_clip_planes.desc.h b/source/blender/gpu/shaders/gpu_clip_planes.desc.h
index 0956745b0e3..c14a1a26177 100644
--- a/source/blender/gpu/shaders/gpu_clip_planes.desc.h
+++ b/source/blender/gpu/shaders/gpu_clip_planes.desc.h
@@ -1,17 +1,17 @@
#include "gpu_shader_descriptor.h"
-GPU_SHADER_DESCRIPTOR(gpu_clip_planes,
- {
- .resources =
- {
- [DESCRIPTOR_SET_0] =
- {
- [1] = UNIFORM_BUFFER("GPUClipPlanes", "clipPlanes"),
- },
- },
- .defines =
- {
- [5] = "#define USE_WORLD_CLIP_PLANES\n",
- },
- })
+GPU_SHADER_DESCRIPTOR(gpu_clip_planes)
+{
+ .resources =
+ {
+ [DESCRIPTOR_SET_0] =
+ {
+ [1] = UNIFORM_BUFFER("GPUClipPlanes", "clipPlanes"),
+ },
+ },
+ .defines =
+ {
+ [5] = "#define USE_WORLD_CLIP_PLANES\n",
+ },
+};
diff --git a/source/blender/gpu/shaders/gpu_shader_3D_flat_color.desc.h b/source/blender/gpu/shaders/gpu_shader_3D_flat_color.desc.h
index 16eeeec204c..cbdf96bb7d3 100644
--- a/source/blender/gpu/shaders/gpu_shader_3D_flat_color.desc.h
+++ b/source/blender/gpu/shaders/gpu_shader_3D_flat_color.desc.h
@@ -1,39 +1,39 @@
#include "gpu_shader_descriptor.h"
-GPU_STAGE_INTERFACE_CREATE(flat_color_iface,
- {
- {VEC4, "finalColor", FLAT},
- })
+GPU_STAGE_INTERFACE_CREATE(flat_color_iface)
+{
+ {VEC4, "finalColor", FLAT},
+};
-GPU_SHADER_DESCRIPTOR(gpu_shader_3D_flat_color,
- {
- .vertex_inputs =
- {
- [0] = VERTEX_INPUT(VEC3, "pos"),
- [1] = VERTEX_INPUT(VEC4, "col"),
- },
- .vertex_out_interfaces =
- {
- [0] = STAGE_INTERFACE("", flat_color_iface),
- },
- .fragment_outputs =
- {
- [0] = FRAGMENT_OUTPUT(VEC4, "fragColor"),
- },
- .push_constants =
- {
- [1] = PUSH_CONSTANT(BOOL, "srgbTarget"),
- },
- .vertex_source = "gpu_shader_3D_flat_color_vert.glsl",
- .fragment_source = "gpu_shader_flat_color_frag.glsl",
- })
+GPU_SHADER_DESCRIPTOR(gpu_shader_3D_flat_color)
+{
+ .vertex_inputs =
+ {
+ [0] = VERTEX_INPUT(VEC3, "pos"),
+ [1] = VERTEX_INPUT(VEC4, "col"),
+ },
+ .vertex_out_interfaces =
+ {
+ [0] = STAGE_INTERFACE("", flat_color_iface),
+ },
+ .fragment_outputs =
+ {
+ [0] = FRAGMENT_OUTPUT(VEC4, "fragColor"),
+ },
+ .push_constants =
+ {
+ [1] = PUSH_CONSTANT(BOOL, "srgbTarget"),
+ },
+ .vertex_source = "gpu_shader_3D_flat_color_vert.glsl",
+ .fragment_source = "gpu_shader_flat_color_frag.glsl",
+};
-GPU_SHADER_DESCRIPTOR(gpu_shader_3D_flat_color_clipped,
- {
- .additional_descriptors =
- {
- &gpu_shader_3D_flat_color,
- &gpu_clip_planes,
- },
- })
+GPU_SHADER_DESCRIPTOR(gpu_shader_3D_flat_color_clipped)
+{
+ .additional_descriptors =
+ {
+ "gpu_shader_3D_flat_color",
+ "gpu_clip_planes",
+ },
+};