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:
authorJason Fielder <jason_apple>2022-03-22 14:44:26 +0300
committerClément Foucault <foucault.clem@gmail.com>2022-03-22 14:54:44 +0300
commit19c793af35ea8e694c16995d115d7c9247fee81a (patch)
treec24ad1eead6cb91cbc6260a10e8cf13dc13db903 /source/blender/draw/engines
parent309ea314858a9b7892ea2c8a6fe55ab2a1028697 (diff)
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
Diffstat (limited to 'source/blender/draw/engines')
-rw-r--r--source/blender/draw/engines/eevee/shaders/closure_eval_glossy_lib.glsl3
-rw-r--r--source/blender/draw/engines/eevee/shaders/closure_type_lib.glsl2
-rw-r--r--source/blender/draw/engines/eevee/shaders/effect_bloom_frag.glsl2
-rw-r--r--source/blender/draw/engines/eevee/shaders/effect_dof_resolve_frag.glsl2
-rw-r--r--source/blender/draw/engines/eevee/shaders/effect_dof_scatter_vert.glsl2
-rw-r--r--source/blender/draw/engines/eevee/shaders/effect_dof_setup_frag.glsl8
-rw-r--r--source/blender/draw/engines/eevee/shaders/effect_minmaxz_frag.glsl9
-rw-r--r--source/blender/draw/engines/eevee/shaders/effect_reflection_trace_frag.glsl4
-rw-r--r--source/blender/draw/engines/eevee/shaders/effect_velocity_tile_frag.glsl2
-rw-r--r--source/blender/draw/engines/eevee/shaders/lightprobe_lib.glsl2
-rw-r--r--source/blender/draw/engines/eevee/shaders/lightprobe_planar_downsample_frag.glsl4
-rw-r--r--source/blender/draw/engines/eevee/shaders/volumetric_frag.glsl2
-rw-r--r--source/blender/draw/engines/eevee/shaders/volumetric_integration_frag.glsl2
-rw-r--r--source/blender/draw/engines/eevee/shaders/volumetric_scatter_frag.glsl2
-rw-r--r--source/blender/draw/engines/overlay/shaders/background_frag.glsl4
-rw-r--r--source/blender/draw/engines/overlay/shaders/outline_detect_frag.glsl2
-rw-r--r--source/blender/draw/engines/overlay/shaders/volume_gridlines_vert.glsl2
-rw-r--r--source/blender/draw/engines/workbench/shaders/workbench_effect_cavity_frag.glsl4
-rw-r--r--source/blender/draw/engines/workbench/shaders/workbench_merge_infront_frag.glsl2
-rw-r--r--source/blender/draw/engines/workbench/shaders/workbench_transparent_resolve_frag.glsl4
-rw-r--r--source/blender/draw/engines/workbench/shaders/workbench_volume_frag.glsl2
21 files changed, 38 insertions, 28 deletions
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_cell, 0).rgb;
diff --git a/source/blender/draw/engines/eevee/shaders/volumetric_scatter_frag.glsl b/source/blender/draw/engines/eevee/shaders/volumetric_scatter_frag.glsl
index dc755aeab8b..df3f92966e6 100644
--- a/source/blender/draw/engines/eevee/shaders/volumetric_scatter_frag.glsl
+++ b/source/blender/draw/engines/eevee/shaders/volumetric_scatter_frag.glsl
@@ -22,7 +22,7 @@ layout(location = 1) out vec4 outTransmittance;
void main()
{
- ivec3 volume_cell = ivec3(gl_FragCoord.xy, slice);
+ ivec3 volume_cell = ivec3(ivec2(gl_FragCoord.xy), slice);
/* Emission */
outScattering = texelFetch(volumeEmission, volume_cell, 0);
diff --git a/source/blender/draw/engines/overlay/shaders/background_frag.glsl b/source/blender/draw/engines/overlay/shaders/background_frag.glsl
index 52052d414f8..19313c0415b 100644
--- a/source/blender/draw/engines/overlay/shaders/background_frag.glsl
+++ b/source/blender/draw/engines/overlay/shaders/background_frag.glsl
@@ -38,8 +38,8 @@ void main()
* This removes the alpha channel and put the background behind reference images
* while masking the reference images by the render alpha.
*/
- float alpha = texture(colorBuffer, uvcoordsvar.st).a;
- float depth = texture(depthBuffer, uvcoordsvar.st).r;
+ float alpha = texture(colorBuffer, uvcoordsvar.xy).a;
+ float depth = texture(depthBuffer, uvcoordsvar.xy).r;
vec3 bg_col;
vec3 col_high;
diff --git a/source/blender/draw/engines/overlay/shaders/outline_detect_frag.glsl b/source/blender/draw/engines/overlay/shaders/outline_detect_frag.glsl
index 0e4757f8ea8..19d54a57479 100644
--- a/source/blender/draw/engines/overlay/shaders/outline_detect_frag.glsl
+++ b/source/blender/draw/engines/overlay/shaders/outline_detect_frag.glsl
@@ -169,7 +169,7 @@ void diag_dir(bvec4 edges1, bvec4 edges2, out vec2 line_start, out vec2 line_end
void main()
{
- uint ref = textureLod(outlineId, uvcoordsvar.st, 0.0).r;
+ uint ref = textureLod(outlineId, uvcoordsvar.xy, 0.0).r;
uint ref_col = ref;
vec2 uvs = gl_FragCoord.xy * sizeViewportInv.xy;
diff --git a/source/blender/draw/engines/overlay/shaders/volume_gridlines_vert.glsl b/source/blender/draw/engines/overlay/shaders/volume_gridlines_vert.glsl
index f714646fe40..507beb8a418 100644
--- a/source/blender/draw/engines/overlay/shaders/volume_gridlines_vert.glsl
+++ b/source/blender/draw/engines/overlay/shaders/volume_gridlines_vert.glsl
@@ -53,7 +53,7 @@ vec4 flag_to_color(uint flag)
if (bool(flag & uint(16))) {
color.rgb += vec3(0.9, 0.3, 0.0); /* orange */
}
- if (color.rgb == vec3(0.0)) {
+ if (is_zero(color.rgb)) {
color.rgb += vec3(0.5, 0.0, 0.0); /* medium red */
}
return color;
diff --git a/source/blender/draw/engines/workbench/shaders/workbench_effect_cavity_frag.glsl b/source/blender/draw/engines/workbench/shaders/workbench_effect_cavity_frag.glsl
index 59222b588a0..7704e7ed0b7 100644
--- a/source/blender/draw/engines/workbench/shaders/workbench_effect_cavity_frag.glsl
+++ b/source/blender/draw/engines/workbench/shaders/workbench_effect_cavity_frag.glsl
@@ -9,11 +9,11 @@ void main()
float cavity = 0.0, edges = 0.0, curvature = 0.0;
#ifdef USE_CAVITY
- cavity_compute(uvcoordsvar.st, depthBuffer, normalBuffer, cavity, edges);
+ cavity_compute(uvcoordsvar.xy, depthBuffer, normalBuffer, cavity, edges);
#endif
#ifdef USE_CURVATURE
- curvature_compute(uvcoordsvar.st, objectIdBuffer, normalBuffer, curvature);
+ curvature_compute(uvcoordsvar.xy, objectIdBuffer, normalBuffer, curvature);
#endif
float final_cavity_factor = clamp((1.0 - cavity) * (1.0 + edges) * (1.0 + curvature), 0.0, 4.0);
diff --git a/source/blender/draw/engines/workbench/shaders/workbench_merge_infront_frag.glsl b/source/blender/draw/engines/workbench/shaders/workbench_merge_infront_frag.glsl
index ae564435258..30daca6b7e3 100644
--- a/source/blender/draw/engines/workbench/shaders/workbench_merge_infront_frag.glsl
+++ b/source/blender/draw/engines/workbench/shaders/workbench_merge_infront_frag.glsl
@@ -1,7 +1,7 @@
void main()
{
- float depth = texture(depthBuffer, uvcoordsvar.st).r;
+ float depth = texture(depthBuffer, uvcoordsvar.xy).r;
/* Fix issues with Intel drivers (see T80023). */
fragColor = vec4(0.0);
/* Discard background pixels. */
diff --git a/source/blender/draw/engines/workbench/shaders/workbench_transparent_resolve_frag.glsl b/source/blender/draw/engines/workbench/shaders/workbench_transparent_resolve_frag.glsl
index a2c45d2f8e3..35bea830bac 100644
--- a/source/blender/draw/engines/workbench/shaders/workbench_transparent_resolve_frag.glsl
+++ b/source/blender/draw/engines/workbench/shaders/workbench_transparent_resolve_frag.glsl
@@ -9,8 +9,8 @@ void main()
/* Revealage is actually stored in transparentAccum alpha channel.
* This is a workaround to older hardware not having separate blend equation per render target.
*/
- vec4 trans_accum = texture(transparentAccum, uvcoordsvar.st);
- float trans_weight = texture(transparentRevealage, uvcoordsvar.st).r;
+ vec4 trans_accum = texture(transparentAccum, uvcoordsvar.xy);
+ float trans_weight = texture(transparentRevealage, uvcoordsvar.xy).r;
float trans_reveal = trans_accum.a;
/* Listing 4 */
diff --git a/source/blender/draw/engines/workbench/shaders/workbench_volume_frag.glsl b/source/blender/draw/engines/workbench/shaders/workbench_volume_frag.glsl
index 076f6e80104..4ff281ccd29 100644
--- a/source/blender/draw/engines/workbench/shaders/workbench_volume_frag.glsl
+++ b/source/blender/draw/engines/workbench/shaders/workbench_volume_frag.glsl
@@ -94,7 +94,7 @@ vec4 flag_to_color(uint flag)
if (bool(flag & uint(16))) {
color.rgb += vec3(0.9, 0.3, 0.0); /* orange */
}
- if (color.rgb == vec3(0.0)) {
+ if (is_zero(color.rgb)) {
color.rgb += vec3(0.5, 0.0, 0.0); /* medium red */
}
return color;