| # Copyright 2018 The Shaderc Authors. All rights reserved. |
| # |
| # 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. |
| |
| import expect |
| from glslc_test_framework import inside_glslc_testsuite |
| from placeholder import FileShader |
| |
| # A GLSL shader with inputs and outputs explicit locations. |
| GLSL_SHADER_IO_WITHOUT_LOCATIONS = """#version 310 es |
| in vec4 m_in; |
| in vec4 m_in1; |
| out vec4 m_out; |
| out vec4 m_out1; |
| void main() { |
| m_out = m_in; |
| m_out1 = m_in1; |
| }""" |
| |
| |
| # An HLSL fragment shader with inputs and outputs explicit locations. |
| HLSL_SHADER_IO_WITHOUT_LOCATIONS = """ |
| float4 Foo(float4 a, float4 b) : COLOR0 { |
| return a + b; |
| }""" |
| |
| |
| @inside_glslc_testsuite('OptionFAutoMapLocations') |
| class MissingLocationsResultsInError(expect.ErrorMessageSubstr): |
| """Tests that compilation fails when inputs or outputs have no location.""" |
| |
| shader = FileShader(GLSL_SHADER_IO_WITHOUT_LOCATIONS, '.vert') |
| glslc_args = ['-S', shader] |
| expected_error_substr = "SPIR-V requires location for user input/output" |
| |
| |
| @inside_glslc_testsuite('OptionFAutoMapLocations') |
| class FAutoMapLocationsGeneratesLocationsCheckInput(expect.ValidAssemblyFileWithSubstr): |
| """Tests that the compiler generates locations upon request: Input 0""" |
| |
| shader = FileShader(GLSL_SHADER_IO_WITHOUT_LOCATIONS, '.vert') |
| glslc_args = ['-S', shader, '-fauto-map-locations'] |
| expected_assembly_substr = "OpDecorate %m_in Location 0" |
| |
| |
| @inside_glslc_testsuite('OptionFAutoMapLocations') |
| class FAutoMapLocationsGeneratesLocationsCheckOutput0(expect.ValidAssemblyFileWithSubstr): |
| """Tests that the compiler generates locations upon request: Output 0""" |
| |
| shader = FileShader(GLSL_SHADER_IO_WITHOUT_LOCATIONS, '.vert') |
| glslc_args = ['-S', shader, '-fauto-map-locations'] |
| expected_assembly_substr = "OpDecorate %m_out Location 0" |
| |
| |
| # Currently Glslang only generates Location 0. |
| # See https://github.com/KhronosGroup/glslang/issues/1261 |
| # TODO(dneto): Write tests that check Location 1 is generated for inputs and |
| # outputs. |
| |
| |
| # Glslang's HLSL compiler automatically assigns locations inptus and outputs. |
| @inside_glslc_testsuite('OptionFAutoMapLocations') |
| class HLSLCompilerGeneratesLocationsCheckInput0(expect.ValidAssemblyFileWithSubstr): |
| """Tests that the HLSL compiler generates locations automatically: Input 0.""" |
| |
| shader = FileShader(HLSL_SHADER_IO_WITHOUT_LOCATIONS, '.hlsl') |
| glslc_args = ['-S', '-fshader-stage=frag', '-fentry-point=Foo', shader] |
| expected_assembly_substr = "OpDecorate %a Location 0" |
| |
| |
| @inside_glslc_testsuite('OptionFAutoMapLocations') |
| class HLSLCompilerGeneratesLocationsCheckOutput(expect.ValidAssemblyFileWithSubstr): |
| """Tests that the HLSL compiler generates locations automatically: Output.""" |
| |
| shader = FileShader(HLSL_SHADER_IO_WITHOUT_LOCATIONS, '.hlsl') |
| glslc_args = ['-S', '-fshader-stage=frag', '-fentry-point=Foo', shader] |
| expected_assembly_substr = "OpDecorate %_entryPointOutput Location 0" |