[Bf-blender-cvs] [19c793af35e] master: Metal: Make GLSL shader source MSL compliant also

Jason Fielder noreply at git.blender.org
Tue Mar 22 12:55:44 CET 2022


Commit: 19c793af35ea8e694c16995d115d7c9247fee81a
Author: Jason Fielder
Date:   Tue Mar 22 12:44:26 2022 +0100
Branches: master
https://developer.blender.org/rB19c793af35ea8e694c16995d115d7c9247fee81a

Metal: Make GLSL shader source MSL compliant also

Metal shading language follows the C++ 14 standard and in some cases requires a greater level of explicitness than GLSL. There are also some small language differences:

- Explicit type-casts (C++ requirements)
- Explicit constant values (C++ requirements, e.g. floating point values using 0.0 instead of 0).
- Metal/OpenGL compatibility paths
- GLSL Function prototypes
- Explicit accessors for vector types when sampling textures.

Authored by Apple: Michael Parkin-White

Ref T96261

Reviewed By: fclem

Maniphest Tasks: T96261

Differential Revision: https://developer.blender.org/D14378

===================================================================

M	source/blender/draw/engines/eevee/shaders/closure_eval_glossy_lib.glsl
M	source/blender/draw/engines/eevee/shaders/closure_type_lib.glsl
M	source/blender/draw/engines/eevee/shaders/effect_bloom_frag.glsl
M	source/blender/draw/engines/eevee/shaders/effect_dof_resolve_frag.glsl
M	source/blender/draw/engines/eevee/shaders/effect_dof_scatter_vert.glsl
M	source/blender/draw/engines/eevee/shaders/effect_dof_setup_frag.glsl
M	source/blender/draw/engines/eevee/shaders/effect_minmaxz_frag.glsl
M	source/blender/draw/engines/eevee/shaders/effect_reflection_trace_frag.glsl
M	source/blender/draw/engines/eevee/shaders/effect_velocity_tile_frag.glsl
M	source/blender/draw/engines/eevee/shaders/lightprobe_lib.glsl
M	source/blender/draw/engines/eevee/shaders/lightprobe_planar_downsample_frag.glsl
M	source/blender/draw/engines/eevee/shaders/volumetric_frag.glsl
M	source/blender/draw/engines/eevee/shaders/volumetric_integration_frag.glsl
M	source/blender/draw/engines/eevee/shaders/volumetric_scatter_frag.glsl
M	source/blender/draw/engines/overlay/shaders/background_frag.glsl
M	source/blender/draw/engines/overlay/shaders/outline_detect_frag.glsl
M	source/blender/draw/engines/overlay/shaders/volume_gridlines_vert.glsl
M	source/blender/draw/engines/workbench/shaders/workbench_effect_cavity_frag.glsl
M	source/blender/draw/engines/workbench/shaders/workbench_merge_infront_frag.glsl
M	source/blender/draw/engines/workbench/shaders/workbench_transparent_resolve_frag.glsl
M	source/blender/draw/engines/workbench/shaders/workbench_volume_frag.glsl
M	source/blender/draw/intern/shaders/common_hair_lib.glsl
M	source/blender/draw/intern/shaders/common_math_geom_lib.glsl
M	source/blender/draw/intern/shaders/common_math_lib.glsl
M	source/blender/draw/intern/shaders/common_view_lib.glsl
M	source/blender/gpu/CMakeLists.txt
M	source/blender/gpu/intern/gpu_shader.cc
M	source/blender/gpu/opengl/gl_shader.cc
M	source/blender/gpu/shaders/gpu_shader_2D_image_multi_rect_vert.glsl
M	source/blender/gpu/shaders/gpu_shader_2D_image_rect_vert.glsl
M	source/blender/gpu/shaders/gpu_shader_2D_widget_base_vert.glsl
M	source/blender/gpu/shaders/gpu_shader_image_overlays_merge_frag.glsl
M	source/blender/gpu/shaders/gpu_shader_keyframe_shape_vert.glsl
M	source/blender/gpu/shaders/gpu_shader_text_frag.glsl
M	source/blender/gpu/shaders/gpu_shader_text_vert.glsl
M	source/blender/gpu/shaders/material/gpu_shader_material_light_falloff.glsl
A	source/blender/gpu/shaders/opengl/glsl_shader_defines.glsl

===================================================================

diff --git a/source/blender/draw/engines/eevee/shaders/closure_eval_glossy_lib.glsl b/source/blender/draw/engines/eevee/shaders/closure_eval_glossy_lib.glsl
index 584aacc9e19..ddc6a0b9661 100644
--- a/source/blender/draw/engines/eevee/shaders/closure_eval_glossy_lib.glsl
+++ b/source/blender/draw/engines/eevee/shaders/closure_eval_glossy_lib.glsl
@@ -26,10 +26,13 @@ struct ClosureEvalGlossy {
 
 #ifdef STEP_RESOLVE /* SSR */
 /* Prototype. */
+#  ifndef GPU_METAL
+/* MSL does not require prototypes. */
 void raytrace_resolve(ClosureInputGlossy cl_in,
                       inout ClosureEvalGlossy cl_eval,
                       inout ClosureEvalCommon cl_common,
                       inout ClosureOutputGlossy cl_out);
+#  endif
 #endif
 
 ClosureEvalGlossy closure_Glossy_eval_init(inout ClosureInputGlossy cl_in,
diff --git a/source/blender/draw/engines/eevee/shaders/closure_type_lib.glsl b/source/blender/draw/engines/eevee/shaders/closure_type_lib.glsl
index f66f45635f4..fefc8743691 100644
--- a/source/blender/draw/engines/eevee/shaders/closure_type_lib.glsl
+++ b/source/blender/draw/engines/eevee/shaders/closure_type_lib.glsl
@@ -32,8 +32,10 @@ struct Closure {
 #endif
 };
 
+#ifndef GPU_METAL
 /* Prototype */
 Closure nodetree_exec(void);
+#endif
 
 /* clang-format off */
 /* Avoid multi-line defines. */
diff --git a/source/blender/draw/engines/eevee/shaders/effect_bloom_frag.glsl b/source/blender/draw/engines/eevee/shaders/effect_bloom_frag.glsl
index 9d9d7beb3cb..bdcc0a2ba93 100644
--- a/source/blender/draw/engines/eevee/shaders/effect_bloom_frag.glsl
+++ b/source/blender/draw/engines/eevee/shaders/effect_bloom_frag.glsl
@@ -150,7 +150,7 @@ vec4 step_blit(void)
   float br = max_v3(m);
 
   /* Under-threshold part: quadratic curve */
-  float rq = clamp(br - curveThreshold.x, 0, curveThreshold.y);
+  float rq = clamp(br - curveThreshold.x, 0.0, curveThreshold.y);
   rq = curveThreshold.z * rq * rq;
 
   /* Combine and apply the brightness response curve. */
diff --git a/source/blender/draw/engines/eevee/shaders/effect_dof_resolve_frag.glsl b/source/blender/draw/engines/eevee/shaders/effect_dof_resolve_frag.glsl
index 57027c71156..688ae4915e1 100644
--- a/source/blender/draw/engines/eevee/shaders/effect_dof_resolve_frag.glsl
+++ b/source/blender/draw/engines/eevee/shaders/effect_dof_resolve_frag.glsl
@@ -142,7 +142,7 @@ void dof_resolve_load_layer(sampler2D color_tex,
                             out float out_weight)
 {
   vec2 pixel_co = gl_FragCoord.xy / 2.0;
-  vec2 uv = pixel_co / textureSize(color_tex, 0).xy;
+  vec2 uv = pixel_co / vec2(textureSize(color_tex, 0).xy);
   out_color = textureLod(color_tex, uv, 0.0);
   out_weight = textureLod(weight_tex, uv, 0.0).r;
 }
diff --git a/source/blender/draw/engines/eevee/shaders/effect_dof_scatter_vert.glsl b/source/blender/draw/engines/eevee/shaders/effect_dof_scatter_vert.glsl
index b05223e755d..51a351babd3 100644
--- a/source/blender/draw/engines/eevee/shaders/effect_dof_scatter_vert.glsl
+++ b/source/blender/draw/engines/eevee/shaders/effect_dof_scatter_vert.glsl
@@ -95,7 +95,7 @@ void main()
 
   weights = dof_layer_weight(cocs) * dof_sample_weight(cocs);
   /* Filter NaNs. */
-  weights = mix(weights, vec4(0.0), equal(cocs, vec4(0.0)));
+  weights = select(weights, vec4(0.0), equal(cocs, vec4(0.0)));
 
   color1 = colors[0] * weights[0];
   color2 = colors[1] * weights[1];
diff --git a/source/blender/draw/engines/eevee/shaders/effect_dof_setup_frag.glsl b/source/blender/draw/engines/eevee/shaders/effect_dof_setup_frag.glsl
index 235145b221b..178ef46862b 100644
--- a/source/blender/draw/engines/eevee/shaders/effect_dof_setup_frag.glsl
+++ b/source/blender/draw/engines/eevee/shaders/effect_dof_setup_frag.glsl
@@ -54,12 +54,12 @@ void main()
   bvec4 focus = lessThanEqual(cocs, vec4(0.5));
   if (any(defocus) && any(focus)) {
     /* For the same reason as in the flatten pass. This is a case we cannot optimize for. */
-    cocs = mix(cocs, vec4(DOF_TILE_MIXED), focus);
-    cocs = mix(cocs, vec4(DOF_TILE_MIXED), defocus);
+    cocs = select(cocs, vec4(DOF_TILE_MIXED), focus);
+    cocs = select(cocs, vec4(DOF_TILE_MIXED), defocus);
   }
   else {
-    cocs = mix(cocs, vec4(DOF_TILE_FOCUS), focus);
-    cocs = mix(cocs, vec4(DOF_TILE_DEFOCUS), defocus);
+    cocs = select(cocs, vec4(DOF_TILE_FOCUS), focus);
+    cocs = select(cocs, vec4(DOF_TILE_DEFOCUS), defocus);
   }
   outCoc.y = max_v4(cocs);
 }
diff --git a/source/blender/draw/engines/eevee/shaders/effect_minmaxz_frag.glsl b/source/blender/draw/engines/eevee/shaders/effect_minmaxz_frag.glsl
index ce455123987..aaf673eecd2 100644
--- a/source/blender/draw/engines/eevee/shaders/effect_minmaxz_frag.glsl
+++ b/source/blender/draw/engines/eevee/shaders/effect_minmaxz_frag.glsl
@@ -38,7 +38,7 @@ uniform vec2 texelSize;
 
 /* On some AMD card / driver combination, it is needed otherwise,
  * the shader does not write anything. */
-#if defined(GPU_INTEL) || defined(GPU_ATI)
+#if (defined(GPU_INTEL) || defined(GPU_ATI)) && defined(GPU_OPENGL)
 out vec4 fragColor;
 #endif
 
@@ -68,9 +68,14 @@ void main()
   float val = minmax4(samp.x, samp.y, samp.z, samp.w);
 #endif
 
-#if defined(GPU_INTEL) || defined(GPU_ATI)
+#if (defined(GPU_INTEL) || defined(GPU_ATI)) && defined(GPU_OPENGL)
   /* Use color format instead of 24bit depth texture */
   fragColor = vec4(val);
 #endif
+
+#if !(defined(GPU_INTEL) && defined(GPU_OPENGL))
+  /* If using Intel workaround, do not write out depth as there will be no depth target and this is
+   * invalid. */
   gl_FragDepth = val;
+#endif
 }
diff --git a/source/blender/draw/engines/eevee/shaders/effect_reflection_trace_frag.glsl b/source/blender/draw/engines/eevee/shaders/effect_reflection_trace_frag.glsl
index f4ff28eaee4..c9010749060 100644
--- a/source/blender/draw/engines/eevee/shaders/effect_reflection_trace_frag.glsl
+++ b/source/blender/draw/engines/eevee/shaders/effect_reflection_trace_frag.glsl
@@ -60,11 +60,11 @@ void main()
   vec3 P = transform_point(ViewMatrixInverse, vP);
   vec3 vV = viewCameraVec(vP);
   vec3 V = cameraVec(P);
-  vec3 vN = normal_decode(texture(normalBuffer, uvs, 0).rg, vV);
+  vec3 vN = normal_decode(textureLod(normalBuffer, uvs, 0.0).rg, vV);
   vec3 N = transform_direction(ViewMatrixInverse, vN);
 
   /* Retrieve pixel data */
-  vec4 speccol_roughness = texture(specroughBuffer, uvs, 0).rgba;
+  vec4 speccol_roughness = textureLod(specroughBuffer, uvs, 0.0).rgba;
 
   /* Early out */
   if (dot(speccol_roughness.rgb, vec3(1.0)) == 0.0) {
diff --git a/source/blender/draw/engines/eevee/shaders/effect_velocity_tile_frag.glsl b/source/blender/draw/engines/eevee/shaders/effect_velocity_tile_frag.glsl
index 300477570d0..fc8091161d7 100644
--- a/source/blender/draw/engines/eevee/shaders/effect_velocity_tile_frag.glsl
+++ b/source/blender/draw/engines/eevee/shaders/effect_velocity_tile_frag.glsl
@@ -74,7 +74,7 @@ bool neighbor_affect_this_tile(ivec2 offset, vec2 velocity)
    * offset. If the offset coordinate is zero then
    * velocity is irrelevant.
    */
-  vec2 point = sign(offset * velocity);
+  vec2 point = sign(vec2(offset) * velocity);
 
   float dist = (point.x + point.y);
   /**
diff --git a/source/blender/draw/engines/eevee/shaders/lightprobe_lib.glsl b/source/blender/draw/engines/eevee/shaders/lightprobe_lib.glsl
index 84626eac4cf..e1035af37be 100644
--- a/source/blender/draw/engines/eevee/shaders/lightprobe_lib.glsl
+++ b/source/blender/draw/engines/eevee/shaders/lightprobe_lib.glsl
@@ -289,7 +289,7 @@ vec3 probe_evaluate_grid(GridData gd, vec3 P, vec3 N, vec3 localpos)
     weight += prbIrradianceSmooth;
 
     /* Trilinear weights */
-    vec3 trilinear = mix(1.0 - trilinear_weight, trilinear_weight, offset);
+    vec3 trilinear = mix(1.0 - trilinear_weight, trilinear_weight, vec3(offset));
     weight *= trilinear.x * trilinear.y * trilinear.z;
 
     /* Avoid zero weight */
diff --git a/source/blender/draw/engines/eevee/shaders/lightprobe_planar_downsample_frag.glsl b/source/blender/draw/engines/eevee/shaders/lightprobe_planar_downsample_frag.glsl
index cf44a04b707..5674e464f4c 100644
--- a/source/blender/draw/engines/eevee/shaders/lightprobe_planar_downsample_frag.glsl
+++ b/source/blender/draw/engines/eevee/shaders/lightprobe_planar_downsample_frag.glsl
@@ -16,11 +16,11 @@ void main()
 {
 #if 0
   /* Reconstructing Target uvs like this avoid missing pixels if NPO2 */
-  vec2 uvs = gl_FragCoord.xy * 2.0 / vec2(textureSize(source, 0));
+  vec2 uvs = gl_FragCoord.xy * 2.0 / vec2(textureSize(source, 0).xy);
 
   FragColor = textureLod(source, vec3(uvs, layer), 0.0);
 #else
-  vec2 texel_size = 1.0 / vec2(textureSize(source, 0));
+  vec2 texel_size = 1.0 / vec2(textureSize(source, 0).xy);
   vec2 uvs = gl_FragCoord.xy * 2.0 * texel_size;
   vec4 ofs = texel_size.xyxy * vec4(0.75, 0.75, -0.75, -0.75);
 
diff --git a/source/blender/draw/engines/eevee/shaders/volumetric_frag.glsl b/source/blender/draw/engines/eevee/shaders/volumetric_frag.glsl
index 25661a0d731..9f1afc4767c 100644
--- a/source/blender/draw/engines/eevee/shaders/volumetric_frag.glsl
+++ b/source/blender/draw/engines/eevee/shaders/volumetric_frag.glsl
@@ -31,7 +31,7 @@ layout(location = 3) out vec4 volumePhase;
 
 void main()
 {
-  ivec3 volume_cell = ivec3(gl_FragCoord.xy, slice);
+  ivec3 volume_cell = ivec3(ivec2(gl_FragCoord.xy), slice);
   vec3 ndc_cell = volume_to_ndc((vec3(volume_cell) + volJitter.xyz) * volInvTexSize.xyz);
 
   viewPosition = get_view_space_from_depth(ndc_cell.xy, ndc_cell.z);
diff --git a/source/blender/draw/engines/eevee/shaders/volumetric_integration_frag.glsl b/source/blender/draw/engines/eevee/shaders/volumetric_integration_frag.glsl
index 12b7d8acbea..11f57c0a82e 100644
--- a/source/blender/draw/engines/eevee/shaders/volumetric_integration_frag.glsl
+++ b/source/blender/draw/engines/eevee/shaders/volumetric_integration_frag.glsl
@@ -52,7 +52,7 @@ void main()
   ivec2 texco = ivec2(gl_FragCoord.xy);
 #endif
   for (int i = 0; i <= slice; i++) {
-    ivec3 volume_cell = ivec3(gl_FragCoord.xy, i);
+    ivec3 volume_cell = ivec3(ivec2(gl_FragCoord.xy), i);
 
     vec3 Lscat = texelFetch(volumeScattering, volume_cell, 0).rgb;
     vec3 s_extinction = texelFetch(volumeExtinction, volume_

@@ Diff output truncated at 10240 characters. @@



More information about the Bf-blender-cvs mailing list