EEVEE-Next: Fix shader compilation on Metal

This commit is contained in:
Clément Foucault
2023-07-03 21:27:06 +02:00
parent 5ea561b51c
commit 91d15a3613
5 changed files with 12 additions and 9 deletions

View File

@@ -60,7 +60,7 @@ OcclusionData ambient_occlusion_unpack_data(vec4 v)
vec2 ambient_occlusion_get_noise(ivec2 texel)
{
vec2 noise = utility_tx_fetch(utility_tx, texel, UTIL_BLUE_NOISE_LAYER).xy;
vec2 noise = utility_tx_fetch(utility_tx, vec2(texel), UTIL_BLUE_NOISE_LAYER).xy;
return fract(noise + sampling_rng_2D_get(SAMPLING_AO_U));
}

View File

@@ -11,12 +11,12 @@ vec3 view_position_derivative_from_depth(
sampler2D depth_tx, ivec2 extent, vec2 uv, ivec2 offset, vec3 vP, float depth_center)
{
vec4 H;
H.x = texelFetch(depth_tx, ivec2(uv * extent) - offset * 2, 0).r;
H.y = texelFetch(depth_tx, ivec2(uv * extent) - offset, 0).r;
H.z = texelFetch(depth_tx, ivec2(uv * extent) + offset, 0).r;
H.w = texelFetch(depth_tx, ivec2(uv * extent) + offset * 2, 0).r;
H.x = texelFetch(depth_tx, ivec2(uv * vec2(extent)) - offset * 2, 0).r;
H.y = texelFetch(depth_tx, ivec2(uv * vec2(extent)) - offset, 0).r;
H.z = texelFetch(depth_tx, ivec2(uv * vec2(extent)) + offset, 0).r;
H.w = texelFetch(depth_tx, ivec2(uv * vec2(extent)) + offset * 2, 0).r;
vec2 uv_offset = vec2(offset) / extent;
vec2 uv_offset = vec2(offset) / vec2(extent);
vec2 uv1 = uv - uv_offset * 2.0;
vec2 uv2 = uv - uv_offset;
vec2 uv3 = uv + uv_offset;
@@ -42,7 +42,7 @@ vec3 view_position_derivative_from_depth(
bool reconstruct_view_position_and_normal_from_depth(
sampler2D depth_tx, ivec2 extent, vec2 uv, out vec3 vP, out vec3 vNg)
{
float depth_center = texelFetch(depth_tx, ivec2(uv * extent), 0).r;
float depth_center = texelFetch(depth_tx, ivec2(uv * vec2(extent)), 0).r;
vP = get_view_space_from_depth(uv, depth_center);

View File

@@ -39,7 +39,7 @@ void light_world_eval(ClosureReflection reflection, vec3 P, vec3 V, inout vec3 o
/* http://http.developer.nvidia.com/GPUGems3/gpugems3_ch20.html : Equation 13 */
/* TODO: lod_factor should be precalculated and stored inside the reflection probe data. */
const float bias = 0.0;
const float lod_factor = bias + 0.5 * log(float(square_i(texture_size.x))) / log(2);
const float lod_factor = bias + 0.5 * log(float(square_i(texture_size.x))) / log(2.0);
/* -2: Don't use LOD levels that are smaller than 4x4 pixels. */
float lod = clamp(lod_factor - 0.5 * log2(pdf * dist), 0.0, lod_cube_max - 2.0);

View File

@@ -11,7 +11,7 @@ void main()
if (any(greaterThanEqual(octahedral_coord.xy, octahedral_size.xy))) {
return;
}
vec2 octahedral_uv = vec2(octahedral_coord) / vec2(octahedral_size);
vec2 octahedral_uv = vec2(octahedral_coord.xy) / vec2(octahedral_size.xy);
vec3 R = octahedral_uv_to_direction(octahedral_uv);
vec4 col = textureLod(cubemap_tx, R, 0.0);

View File

@@ -1464,6 +1464,9 @@ bool MTLShader::generate_msl_from_glsl_compute(const shader::ShaderCreateInfo *i
/** Generate Compute shader stage. **/
std::stringstream ss_compute;
ss_compute << "#define GPU_ARB_texture_cube_map_array 1\n"
"#define GPU_ARB_shader_draw_parameters 1\n";
#ifndef NDEBUG
extract_global_scope_constants(shd_builder_->glsl_compute_source_, ss_compute);
#endif