When generating GPU shaders using GPU_LANGUAGE_GLSL_VK_4_6, OpenColorIO can emit GLSL where multiple distinct resources share the same layout(set = X, binding = Y) within the same shader stage. This is not a valid Vulkan descriptor binding layout: a (set,binding) pair must uniquely identify a single descriptor binding.
This is observed in pipelines that require both a 3D LUT and 1D/2D LUT(s) (e.g., when a display/view transform chain uses both types of LUT textures).
Affected Versions
OpenColorIO: v2.5.x
Steps to Reproduce
-
Use an OCIO config + transform chain whose GPU representation requires:
- at least one 3D LUT texture, and
- at least one 1D/2D LUT texture (often represented as 2D textures in OCIO GPU output).
-
Create a shader description for Vulkan GLSL:
auto desc = OCIO::GpuShaderDesc::CreateShaderDesc();
desc->setLanguage(OCIO::GPU_LANGUAGE_GLSL_VK_4_6);
desc->setDescriptorSetIndex(0, 1);
gpuProc->extractGpuShaderInfo(desc);
const char* shaderText = desc->getShaderText();
- Inspect shaderText and locate the texture/sampler uniform declarations.
Actual Result
The generated shader may contain duplicate Vulkan binding declarations, e.g.:
layout(set = 0, binding = 1) uniform sampler3D ocio_lut3d_0Sampler;
layout(set = 0, binding = 1) uniform sampler2D ocio_lut1d_1Sampler;
The core issue is multiple uniforms sharing the same (set,binding).
Expected Result
For GPU_LANGUAGE_GLSL_VK_4_6, OCIO should emit Vulkan-valid GLSL where:
- each (set,binding) pair is unique for a given shader stage
- 1D/2D and 3D LUT resources do not overlap in binding assignment