313 lines
11 KiB
Python
313 lines
11 KiB
Python
# Copyright 2015 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
|
|
|
|
|
|
def core_vert_shader_without_version():
|
|
# gl_ClipDistance doesn't exist in es profile (at least until 3.10).
|
|
return 'void main() { gl_ClipDistance[0] = 5.; }'
|
|
|
|
|
|
def core_frag_shader_without_version():
|
|
# gl_SampleID appears in core profile from 4.00.
|
|
# gl_sampleID doesn't exsit in es profile (at least until 3.10).
|
|
return 'void main() { int temp = gl_SampleID; }'
|
|
|
|
|
|
def hlsl_compute_shader_with_barriers():
|
|
# Use "main" to avoid the need for -fentry-point
|
|
return 'void main() { AllMemoryBarrierWithGroupSync(); }'
|
|
|
|
|
|
@inside_glslc_testsuite('OptionStd')
|
|
class TestStdNoArg(expect.ErrorMessage):
|
|
"""Tests -std alone."""
|
|
|
|
glslc_args = ['-std']
|
|
expected_error = ["glslc: error: unknown argument: '-std'\n"]
|
|
|
|
|
|
@inside_glslc_testsuite('OptionStd')
|
|
class TestStdEqNoArg(expect.ErrorMessage):
|
|
"""Tests -std= with no argument."""
|
|
|
|
glslc_args = ['-std=']
|
|
expected_error = ["glslc: error: invalid value '' in '-std='\n"]
|
|
|
|
|
|
@inside_glslc_testsuite('OptionStd')
|
|
class TestStdEqSpaceArg(expect.ErrorMessage):
|
|
"""Tests -std= <version-profile>."""
|
|
|
|
shader = FileShader(core_frag_shader_without_version(), '.frag')
|
|
glslc_args = ['-c', '-std=', '450core', shader]
|
|
expected_error = ["glslc: error: invalid value '' in '-std='\n"]
|
|
|
|
|
|
# TODO(dneto): The error message changes with different versions of glslang.
|
|
@inside_glslc_testsuite('OptionStd')
|
|
class TestMissingVersionAndStd(expect.ErrorMessageSubstr):
|
|
"""Tests that missing both #version and -std results in errors."""
|
|
|
|
shader = FileShader(core_frag_shader_without_version(), '.frag')
|
|
glslc_args = ['-c', shader]
|
|
expected_error_substr = ['error:']
|
|
|
|
|
|
@inside_glslc_testsuite('OptionStd')
|
|
class TestMissingVersionButHavingStd(expect.ValidObjectFile):
|
|
"""Tests that correct -std fixes missing #version."""
|
|
|
|
shader = FileShader(core_frag_shader_without_version(), '.frag')
|
|
glslc_args = ['-c', '-std=450core', shader]
|
|
|
|
|
|
@inside_glslc_testsuite('OptionStd')
|
|
class TestGLSL460(expect.ValidObjectFile):
|
|
"""Tests that GLSL version 4.6 is supported."""
|
|
|
|
shader = FileShader(core_frag_shader_without_version(), '.frag')
|
|
glslc_args = ['-c', '-std=460', shader]
|
|
|
|
|
|
@inside_glslc_testsuite('OptionStd')
|
|
class TestGLSL460Core(expect.ValidObjectFile):
|
|
"""Tests that GLSL version 4.6 core profile is supported."""
|
|
|
|
shader = FileShader(core_frag_shader_without_version(), '.frag')
|
|
glslc_args = ['-c', '-std=460core', shader]
|
|
|
|
|
|
@inside_glslc_testsuite('OptionStd')
|
|
class TestESSL320(expect.ValidObjectFile):
|
|
"""Tests that ESSL version 3.2 is supported."""
|
|
|
|
shader = FileShader(core_frag_shader_without_version(), '.frag')
|
|
glslc_args = ['-c', '-std=320es', shader]
|
|
|
|
|
|
@inside_glslc_testsuite('OptionStd')
|
|
class TestStdIgnoredInHlsl(expect.ValidObjectFile):
|
|
"""Tests HLSL compilation ignores -std."""
|
|
|
|
# Compute shaders are not available in OpenGL 150
|
|
shader = FileShader(hlsl_compute_shader_with_barriers(), '.comp')
|
|
glslc_args = ['-c', '-x', 'hlsl', '-std=150', shader]
|
|
|
|
|
|
@inside_glslc_testsuite('OptionStd')
|
|
class TestMissingVersionAndWrongStd(expect.ErrorMessage):
|
|
"""Tests missing #version and wrong -std results in errors."""
|
|
|
|
shader = FileShader(core_frag_shader_without_version(), '.frag')
|
|
glslc_args = ['-c', '-std=310es', shader]
|
|
expected_error = [
|
|
shader, ":1: error: 'gl_SampleID' : required extension not requested: "
|
|
'GL_OES_sample_variables\n1 error generated.\n']
|
|
|
|
|
|
@inside_glslc_testsuite('OptionStd')
|
|
class TestConflictingVersionAndStd(expect.ValidObjectFileWithWarning):
|
|
"""Tests that with both #version and -std, -std takes precedence."""
|
|
|
|
# Wrong #version here on purpose.
|
|
shader = FileShader(
|
|
'#version 310 es\n' + core_frag_shader_without_version(), '.frag')
|
|
# -std overwrites the wrong #version.
|
|
glslc_args = ['-c', '-std=450core', shader]
|
|
|
|
expected_warning = [
|
|
shader, ': warning: (version, profile) forced to be (450, core), while '
|
|
'in source code it is (310, es)\n1 warning generated.\n']
|
|
|
|
|
|
@inside_glslc_testsuite('OptionStd')
|
|
class TestMultipleStd(expect.ValidObjectFile):
|
|
"""Tests that for multiple -std, the last one takes effect."""
|
|
|
|
shader = FileShader(core_frag_shader_without_version(), '.frag')
|
|
glslc_args = ['-c', '-std=100', '-std=310es', shader, '-std=450core']
|
|
|
|
|
|
@inside_glslc_testsuite('OptionStd')
|
|
class TestMultipleFiles(expect.ValidObjectFileWithWarning):
|
|
"""Tests that -std covers all files."""
|
|
|
|
shader1 = FileShader(core_frag_shader_without_version(), '.frag')
|
|
shader2 = FileShader(core_vert_shader_without_version(), '.vert')
|
|
shader3 = FileShader(
|
|
'#version 310 es\n' + core_frag_shader_without_version(), '.frag')
|
|
glslc_args = ['-c', '-std=450core', shader1, shader2, shader3]
|
|
|
|
expected_warning = [
|
|
shader3, ': warning: (version, profile) forced to be (450, '
|
|
'core), while in source code it is (310, es)\n'
|
|
'1 warning generated.\n']
|
|
|
|
|
|
@inside_glslc_testsuite('OptionStd')
|
|
class TestUnkownProfile(expect.ErrorMessage):
|
|
"""Tests that -std rejects unknown profile."""
|
|
|
|
shader = FileShader(core_frag_shader_without_version(), '.frag')
|
|
glslc_args = ['-c', '-std=450google', shader]
|
|
expected_error = [
|
|
"glslc: error: invalid value '450google' in '-std=450google'\n"]
|
|
|
|
|
|
@inside_glslc_testsuite('OptionStd')
|
|
class TestUnkownVersion(expect.ErrorMessage):
|
|
"""Tests that -std rejects unknown version."""
|
|
|
|
shader = FileShader(core_frag_shader_without_version(), '.frag')
|
|
glslc_args = ['-c', '-std=42core', shader]
|
|
expected_error = [
|
|
"glslc: error: invalid value '42core' in '-std=42core'\n"]
|
|
|
|
|
|
@inside_glslc_testsuite('OptionStd')
|
|
class TestTotallyWrongStdValue(expect.ErrorMessage):
|
|
"""Tests that -std rejects totally wrong -std value."""
|
|
|
|
shader = FileShader(core_vert_shader_without_version(), '.vert')
|
|
glslc_args = ['-c', '-std=wrong42', shader]
|
|
|
|
expected_error = [
|
|
"glslc: error: invalid value 'wrong42' in '-std=wrong42'\n"]
|
|
|
|
|
|
@inside_glslc_testsuite('OptionStd')
|
|
class TestVersionInsideSlashSlashComment(expect.ValidObjectFileWithWarning):
|
|
"""Tests that -std substitutes the correct #version string."""
|
|
|
|
# The second #version string should be substituted and this shader
|
|
# should compile successfully with -std=450core.
|
|
shader = FileShader(
|
|
'// #version 310 es\n#version 310 es\n' +
|
|
core_vert_shader_without_version(), '.vert')
|
|
glslc_args = ['-c', '-std=450core', shader]
|
|
|
|
expected_warning = [
|
|
shader, ': warning: (version, profile) forced to be (450, core), while '
|
|
'in source code it is (310, es)\n1 warning generated.\n']
|
|
|
|
|
|
@inside_glslc_testsuite('OptionStd')
|
|
class TestVersionInsideSlashStarComment(expect.ValidObjectFileWithWarning):
|
|
"""Tests that -std substitutes the correct #version string."""
|
|
|
|
# The second #version string should be substituted and this shader
|
|
# should compile successfully with -std=450core.
|
|
shader = FileShader(
|
|
'/* #version 310 es */\n#version 310 es\n' +
|
|
core_vert_shader_without_version(), '.vert')
|
|
glslc_args = ['-c', '-std=450core', shader]
|
|
|
|
expected_warning = [
|
|
shader, ': warning: (version, profile) forced to be (450, core), while '
|
|
'in source code it is (310, es)\n1 warning generated.\n']
|
|
|
|
|
|
@inside_glslc_testsuite('OptionStd')
|
|
class TestCommentBeforeVersion(expect.ValidObjectFileWithWarning):
|
|
"""Tests that comments before #version (same line) is correctly handled."""
|
|
|
|
shader = FileShader(
|
|
'/* some comment */ #version 150\n' +
|
|
core_vert_shader_without_version(), '.vert')
|
|
glslc_args = ['-c', '-std=450', shader]
|
|
|
|
expected_warning = [
|
|
shader, ': warning: (version, profile) forced to be (450, none), while '
|
|
'in source code it is (150, none)\n1 warning generated.\n']
|
|
|
|
|
|
@inside_glslc_testsuite('OptionStd')
|
|
class TestCommentAfterVersion(expect.ValidObjectFileWithWarning):
|
|
"""Tests that multiple-line comments after #version is correctly handled."""
|
|
|
|
shader = FileShader(
|
|
'#version 150 compatibility ' +
|
|
'/* start \n second line \n end */\n' +
|
|
core_vert_shader_without_version(), '.vert')
|
|
glslc_args = ['-c', '-std=450core', shader]
|
|
|
|
expected_warning = [
|
|
shader, ': warning: (version, profile) forced to be (450, core), while '
|
|
'in source code it is (150, compatibility)\n1 warning generated.\n']
|
|
|
|
|
|
# The following test case is disabled because of a bug in glslang.
|
|
# When checking non-newline whitespaces, glslang only recognizes
|
|
# ' ' and '\t', leaving '\v' and '\f' unhandled. The following test
|
|
# case exposes this problem. It should be turned on once a fix for
|
|
# glslang is landed.
|
|
#@inside_glslc_testsuite('OptionStd')
|
|
class TestSpaceAroundVersion(expect.ValidObjectFileWithWarning):
|
|
"""Tests that space around #version is correctly handled."""
|
|
|
|
shader = FileShader(
|
|
'\t \t # \t \f\f version \v \t\t 310 \v\v \t es \n' +
|
|
core_vert_shader_without_version(), '.vert')
|
|
glslc_args = ['-c', '-std=450core', shader]
|
|
|
|
expected_warning = [
|
|
shader, ': warning: (version, profile) forced to be (450, core), while '
|
|
'in source code it is (310, es)\n1 warning generated.\n']
|
|
|
|
|
|
@inside_glslc_testsuite('OptionStd')
|
|
class TestVersionInsideCrazyComment(expect.ValidObjectFileWithWarning):
|
|
"""Tests that -std substitutes the correct #version string."""
|
|
|
|
# The fourth #version string should be substituted and this shader
|
|
# should compile successfully with -std=450core.
|
|
shader = FileShader(
|
|
'/* */ /* // /* #version 310 es */\n' + # /*-style comment
|
|
'// /* */ /* /* // #version 310 es\n' + # //-style comment
|
|
'///*////*//*/*/ #version 310 es*/\n' + # //-style comment
|
|
'#version 310 es\n' + core_vert_shader_without_version(), '.vert')
|
|
glslc_args = ['-c', '-std=450core', shader]
|
|
|
|
expected_warning = [
|
|
shader, ': warning: (version, profile) forced to be (450, core), while '
|
|
'in source code it is (310, es)\n1 warning generated.\n']
|
|
|
|
|
|
@inside_glslc_testsuite('OptionStd')
|
|
class TestVersionMissingProfile(expect.ErrorMessage):
|
|
"""Tests that missing required profile in -std results in an error."""
|
|
|
|
shader = FileShader('#version 140\nvoid main() {}', '.vert')
|
|
glslc_args = ['-c', '-std=310', shader]
|
|
|
|
expected_error = [
|
|
shader, ': error: #version: versions 300, 310, and 320 require ',
|
|
"specifying the 'es' profile\n1 error generated.\n"]
|
|
|
|
|
|
@inside_glslc_testsuite('OptionStd')
|
|
class TestVersionRedundantProfile(expect.ErrorMessageSubstr):
|
|
"""Tests that adding non-required profile in -std results in an error."""
|
|
|
|
shader = FileShader('#version 140\nvoid main() {}', '.vert')
|
|
glslc_args = ['-c', '-std=100core', shader]
|
|
|
|
expected_error_substr = [
|
|
shader, ': error: #version: versions before 150 do not allow '
|
|
'a profile token\n']
|