Vulkan, shader bug, all shader that use fract (or mod) and floor broken on Nvidia Vulkan. (include tests)

my Nvidia Linux driver version 440.82

to test
download this
and launch VK_shadertoy_launcher in Linux

this is not “code bug”(vulkan or shader) (I have launch this shader even on Khronos Vulkan examples, same result)
on Vulkan(only) I see this: imgur image link
On OpenGL everything fine.
code of this shader on shadertoy shadertoy link

as I see bug happened because of line fract(time)
when float time = 1.;
if edit it to fract(1.)
bug is gone(everything work)

but this bug ruin one of my shaders…
Fix to this bug(I fix it this way), is change if ((ipos.y > 0.0) || (ipos.x < fract(time))) to two If one after other.

this is a bug on Windows and Linux
I have test result from Nvidia 750 (linux driver 440.82)
and Nvidia 960 (Windows driver 436.15 WHQL)
both same, this bug affects a large number of shaders include shaders like this
shaderoy link to snow-shader
this how it looks like in Vulkan imgur link

test exe link


Steps to launch this shader in Khronos example:

  1. clone and build
  2. edit shader code Vulkan-Samples/shaders/texture_loading/texture.frag to this:
#version 450
/* Copyright (c) 2019, Sascha Willems
 * SPDX-License-Identifier: Apache-2.0
 * Licensed under the Apache License, Version 2.0 the "License";
 * you may not use this file except in compliance with the License.
 * You may obtain a copy of the License at
 * Unless required by applicable law or agreed to in writing, software
 * distributed under the License is distributed on an "AS IS" BASIS,
 * See the License for the specific language governing permissions and
 * limitations under the License.

layout (binding = 1) uniform sampler2D samplerColor;

layout (location = 0) in vec2 inUV;
layout (location = 1) in float inLodBias;
layout (location = 2) in vec3 inNormal;
layout (location = 3) in vec3 inViewVec;
layout (location = 4) in vec3 inLightVec;

layout (location = 0) out vec4 outFragColor;

void mainImage( out vec4 fragColor, in vec2 fragCoord )
    vec2 uv = fragCoord.xy;
    vec3 color = vec3(0.0);
    float time = 1.;
    vec2 ipos = floor(uv);
    float pct = 1.0;
    vec2 pv=mod(ipos ,vec2(1.));
    pct *= pv.y;
    if ((ipos.y > 0.0) || (ipos.x < fract(time))) {
        color = vec3(pct);
    fragColor = vec4(color, 1.0);

void main() 
    vec4 c=vec4(0.);
    outFragColor = c;   
    //vec4 color = texture(samplerColor, inUV, inLodBias);

    //vec3 N = normalize(inNormal);
    //vec3 L = normalize(inLightVec);
    //vec3 V = normalize(inViewVec);
    //vec3 R = reflect(-L, N);
    //vec3 diffuse = max(dot(N, L), 0.0) * vec3(1.0);
    //float specular = pow(max(dot(R, V), 0.0), 16.0) * color.a;

    //outFragColor = vec4(diffuse * color.rgb + specular, 1.0); 

this is 1:1 linked shadertoy code copy
3. launch

./build/linux/app/bin/Release/x86_64/vulkan_samples --sample texture_loading

result image link

result video link

after few days of collecting results
this bug confirmed on all Nvidia GPU that support Vulkan, except 2XXX series GPU(except Turing GPU)
on Linux and Windows, and all drivers for last year, till latest(yesterday downloaded)

result video of this bug on different engines and platforms

bugged shaders:
(launch them in Vulkan)

shadertoy link 1
shadertoy link 2

Does this bug still happen with the latest 457.00 / 455.26.02 drivers here:

I tested few days ago in 456.71 Windows driver version
this bug fixed. not happen anymore

That’s great news. Thanks for trying out a newer driver and reporting back.

@pdaniell I found similar to this bug, maybe it same
new thread with that new bug Shader behavior on unitialized variable (maybe bug)