Nvidia Vulkan driver has bugs in executing spir-v shaders, that work correctly in OpenGL

Bug:
Shortest shader code (10 lines of code) shadertoy link
The correct shader result is a black screen.
Bug result - noise like this imgur image link
I have this bug confirmed on Nvidia 750 and Nvidia 960, maybe this is only “Old” Nvidia videocards bug. Driver version Linux 440.82, Windows 436.15 WHQL.

Launch this shader in Nvidia Vulkan, using Khronos-Samples, as an example, or anything else you want use.

Steps to launch this shader in Khronos example:

  1. clone and build https://github.com/KhronosGroup/Vulkan-Samples
  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
 *
 *     http://www.apache.org/licenses/LICENSE-2.0
 *
 * Unless required by applicable law or agreed to in writing, software
 * distributed under the License is distributed on an "AS IS" BASIS,
 * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
 * 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.);
    mainImage(c,inUV*512.);
    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

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

result image link

result video link

full nvidia forum thread

other option to test, download my exe (and linux bin) here bug_test_noise.zip
and launch it, correct result is a black screen

Bug confirmed on all Nvidia 7XX, 9XX, 1XXX, with drivers from 2019 till latest(today)

more video that confirm it on different video cards and OS
https://imgur.com/a/nzvIROV
https://gfycat.com/ru/necessaryinformalharborporpoise

You have to forward this bug to the affected vendor. I don’t think that this will get noticed by NVIDIA just by posting at the Khronos forums.

It’s best to create a stand-alone repo-case and pass it over to NVIDIA. They’re usually very responsive to such cases.

thanks for reply

It’s best to create a stand-alone repo-case and pass it over to NVIDIA. They’re usually very responsive to such cases.

I have a thread on Nvidia forum link I make it when I thought it only Linux bug 2 days ago.
idk if I need make more threads there…

fixed in 456.71 Windows driver version

found a new way to reproduce this bug
https://forums.developer.nvidia.com/t/shader-behavior-on-unitialized-variable-maybe-bug/168947

This topic was automatically closed 183 days after the last reply. New replies are no longer allowed.