Summary: | glUniformSubroutinesuiv segfaults when subroutine uniform is bound to a specific location | ||
---|---|---|---|
Product: | Mesa | Reporter: | Nicolas Koch <nioko1337> |
Component: | Mesa core | Assignee: | mesa-dev |
Status: | RESOLVED FIXED | QA Contact: | mesa-dev |
Severity: | normal | ||
Priority: | medium | CC: | nioko1337 |
Version: | 11.0 | ||
Hardware: | x86-64 (AMD64) | ||
OS: | Linux (All) | ||
Whiteboard: | |||
i915 platform: | i915 features: | ||
Attachments: |
fragment shader to test segfault
vertex shader which can be used with the fragment shader |
Created attachment 121070 [details]
vertex shader which can be used with the fragment shader
Thanks for the bug report. Mesa fix: http://patchwork.freedesktop.org/patch/70667/ Piglit test: http://patchwork.freedesktop.org/patch/70666/ Should be fixed by: commit 86677f101641c75d52577e3cd9e76441b1228b21 mesa: fix segfault in glUniformSubroutinesuiv() From Section 7.9 (SUBROUTINE UNIFORM VARIABLES) of the OpenGL 4.5 Core spec: "The command void UniformSubroutinesuiv(enum shadertype, sizei count, const uint *indices); will load all active subroutine uniforms for shader stage shadertype with subroutine indices from indices, storing indices[i] into the uniform at location i. The indices for any locations between zero and the value of ACTIVE_SUBROUTINE_UNIFORM_LOCATIONS minus one which are not used will be ignored." V2: simplify NULL check suggested by Jason. Acked-by: Jason Ekstrand <jason@jlekstrand.net> Reviewed-by: Dave Airlie <airlied@redhat.com> Cc: "11.0 11.1" mesa-stable@lists.freedesktop.org https://bugs.freedesktop.org/show_bug.cgi?id=93731 |
Use of freedesktop.org services, including Bugzilla, is subject to our Code of Conduct. How we collect and use information is described in our Privacy Policy.
Created attachment 121069 [details] fragment shader to test segfault In GLSL, one can specify the location of a subroutine uniform by using something like: #extension GL_ARB_shader_subroutine : require #extension GL_ARB_explicit_uniform_location : require layout(location = 5) subroutine uniform color_t Color; Assuming this is the only subroutine uniform, you should be able to set it's value by calling: UniformSubroutinesuiv(GL_FRAGMENT_SHADER, 6, &[0, 0, 0, 0, 0 , subroutin_index]); According to the spec, the values [0]-[4] should be ignored, and the subroutine uniform at location 5 should be set to `subroutin_index`. Mesa will segfault when calling this function like that. Unfortunately, I do not have a complete minimum example program right now (I'm not good with raw opengl), but attached is a fragment shader which can be used to reproduce the problem.