88 lines
3.4 KiB
Python
88 lines
3.4 KiB
Python
# 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"
|