| 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.