From 81a63f1de0bc94a8de12c3aa56f4f5d70c8d3a7e Mon Sep 17 00:00:00 2001 From: Neil Henning Date: Mon, 26 Nov 2018 10:17:33 +0000 Subject: [PATCH] Add conversion folding when the source is a constant. This change adds unary conversion folding when the source is a constant. This fixes an ISV issue whereby: ``` const float16_t f = float16_t(42.0); ``` Wouldn't compile because the conversion operator would always produce an EvqTemporary when it could have produced an EvqConst. I've also added a test case that proves out that all basic-type to basic-type conversions work. --- Test/baseResults/constantUnaryConversion.comp.out | 645 ++++++++++++++++++++++ Test/baseResults/spv.16bitstorage-int.frag.out | 17 +- Test/baseResults/spv.16bitstorage-uint.frag.out | 12 +- Test/baseResults/spv.16bitstorage.frag.out | 15 +- Test/baseResults/spv.8bitstorage-int.frag.out | 17 +- Test/baseResults/spv.8bitstorage-uint.frag.out | 12 +- Test/constantUnaryConversion.comp | 48 ++ glslang/MachineIndependent/Constant.cpp | 273 +++++++++ glslang/MachineIndependent/Intermediate.cpp | 10 +- glslang/MachineIndependent/localintermediate.h | 2 +- gtests/AST.FromFile.cpp | 1 + 11 files changed, 1012 insertions(+), 40 deletions(-) create mode 100644 Test/baseResults/constantUnaryConversion.comp.out create mode 100644 Test/constantUnaryConversion.comp diff --git a/Test/baseResults/constantUnaryConversion.comp.out b/Test/baseResults/constantUnaryConversion.comp.out new file mode 100644 index 0000000..de705e4 --- /dev/null +++ b/Test/baseResults/constantUnaryConversion.comp.out @@ -0,0 +1,645 @@ +constantUnaryConversion.comp +Shader version: 450 +Requested GL_KHX_shader_explicit_arithmetic_types +local_size = (1, 1, 1) +0:? Sequence +0:48 Function Definition: main( ( global void) +0:48 Function Parameters: +0:? Linker Objects +0:? 'bool_init' ( const bool) +0:? true (const bool) +0:? 'int8_t_init' ( const int8_t) +0:? -1 (const int) +0:? 'int16_t_init' ( const int16_t) +0:? -2 (const int) +0:? 'int32_t_init' ( const int) +0:? -3 (const int) +0:? 'int64_t_init' ( const int64_t) +0:? -4 (const int64_t) +0:? 'uint8_t_init' ( const uint8_t) +0:? 1 (const int) +0:? 'uint16_t_init' ( const uint16_t) +0:? 2 (const int) +0:? 'uint32_t_init' ( const uint) +0:? 3 (const uint) +0:? 'uint64_t_init' ( const uint64_t) +0:? 4 (const uint64_t) +0:? 'float16_t_init' ( const float16_t) +0:? 42.000000 +0:? 'float32_t_init' ( const float) +0:? 13.000000 +0:? 'float64_t_init' ( const double) +0:? -4.000000 +0:? 'bool_to_bool' ( const bool) +0:? true (const bool) +0:? 'int8_t_to_bool' ( const bool) +0:? -1 (const int) +0:? 'int16_t_to_bool' ( const bool) +0:? -2 (const int) +0:? 'int32_t_to_bool' ( const bool) +0:? true (const bool) +0:? 'int64_t_to_bool' ( const bool) +0:? true (const bool) +0:? 'uint8_t_to_bool' ( const bool) +0:? 1 (const int) +0:? 'uint16_t_to_bool' ( const bool) +0:? 2 (const int) +0:? 'uint32_t_to_bool' ( const bool) +0:? true (const bool) +0:? 'uint64_t_to_bool' ( const bool) +0:? true (const bool) +0:? 'float16_t_to_bool' ( const bool) +0:? true (const bool) +0:? 'float32_t_to_bool' ( const bool) +0:? true (const bool) +0:? 'float64_t_to_bool' ( const bool) +0:? true (const bool) +0:? 'bool_to_int8_t' ( const int8_t) +0:? true (const bool) +0:? 'int8_t_to_int8_t' ( const int8_t) +0:? -1 (const int) +0:? 'int16_t_to_int8_t' ( const int8_t) +0:? -2 (const int) +0:? 'int32_t_to_int8_t' ( const int8_t) +0:? -3 (const int) +0:? 'int64_t_to_int8_t' ( const int8_t) +0:? -4 (const int64_t) +0:? 'uint8_t_to_int8_t' ( const int8_t) +0:? 1 (const int) +0:? 'uint16_t_to_int8_t' ( const int8_t) +0:? 2 (const int) +0:? 'uint32_t_to_int8_t' ( const int8_t) +0:? 3 (const uint) +0:? 'uint64_t_to_int8_t' ( const int8_t) +0:? 4 (const uint64_t) +0:? 'float16_t_to_int8_t' ( const int8_t) +0:? 42.000000 +0:? 'float32_t_to_int8_t' ( const int8_t) +0:? 13.000000 +0:? 'float64_t_to_int8_t' ( const int8_t) +0:? -4.000000 +0:? 'bool_to_int16_t' ( const int16_t) +0:? true (const bool) +0:? 'int8_t_to_int16_t' ( const int16_t) +0:? -1 (const int) +0:? 'int16_t_to_int16_t' ( const int16_t) +0:? -2 (const int) +0:? 'int32_t_to_int16_t' ( const int16_t) +0:? -3 (const int) +0:? 'int64_t_to_int16_t' ( const int16_t) +0:? -4 (const int64_t) +0:? 'uint8_t_to_int16_t' ( const int16_t) +0:? 1 (const int) +0:? 'uint16_t_to_int16_t' ( const int16_t) +0:? 2 (const int) +0:? 'uint32_t_to_int16_t' ( const int16_t) +0:? 3 (const uint) +0:? 'uint64_t_to_int16_t' ( const int16_t) +0:? 4 (const uint64_t) +0:? 'float16_t_to_int16_t' ( const int16_t) +0:? 42.000000 +0:? 'float32_t_to_int16_t' ( const int16_t) +0:? 13.000000 +0:? 'float64_t_to_int16_t' ( const int16_t) +0:? -4.000000 +0:? 'bool_to_int32_t' ( const int) +0:? 1 (const int) +0:? 'int8_t_to_int32_t' ( const int) +0:? -1 (const int) +0:? 'int16_t_to_int32_t' ( const int) +0:? -2 (const int) +0:? 'int32_t_to_int32_t' ( const int) +0:? -3 (const int) +0:? 'int64_t_to_int32_t' ( const int) +0:? -4 (const int) +0:? 'uint8_t_to_int32_t' ( const int) +0:? 1 (const int) +0:? 'uint16_t_to_int32_t' ( const int) +0:? 2 (const int) +0:? 'uint32_t_to_int32_t' ( const int) +0:? 3 (const int) +0:? 'uint64_t_to_int32_t' ( const int) +0:? 4 (const int) +0:? 'float16_t_to_int32_t' ( const int) +0:? 42 (const int) +0:? 'float32_t_to_int32_t' ( const int) +0:? 13 (const int) +0:? 'float64_t_to_int32_t' ( const int) +0:? -4 (const int) +0:? 'bool_to_int64_t' ( const int64_t) +0:? 1 (const int64_t) +0:? 'int8_t_to_int64_t' ( const int64_t) +0:? -1 (const int) +0:? 'int16_t_to_int64_t' ( const int64_t) +0:? -2 (const int) +0:? 'int32_t_to_int64_t' ( const int64_t) +0:? -3 (const int64_t) +0:? 'int64_t_to_int64_t' ( const int64_t) +0:? -4 (const int64_t) +0:? 'uint8_t_to_int64_t' ( const int64_t) +0:? 1 (const int) +0:? 'uint16_t_to_int64_t' ( const int64_t) +0:? 2 (const int) +0:? 'uint32_t_to_int64_t' ( const int64_t) +0:? 3 (const int64_t) +0:? 'uint64_t_to_int64_t' ( const int64_t) +0:? 4 (const int64_t) +0:? 'float16_t_to_int64_t' ( const int64_t) +0:? 42 (const int64_t) +0:? 'float32_t_to_int64_t' ( const int64_t) +0:? 13 (const int64_t) +0:? 'float64_t_to_int64_t' ( const int64_t) +0:? -4 (const int64_t) +0:? 'bool_to_uint8_t' ( const uint8_t) +0:? true (const bool) +0:? 'int8_t_to_uint8_t' ( const uint8_t) +0:? -1 (const int) +0:? 'int16_t_to_uint8_t' ( const uint8_t) +0:? -2 (const int) +0:? 'int32_t_to_uint8_t' ( const uint8_t) +0:? -3 (const int) +0:? 'int64_t_to_uint8_t' ( const uint8_t) +0:? -4 (const int64_t) +0:? 'uint8_t_to_uint8_t' ( const uint8_t) +0:? 1 (const int) +0:? 'uint16_t_to_uint8_t' ( const uint8_t) +0:? 2 (const int) +0:? 'uint32_t_to_uint8_t' ( const uint8_t) +0:? 3 (const uint) +0:? 'uint64_t_to_uint8_t' ( const uint8_t) +0:? 4 (const uint64_t) +0:? 'float16_t_to_uint8_t' ( const uint8_t) +0:? 42.000000 +0:? 'float32_t_to_uint8_t' ( const uint8_t) +0:? 13.000000 +0:? 'float64_t_to_uint8_t' ( const uint8_t) +0:? -4.000000 +0:? 'bool_to_uint16_t' ( const uint16_t) +0:? true (const bool) +0:? 'int8_t_to_uint16_t' ( const uint16_t) +0:? -1 (const int) +0:? 'int16_t_to_uint16_t' ( const uint16_t) +0:? -2 (const int) +0:? 'int32_t_to_uint16_t' ( const uint16_t) +0:? -3 (const int) +0:? 'int64_t_to_uint16_t' ( const uint16_t) +0:? -4 (const int64_t) +0:? 'uint8_t_to_uint16_t' ( const uint16_t) +0:? 1 (const int) +0:? 'uint16_t_to_uint16_t' ( const uint16_t) +0:? 2 (const int) +0:? 'uint32_t_to_uint16_t' ( const uint16_t) +0:? 3 (const uint) +0:? 'uint64_t_to_uint16_t' ( const uint16_t) +0:? 4 (const uint64_t) +0:? 'float16_t_to_uint16_t' ( const uint16_t) +0:? 42.000000 +0:? 'float32_t_to_uint16_t' ( const uint16_t) +0:? 13.000000 +0:? 'float64_t_to_uint16_t' ( const uint16_t) +0:? -4.000000 +0:? 'bool_to_uint32_t' ( const uint) +0:? 1 (const uint) +0:? 'int8_t_to_uint32_t' ( const uint) +0:? -1 (const int) +0:? 'int16_t_to_uint32_t' ( const uint) +0:? -2 (const int) +0:? 'int32_t_to_uint32_t' ( const uint) +0:? 4294967293 (const uint) +0:? 'int64_t_to_uint32_t' ( const uint) +0:? 4294967292 (const uint) +0:? 'uint8_t_to_uint32_t' ( const uint) +0:? 1 (const int) +0:? 'uint16_t_to_uint32_t' ( const uint) +0:? 2 (const int) +0:? 'uint32_t_to_uint32_t' ( const uint) +0:? 3 (const uint) +0:? 'uint64_t_to_uint32_t' ( const uint) +0:? 4 (const uint) +0:? 'float16_t_to_uint32_t' ( const uint) +0:? 42 (const uint) +0:? 'float32_t_to_uint32_t' ( const uint) +0:? 13 (const uint) +0:? 'float64_t_to_uint32_t' ( const uint) +0:? 4294967292 (const uint) +0:? 'bool_to_uint64_t' ( const uint64_t) +0:? 1 (const uint64_t) +0:? 'int8_t_to_uint64_t' ( const uint64_t) +0:? -1 (const int) +0:? 'int16_t_to_uint64_t' ( const uint64_t) +0:? -2 (const int) +0:? 'int32_t_to_uint64_t' ( const uint64_t) +0:? 18446744073709551613 (const uint64_t) +0:? 'int64_t_to_uint64_t' ( const uint64_t) +0:? 18446744073709551612 (const uint64_t) +0:? 'uint8_t_to_uint64_t' ( const uint64_t) +0:? 1 (const int) +0:? 'uint16_t_to_uint64_t' ( const uint64_t) +0:? 2 (const int) +0:? 'uint32_t_to_uint64_t' ( const uint64_t) +0:? 3 (const uint64_t) +0:? 'uint64_t_to_uint64_t' ( const uint64_t) +0:? 4 (const uint64_t) +0:? 'float16_t_to_uint64_t' ( const uint64_t) +0:? 42 (const uint64_t) +0:? 'float32_t_to_uint64_t' ( const uint64_t) +0:? 13 (const uint64_t) +0:? 'float64_t_to_uint64_t' ( const uint64_t) +0:? 18446744073709551612 (const uint64_t) +0:? 'bool_to_float16_t' ( const float16_t) +0:? 1.000000 +0:? 'int8_t_to_float16_t' ( const float16_t) +0:? -1 (const int) +0:? 'int16_t_to_float16_t' ( const float16_t) +0:? -2 (const int) +0:? 'int32_t_to_float16_t' ( const float16_t) +0:? -3.000000 +0:? 'int64_t_to_float16_t' ( const float16_t) +0:? -4.000000 +0:? 'uint8_t_to_float16_t' ( const float16_t) +0:? 1 (const int) +0:? 'uint16_t_to_float16_t' ( const float16_t) +0:? 2 (const int) +0:? 'uint32_t_to_float16_t' ( const float16_t) +0:? 3.000000 +0:? 'uint64_t_to_float16_t' ( const float16_t) +0:? 4.000000 +0:? 'float16_t_to_float16_t' ( const float16_t) +0:? 42.000000 +0:? 'float32_t_to_float16_t' ( const float16_t) +0:? 13.000000 +0:? 'float64_t_to_float16_t' ( const float16_t) +0:? -4.000000 +0:? 'bool_to_float32_t' ( const float) +0:? 1.000000 +0:? 'int8_t_to_float32_t' ( const float) +0:? -1 (const int) +0:? 'int16_t_to_float32_t' ( const float) +0:? -2 (const int) +0:? 'int32_t_to_float32_t' ( const float) +0:? -3.000000 +0:? 'int64_t_to_float32_t' ( const float) +0:? -4.000000 +0:? 'uint8_t_to_float32_t' ( const float) +0:? 1 (const int) +0:? 'uint16_t_to_float32_t' ( const float) +0:? 2 (const int) +0:? 'uint32_t_to_float32_t' ( const float) +0:? 3.000000 +0:? 'uint64_t_to_float32_t' ( const float) +0:? 4.000000 +0:? 'float16_t_to_float32_t' ( const float) +0:? 42.000000 +0:? 'float32_t_to_float32_t' ( const float) +0:? 13.000000 +0:? 'float64_t_to_float32_t' ( const float) +0:? -4.000000 +0:? 'bool_to_float64_t' ( const double) +0:? 1.000000 +0:? 'int8_t_to_float64_t' ( const double) +0:? -1 (const int) +0:? 'int16_t_to_float64_t' ( const double) +0:? -2 (const int) +0:? 'int32_t_to_float64_t' ( const double) +0:? -3.000000 +0:? 'int64_t_to_float64_t' ( const double) +0:? -4.000000 +0:? 'uint8_t_to_float64_t' ( const double) +0:? 1 (const int) +0:? 'uint16_t_to_float64_t' ( const double) +0:? 2 (const int) +0:? 'uint32_t_to_float64_t' ( const double) +0:? 3.000000 +0:? 'uint64_t_to_float64_t' ( const double) +0:? 4.000000 +0:? 'float16_t_to_float64_t' ( const double) +0:? 42.000000 +0:? 'float32_t_to_float64_t' ( const double) +0:? 13.000000 +0:? 'float64_t_to_float64_t' ( const double) +0:? -4.000000 + + +Linked compute stage: + + +Shader version: 450 +Requested GL_KHX_shader_explicit_arithmetic_types +local_size = (1, 1, 1) +0:? Sequence +0:48 Function Definition: main( ( global void) +0:48 Function Parameters: +0:? Linker Objects +0:? 'bool_init' ( const bool) +0:? true (const bool) +0:? 'int8_t_init' ( const int8_t) +0:? -1 (const int) +0:? 'int16_t_init' ( const int16_t) +0:? -2 (const int) +0:? 'int32_t_init' ( const int) +0:? -3 (const int) +0:? 'int64_t_init' ( const int64_t) +0:? -4 (const int64_t) +0:? 'uint8_t_init' ( const uint8_t) +0:? 1 (const int) +0:? 'uint16_t_init' ( const uint16_t) +0:? 2 (const int) +0:? 'uint32_t_init' ( const uint) +0:? 3 (const uint) +0:? 'uint64_t_init' ( const uint64_t) +0:? 4 (const uint64_t) +0:? 'float16_t_init' ( const float16_t) +0:? 42.000000 +0:? 'float32_t_init' ( const float) +0:? 13.000000 +0:? 'float64_t_init' ( const double) +0:? -4.000000 +0:? 'bool_to_bool' ( const bool) +0:? true (const bool) +0:? 'int8_t_to_bool' ( const bool) +0:? -1 (const int) +0:? 'int16_t_to_bool' ( const bool) +0:? -2 (const int) +0:? 'int32_t_to_bool' ( const bool) +0:? true (const bool) +0:? 'int64_t_to_bool' ( const bool) +0:? true (const bool) +0:? 'uint8_t_to_bool' ( const bool) +0:? 1 (const int) +0:? 'uint16_t_to_bool' ( const bool) +0:? 2 (const int) +0:? 'uint32_t_to_bool' ( const bool) +0:? true (const bool) +0:? 'uint64_t_to_bool' ( const bool) +0:? true (const bool) +0:? 'float16_t_to_bool' ( const bool) +0:? true (const bool) +0:? 'float32_t_to_bool' ( const bool) +0:? true (const bool) +0:? 'float64_t_to_bool' ( const bool) +0:? true (const bool) +0:? 'bool_to_int8_t' ( const int8_t) +0:? true (const bool) +0:? 'int8_t_to_int8_t' ( const int8_t) +0:? -1 (const int) +0:? 'int16_t_to_int8_t' ( const int8_t) +0:? -2 (const int) +0:? 'int32_t_to_int8_t' ( const int8_t) +0:? -3 (const int) +0:? 'int64_t_to_int8_t' ( const int8_t) +0:? -4 (const int64_t) +0:? 'uint8_t_to_int8_t' ( const int8_t) +0:? 1 (const int) +0:? 'uint16_t_to_int8_t' ( const int8_t) +0:? 2 (const int) +0:? 'uint32_t_to_int8_t' ( const int8_t) +0:? 3 (const uint) +0:? 'uint64_t_to_int8_t' ( const int8_t) +0:? 4 (const uint64_t) +0:? 'float16_t_to_int8_t' ( const int8_t) +0:? 42.000000 +0:? 'float32_t_to_int8_t' ( const int8_t) +0:? 13.000000 +0:? 'float64_t_to_int8_t' ( const int8_t) +0:? -4.000000 +0:? 'bool_to_int16_t' ( const int16_t) +0:? true (const bool) +0:? 'int8_t_to_int16_t' ( const int16_t) +0:? -1 (const int) +0:? 'int16_t_to_int16_t' ( const int16_t) +0:? -2 (const int) +0:? 'int32_t_to_int16_t' ( const int16_t) +0:? -3 (const int) +0:? 'int64_t_to_int16_t' ( const int16_t) +0:? -4 (const int64_t) +0:? 'uint8_t_to_int16_t' ( const int16_t) +0:? 1 (const int) +0:? 'uint16_t_to_int16_t' ( const int16_t) +0:? 2 (const int) +0:? 'uint32_t_to_int16_t' ( const int16_t) +0:? 3 (const uint) +0:? 'uint64_t_to_int16_t' ( const int16_t) +0:? 4 (const uint64_t) +0:? 'float16_t_to_int16_t' ( const int16_t) +0:? 42.000000 +0:? 'float32_t_to_int16_t' ( const int16_t) +0:? 13.000000 +0:? 'float64_t_to_int16_t' ( const int16_t) +0:? -4.000000 +0:? 'bool_to_int32_t' ( const int) +0:? 1 (const int) +0:? 'int8_t_to_int32_t' ( const int) +0:? -1 (const int) +0:? 'int16_t_to_int32_t' ( const int) +0:? -2 (const int) +0:? 'int32_t_to_int32_t' ( const int) +0:? -3 (const int) +0:? 'int64_t_to_int32_t' ( const int) +0:? -4 (const int) +0:? 'uint8_t_to_int32_t' ( const int) +0:? 1 (const int) +0:? 'uint16_t_to_int32_t' ( const int) +0:? 2 (const int) +0:? 'uint32_t_to_int32_t' ( const int) +0:? 3 (const int) +0:? 'uint64_t_to_int32_t' ( const int) +0:? 4 (const int) +0:? 'float16_t_to_int32_t' ( const int) +0:? 42 (const int) +0:? 'float32_t_to_int32_t' ( const int) +0:? 13 (const int) +0:? 'float64_t_to_int32_t' ( const int) +0:? -4 (const int) +0:? 'bool_to_int64_t' ( const int64_t) +0:? 1 (const int64_t) +0:? 'int8_t_to_int64_t' ( const int64_t) +0:? -1 (const int) +0:? 'int16_t_to_int64_t' ( const int64_t) +0:? -2 (const int) +0:? 'int32_t_to_int64_t' ( const int64_t) +0:? -3 (const int64_t) +0:? 'int64_t_to_int64_t' ( const int64_t) +0:? -4 (const int64_t) +0:? 'uint8_t_to_int64_t' ( const int64_t) +0:? 1 (const int) +0:? 'uint16_t_to_int64_t' ( const int64_t) +0:? 2 (const int) +0:? 'uint32_t_to_int64_t' ( const int64_t) +0:? 3 (const int64_t) +0:? 'uint64_t_to_int64_t' ( const int64_t) +0:? 4 (const int64_t) +0:? 'float16_t_to_int64_t' ( const int64_t) +0:? 42 (const int64_t) +0:? 'float32_t_to_int64_t' ( const int64_t) +0:? 13 (const int64_t) +0:? 'float64_t_to_int64_t' ( const int64_t) +0:? -4 (const int64_t) +0:? 'bool_to_uint8_t' ( const uint8_t) +0:? true (const bool) +0:? 'int8_t_to_uint8_t' ( const uint8_t) +0:? -1 (const int) +0:? 'int16_t_to_uint8_t' ( const uint8_t) +0:? -2 (const int) +0:? 'int32_t_to_uint8_t' ( const uint8_t) +0:? -3 (const int) +0:? 'int64_t_to_uint8_t' ( const uint8_t) +0:? -4 (const int64_t) +0:? 'uint8_t_to_uint8_t' ( const uint8_t) +0:? 1 (const int) +0:? 'uint16_t_to_uint8_t' ( const uint8_t) +0:? 2 (const int) +0:? 'uint32_t_to_uint8_t' ( const uint8_t) +0:? 3 (const uint) +0:? 'uint64_t_to_uint8_t' ( const uint8_t) +0:? 4 (const uint64_t) +0:? 'float16_t_to_uint8_t' ( const uint8_t) +0:? 42.000000 +0:? 'float32_t_to_uint8_t' ( const uint8_t) +0:? 13.000000 +0:? 'float64_t_to_uint8_t' ( const uint8_t) +0:? -4.000000 +0:? 'bool_to_uint16_t' ( const uint16_t) +0:? true (const bool) +0:? 'int8_t_to_uint16_t' ( const uint16_t) +0:? -1 (const int) +0:? 'int16_t_to_uint16_t' ( const uint16_t) +0:? -2 (const int) +0:? 'int32_t_to_uint16_t' ( const uint16_t) +0:? -3 (const int) +0:? 'int64_t_to_uint16_t' ( const uint16_t) +0:? -4 (const int64_t) +0:? 'uint8_t_to_uint16_t' ( const uint16_t) +0:? 1 (const int) +0:? 'uint16_t_to_uint16_t' ( const uint16_t) +0:? 2 (const int) +0:? 'uint32_t_to_uint16_t' ( const uint16_t) +0:? 3 (const uint) +0:? 'uint64_t_to_uint16_t' ( const uint16_t) +0:? 4 (const uint64_t) +0:? 'float16_t_to_uint16_t' ( const uint16_t) +0:? 42.000000 +0:? 'float32_t_to_uint16_t' ( const uint16_t) +0:? 13.000000 +0:? 'float64_t_to_uint16_t' ( const uint16_t) +0:? -4.000000 +0:? 'bool_to_uint32_t' ( const uint) +0:? 1 (const uint) +0:? 'int8_t_to_uint32_t' ( const uint) +0:? -1 (const int) +0:? 'int16_t_to_uint32_t' ( const uint) +0:? -2 (const int) +0:? 'int32_t_to_uint32_t' ( const uint) +0:? 4294967293 (const uint) +0:? 'int64_t_to_uint32_t' ( const uint) +0:? 4294967292 (const uint) +0:? 'uint8_t_to_uint32_t' ( const uint) +0:? 1 (const int) +0:? 'uint16_t_to_uint32_t' ( const uint) +0:? 2 (const int) +0:? 'uint32_t_to_uint32_t' ( const uint) +0:? 3 (const uint) +0:? 'uint64_t_to_uint32_t' ( const uint) +0:? 4 (const uint) +0:? 'float16_t_to_uint32_t' ( const uint) +0:? 42 (const uint) +0:? 'float32_t_to_uint32_t' ( const uint) +0:? 13 (const uint) +0:? 'float64_t_to_uint32_t' ( const uint) +0:? 4294967292 (const uint) +0:? 'bool_to_uint64_t' ( const uint64_t) +0:? 1 (const uint64_t) +0:? 'int8_t_to_uint64_t' ( const uint64_t) +0:? -1 (const int) +0:? 'int16_t_to_uint64_t' ( const uint64_t) +0:? -2 (const int) +0:? 'int32_t_to_uint64_t' ( const uint64_t) +0:? 18446744073709551613 (const uint64_t) +0:? 'int64_t_to_uint64_t' ( const uint64_t) +0:? 18446744073709551612 (const uint64_t) +0:? 'uint8_t_to_uint64_t' ( const uint64_t) +0:? 1 (const int) +0:? 'uint16_t_to_uint64_t' ( const uint64_t) +0:? 2 (const int) +0:? 'uint32_t_to_uint64_t' ( const uint64_t) +0:? 3 (const uint64_t) +0:? 'uint64_t_to_uint64_t' ( const uint64_t) +0:? 4 (const uint64_t) +0:? 'float16_t_to_uint64_t' ( const uint64_t) +0:? 42 (const uint64_t) +0:? 'float32_t_to_uint64_t' ( const uint64_t) +0:? 13 (const uint64_t) +0:? 'float64_t_to_uint64_t' ( const uint64_t) +0:? 18446744073709551612 (const uint64_t) +0:? 'bool_to_float16_t' ( const float16_t) +0:? 1.000000 +0:? 'int8_t_to_float16_t' ( const float16_t) +0:? -1 (const int) +0:? 'int16_t_to_float16_t' ( const float16_t) +0:? -2 (const int) +0:? 'int32_t_to_float16_t' ( const float16_t) +0:? -3.000000 +0:? 'int64_t_to_float16_t' ( const float16_t) +0:? -4.000000 +0:? 'uint8_t_to_float16_t' ( const float16_t) +0:? 1 (const int) +0:? 'uint16_t_to_float16_t' ( const float16_t) +0:? 2 (const int) +0:? 'uint32_t_to_float16_t' ( const float16_t) +0:? 3.000000 +0:? 'uint64_t_to_float16_t' ( const float16_t) +0:? 4.000000 +0:? 'float16_t_to_float16_t' ( const float16_t) +0:? 42.000000 +0:? 'float32_t_to_float16_t' ( const float16_t) +0:? 13.000000 +0:? 'float64_t_to_float16_t' ( const float16_t) +0:? -4.000000 +0:? 'bool_to_float32_t' ( const float) +0:? 1.000000 +0:? 'int8_t_to_float32_t' ( const float) +0:? -1 (const int) +0:? 'int16_t_to_float32_t' ( const float) +0:? -2 (const int) +0:? 'int32_t_to_float32_t' ( const float) +0:? -3.000000 +0:? 'int64_t_to_float32_t' ( const float) +0:? -4.000000 +0:? 'uint8_t_to_float32_t' ( const float) +0:? 1 (const int) +0:? 'uint16_t_to_float32_t' ( const float) +0:? 2 (const int) +0:? 'uint32_t_to_float32_t' ( const float) +0:? 3.000000 +0:? 'uint64_t_to_float32_t' ( const float) +0:? 4.000000 +0:? 'float16_t_to_float32_t' ( const float) +0:? 42.000000 +0:? 'float32_t_to_float32_t' ( const float) +0:? 13.000000 +0:? 'float64_t_to_float32_t' ( const float) +0:? -4.000000 +0:? 'bool_to_float64_t' ( const double) +0:? 1.000000 +0:? 'int8_t_to_float64_t' ( const double) +0:? -1 (const int) +0:? 'int16_t_to_float64_t' ( const double) +0:? -2 (const int) +0:? 'int32_t_to_float64_t' ( const double) +0:? -3.000000 +0:? 'int64_t_to_float64_t' ( const double) +0:? -4.000000 +0:? 'uint8_t_to_float64_t' ( const double) +0:? 1 (const int) +0:? 'uint16_t_to_float64_t' ( const double) +0:? 2 (const int) +0:? 'uint32_t_to_float64_t' ( const double) +0:? 3.000000 +0:? 'uint64_t_to_float64_t' ( const double) +0:? 4.000000 +0:? 'float16_t_to_float64_t' ( const double) +0:? 42.000000 +0:? 'float32_t_to_float64_t' ( const double) +0:? 13.000000 +0:? 'float64_t_to_float64_t' ( const double) +0:? -4.000000 + diff --git a/Test/baseResults/spv.16bitstorage-int.frag.out b/Test/baseResults/spv.16bitstorage-int.frag.out index 1b2a16b..3f0fffd 100644 --- a/Test/baseResults/spv.16bitstorage-int.frag.out +++ b/Test/baseResults/spv.16bitstorage-int.frag.out @@ -1,7 +1,7 @@ spv.16bitstorage-int.frag // Module Version 10000 // Generated by (magic number): 80007 -// Id's are bound by 171 +// Id's are bound by 172 Capability Shader Capability StorageUniformBufferBlock16 @@ -204,7 +204,10 @@ spv.16bitstorage-int.frag 114: 20(int) Constant 7 115: 20(int) Constant 6 116: TypePointer Uniform 20(int) - 166: 39(ivec2) ConstantComposite 32 33 + 166: 6(int16_t) Constant 1 + 167: 6(int16_t) Constant 2 + 168: 7(i16vec2) ConstantComposite 166 167 + 170: 6(int16_t) Constant 3 4(main): 2 Function None 3 5: Label 69(x0): 68(ptr) Variable Function @@ -324,11 +327,9 @@ spv.16bitstorage-int.frag 164: 6(int16_t) Load 163 165: 28(ptr) AccessChain 19(b2) 21 Store 165 164 - 167: 7(i16vec2) SConvert 166 - 168: 42(ptr) AccessChain 19(b2) 32 - Store 168 167 - 169: 6(int16_t) SConvert 58 - 170: 28(ptr) AccessChain 19(b2) 21 - Store 170 169 + 169: 42(ptr) AccessChain 19(b2) 32 + Store 169 168 + 171: 28(ptr) AccessChain 19(b2) 21 + Store 171 170 Return FunctionEnd diff --git a/Test/baseResults/spv.16bitstorage-uint.frag.out b/Test/baseResults/spv.16bitstorage-uint.frag.out index f935f26..c07edaa 100644 --- a/Test/baseResults/spv.16bitstorage-uint.frag.out +++ b/Test/baseResults/spv.16bitstorage-uint.frag.out @@ -205,8 +205,10 @@ spv.16bitstorage-uint.frag 115: 20(int) Constant 7 116: 20(int) Constant 6 117: TypePointer Uniform 9(int) - 167: 39(ivec2) ConstantComposite 82 10 - 170: 9(int) Constant 3 + 167: 6(int16_t) Constant 1 + 168: 6(int16_t) Constant 2 + 169: 7(i16vec2) ConstantComposite 167 168 + 171: 6(int16_t) Constant 3 4(main): 2 Function None 3 5: Label 69(x0): 68(ptr) Variable Function @@ -326,10 +328,8 @@ spv.16bitstorage-uint.frag 165: 6(int16_t) Load 164 166: 28(ptr) AccessChain 19(b2) 21 Store 166 165 - 168: 7(i16vec2) UConvert 167 - 169: 42(ptr) AccessChain 19(b2) 32 - Store 169 168 - 171: 6(int16_t) UConvert 170 + 170: 42(ptr) AccessChain 19(b2) 32 + Store 170 169 172: 28(ptr) AccessChain 19(b2) 21 Store 172 171 Return diff --git a/Test/baseResults/spv.16bitstorage.frag.out b/Test/baseResults/spv.16bitstorage.frag.out index d2a83ba..2d5487f 100644 --- a/Test/baseResults/spv.16bitstorage.frag.out +++ b/Test/baseResults/spv.16bitstorage.frag.out @@ -1,7 +1,7 @@ spv.16bitstorage.frag // Module Version 10000 // Generated by (magic number): 80007 -// Id's are bound by 173 +// Id's are bound by 172 Capability Shader Capability StorageUniformBufferBlock16 @@ -204,9 +204,10 @@ spv.16bitstorage.frag 114: 20(int) Constant 7 115: 20(int) Constant 6 116: TypePointer Uniform 20(int) - 166: 37(float) Constant 1073741824 - 167: 40(fvec2) ConstantComposite 83 166 - 170: 37(float) Constant 1077936128 + 166:6(float16_t) Constant 15360 + 167:6(float16_t) Constant 16384 + 168: 7(f16vec2) ConstantComposite 166 167 + 170:6(float16_t) Constant 16896 4(main): 2 Function None 3 5: Label 70(x0): 69(ptr) Variable Function @@ -326,11 +327,9 @@ spv.16bitstorage.frag 164:6(float16_t) Load 163 165: 28(ptr) AccessChain 19(b2) 21 Store 165 164 - 168: 7(f16vec2) FConvert 167 169: 43(ptr) AccessChain 19(b2) 32 Store 169 168 - 171:6(float16_t) FConvert 170 - 172: 28(ptr) AccessChain 19(b2) 21 - Store 172 171 + 171: 28(ptr) AccessChain 19(b2) 21 + Store 171 170 Return FunctionEnd diff --git a/Test/baseResults/spv.8bitstorage-int.frag.out b/Test/baseResults/spv.8bitstorage-int.frag.out index 96cb2ae..a0af75a 100644 --- a/Test/baseResults/spv.8bitstorage-int.frag.out +++ b/Test/baseResults/spv.8bitstorage-int.frag.out @@ -1,7 +1,7 @@ spv.8bitstorage-int.frag // Module Version 10000 // Generated by (magic number): 80007 -// Id's are bound by 171 +// Id's are bound by 172 Capability Shader Capability CapabilityUniformAndStorageBuffer8BitAccess @@ -203,7 +203,10 @@ spv.8bitstorage-int.frag 114: 20(int) Constant 7 115: 20(int) Constant 6 116: TypePointer Uniform 20(int) - 166: 39(ivec2) ConstantComposite 32 33 + 166: 6(int8_t) Constant 1 + 167: 6(int8_t) Constant 2 + 168: 7(i8vec2) ConstantComposite 166 167 + 170: 6(int8_t) Constant 3 4(main): 2 Function None 3 5: Label 69(x0): 68(ptr) Variable Function @@ -323,11 +326,9 @@ spv.8bitstorage-int.frag 164: 6(int8_t) Load 163 165: 28(ptr) AccessChain 19(b2) 21 Store 165 164 - 167: 7(i8vec2) SConvert 166 - 168: 42(ptr) AccessChain 19(b2) 32 - Store 168 167 - 169: 6(int8_t) SConvert 58 - 170: 28(ptr) AccessChain 19(b2) 21 - Store 170 169 + 169: 42(ptr) AccessChain 19(b2) 32 + Store 169 168 + 171: 28(ptr) AccessChain 19(b2) 21 + Store 171 170 Return FunctionEnd diff --git a/Test/baseResults/spv.8bitstorage-uint.frag.out b/Test/baseResults/spv.8bitstorage-uint.frag.out index 415bada..12c390a 100644 --- a/Test/baseResults/spv.8bitstorage-uint.frag.out +++ b/Test/baseResults/spv.8bitstorage-uint.frag.out @@ -204,8 +204,10 @@ spv.8bitstorage-uint.frag 115: 20(int) Constant 7 116: 20(int) Constant 6 117: TypePointer Uniform 9(int) - 167: 39(ivec2) ConstantComposite 82 10 - 170: 9(int) Constant 3 + 167: 6(int8_t) Constant 1 + 168: 6(int8_t) Constant 2 + 169: 7(i8vec2) ConstantComposite 167 168 + 171: 6(int8_t) Constant 3 4(main): 2 Function None 3 5: Label 69(x0): 68(ptr) Variable Function @@ -325,10 +327,8 @@ spv.8bitstorage-uint.frag 165: 6(int8_t) Load 164 166: 28(ptr) AccessChain 19(b2) 21 Store 166 165 - 168: 7(i8vec2) UConvert 167 - 169: 42(ptr) AccessChain 19(b2) 32 - Store 169 168 - 171: 6(int8_t) UConvert 170 + 170: 42(ptr) AccessChain 19(b2) 32 + Store 170 169 172: 28(ptr) AccessChain 19(b2) 21 Store 172 171 Return diff --git a/Test/constantUnaryConversion.comp b/Test/constantUnaryConversion.comp new file mode 100644 index 0000000..467b6f6 --- /dev/null +++ b/Test/constantUnaryConversion.comp @@ -0,0 +1,48 @@ +#version 450 + +#extension GL_KHX_shader_explicit_arithmetic_types : require + +const bool bool_init = true; +const int8_t int8_t_init = int8_t(-1); +const int16_t int16_t_init = int16_t(-2); +const int32_t int32_t_init = int32_t(-3); +const int64_t int64_t_init = int64_t(-4); +const uint8_t uint8_t_init = uint8_t(1); +const uint16_t uint16_t_init = uint16_t(2); +const uint32_t uint32_t_init = uint32_t(3); +const uint64_t uint64_t_init = uint64_t(4); +const float16_t float16_t_init = float16_t(42.0); +const float32_t float32_t_init = float32_t(13.0); +const float64_t float64_t_init = float64_t(-4.0); + +#define TYPE_TO_TYPE(x, y) \ + const x y##_to_##x = x(y##_init) + +#define TYPE_TO(x) \ + TYPE_TO_TYPE(x, bool); \ + TYPE_TO_TYPE(x, int8_t); \ + TYPE_TO_TYPE(x, int16_t); \ + TYPE_TO_TYPE(x, int32_t); \ + TYPE_TO_TYPE(x, int64_t); \ + TYPE_TO_TYPE(x, uint8_t); \ + TYPE_TO_TYPE(x, uint16_t); \ + TYPE_TO_TYPE(x, uint32_t); \ + TYPE_TO_TYPE(x, uint64_t); \ + TYPE_TO_TYPE(x, float16_t); \ + TYPE_TO_TYPE(x, float32_t); \ + TYPE_TO_TYPE(x, float64_t) + +TYPE_TO(bool); +TYPE_TO(int8_t); +TYPE_TO(int16_t); +TYPE_TO(int32_t); +TYPE_TO(int64_t); +TYPE_TO(uint8_t); +TYPE_TO(uint16_t); +TYPE_TO(uint32_t); +TYPE_TO(uint64_t); +TYPE_TO(float16_t); +TYPE_TO(float32_t); +TYPE_TO(float64_t); + +void main() {} diff --git a/glslang/MachineIndependent/Constant.cpp b/glslang/MachineIndependent/Constant.cpp index b33af84..2c5aea8 100644 --- a/glslang/MachineIndependent/Constant.cpp +++ b/glslang/MachineIndependent/Constant.cpp @@ -670,6 +670,279 @@ TIntermTyped* TIntermConstantUnion::fold(TOperator op, const TType& returnType) break; } + case EOpConvInt8ToBool: + newConstArray[i].setBConst(unionArray[i].getI8Const()); break; + case EOpConvUint8ToBool: + newConstArray[i].setBConst(unionArray[i].getU8Const()); break; + case EOpConvInt16ToBool: + newConstArray[i].setBConst(unionArray[i].getI16Const()); break; + case EOpConvUint16ToBool: + newConstArray[i].setBConst(unionArray[i].getU16Const()); break; + case EOpConvIntToBool: + newConstArray[i].setBConst(unionArray[i].getIConst()); break; + case EOpConvUintToBool: + newConstArray[i].setBConst(unionArray[i].getUConst()); break; + case EOpConvInt64ToBool: + newConstArray[i].setBConst(unionArray[i].getI64Const()); break; + case EOpConvUint64ToBool: + newConstArray[i].setBConst(unionArray[i].getI64Const()); break; + case EOpConvFloat16ToBool: + newConstArray[i].setBConst(unionArray[i].getDConst()); break; + case EOpConvFloatToBool: + newConstArray[i].setBConst(unionArray[i].getDConst()); break; + case EOpConvDoubleToBool: + newConstArray[i].setBConst(unionArray[i].getDConst()); break; + + case EOpConvBoolToInt8: + newConstArray[i].setI8Const(unionArray[i].getBConst()); break; + case EOpConvBoolToUint8: + newConstArray[i].setU8Const(unionArray[i].getBConst()); break; + case EOpConvBoolToInt16: + newConstArray[i].setI16Const(unionArray[i].getBConst()); break; + case EOpConvBoolToUint16: + newConstArray[i].setU16Const(unionArray[i].getBConst()); break; + case EOpConvBoolToInt: + newConstArray[i].setIConst(unionArray[i].getBConst()); break; + case EOpConvBoolToUint: + newConstArray[i].setUConst(unionArray[i].getBConst()); break; + case EOpConvBoolToInt64: + newConstArray[i].setI64Const(unionArray[i].getBConst()); break; + case EOpConvBoolToUint64: + newConstArray[i].setU64Const(unionArray[i].getBConst()); break; + case EOpConvBoolToFloat16: + newConstArray[i].setDConst(unionArray[i].getBConst()); break; + case EOpConvBoolToFloat: + newConstArray[i].setDConst(unionArray[i].getBConst()); break; + case EOpConvBoolToDouble: + newConstArray[i].setDConst(unionArray[i].getBConst()); break; + + case EOpConvInt8ToInt16: + newConstArray[i].setI16Const(unionArray[i].getI8Const()); break; + case EOpConvInt8ToInt: + newConstArray[i].setIConst(unionArray[i].getI8Const()); break; + case EOpConvInt8ToInt64: + newConstArray[i].setI64Const(unionArray[i].getI8Const()); break; + case EOpConvInt8ToUint8: + newConstArray[i].setU8Const(unionArray[i].getI8Const()); break; + case EOpConvInt8ToUint16: + newConstArray[i].setU16Const(unionArray[i].getI8Const()); break; + case EOpConvInt8ToUint: + newConstArray[i].setUConst(unionArray[i].getI8Const()); break; + case EOpConvInt8ToUint64: + newConstArray[i].setU64Const(unionArray[i].getI8Const()); break; + case EOpConvUint8ToInt8: + newConstArray[i].setI8Const(unionArray[i].getU8Const()); break; + case EOpConvUint8ToInt16: + newConstArray[i].setI16Const(unionArray[i].getU8Const()); break; + case EOpConvUint8ToInt: + newConstArray[i].setIConst(unionArray[i].getU8Const()); break; + case EOpConvUint8ToInt64: + newConstArray[i].setI64Const(unionArray[i].getU8Const()); break; + case EOpConvUint8ToUint16: + newConstArray[i].setU16Const(unionArray[i].getU8Const()); break; + case EOpConvUint8ToUint: + newConstArray[i].setUConst(unionArray[i].getU8Const()); break; + case EOpConvUint8ToUint64: + newConstArray[i].setU64Const(unionArray[i].getU8Const()); break; + case EOpConvInt8ToFloat16: + newConstArray[i].setDConst(unionArray[i].getI8Const()); break; + case EOpConvInt8ToFloat: + newConstArray[i].setDConst(unionArray[i].getI8Const()); break; + case EOpConvInt8ToDouble: + newConstArray[i].setDConst(unionArray[i].getI8Const()); break; + case EOpConvUint8ToFloat16: + newConstArray[i].setDConst(unionArray[i].getU8Const()); break; + case EOpConvUint8ToFloat: + newConstArray[i].setDConst(unionArray[i].getU8Const()); break; + case EOpConvUint8ToDouble: + newConstArray[i].setDConst(unionArray[i].getU8Const()); break; + + case EOpConvInt16ToInt8: + newConstArray[i].setI8Const(static_cast(unionArray[i].getI16Const())); break; + case EOpConvInt16ToInt: + newConstArray[i].setIConst(unionArray[i].getI16Const()); break; + case EOpConvInt16ToInt64: + newConstArray[i].setI64Const(unionArray[i].getI16Const()); break; + case EOpConvInt16ToUint8: + newConstArray[i].setU8Const(static_cast(unionArray[i].getI16Const())); break; + case EOpConvInt16ToUint16: + newConstArray[i].setU16Const(unionArray[i].getI16Const()); break; + case EOpConvInt16ToUint: + newConstArray[i].setUConst(unionArray[i].getI16Const()); break; + case EOpConvInt16ToUint64: + newConstArray[i].setU64Const(unionArray[i].getI16Const()); break; + case EOpConvUint16ToInt8: + newConstArray[i].setI8Const(static_cast(unionArray[i].getU16Const())); break; + case EOpConvUint16ToInt16: + newConstArray[i].setI16Const(unionArray[i].getU16Const()); break; + case EOpConvUint16ToInt: + newConstArray[i].setIConst(unionArray[i].getU16Const()); break; + case EOpConvUint16ToInt64: + newConstArray[i].setI64Const(unionArray[i].getU16Const()); break; + case EOpConvUint16ToUint8: + newConstArray[i].setU8Const(static_cast(unionArray[i].getU16Const())); break; + + case EOpConvUint16ToUint: + newConstArray[i].setUConst(unionArray[i].getU16Const()); break; + case EOpConvUint16ToUint64: + newConstArray[i].setU64Const(unionArray[i].getU16Const()); break; + case EOpConvInt16ToFloat16: + newConstArray[i].setDConst(unionArray[i].getI16Const()); break; + case EOpConvInt16ToFloat: + newConstArray[i].setDConst(unionArray[i].getI16Const()); break; + case EOpConvInt16ToDouble: + newConstArray[i].setDConst(unionArray[i].getI16Const()); break; + case EOpConvUint16ToFloat16: + newConstArray[i].setDConst(unionArray[i].getU16Const()); break; + case EOpConvUint16ToFloat: + newConstArray[i].setDConst(unionArray[i].getU16Const()); break; + case EOpConvUint16ToDouble: + newConstArray[i].setDConst(unionArray[i].getU16Const()); break; + + case EOpConvIntToInt8: + newConstArray[i].setI8Const(unionArray[i].getIConst()); break; + case EOpConvIntToInt16: + newConstArray[i].setI16Const(unionArray[i].getIConst()); break; + case EOpConvIntToInt64: + newConstArray[i].setI64Const(unionArray[i].getIConst()); break; + case EOpConvIntToUint8: + newConstArray[i].setU8Const(unionArray[i].getIConst()); break; + case EOpConvIntToUint16: + newConstArray[i].setU16Const(unionArray[i].getIConst()); break; + case EOpConvIntToUint: + newConstArray[i].setUConst(unionArray[i].getIConst()); break; + case EOpConvIntToUint64: + newConstArray[i].setU64Const(unionArray[i].getIConst()); break; + + case EOpConvUintToInt8: + newConstArray[i].setI8Const(unionArray[i].getUConst()); break; + case EOpConvUintToInt16: + newConstArray[i].setI16Const(unionArray[i].getUConst()); break; + case EOpConvUintToInt: + newConstArray[i].setIConst(unionArray[i].getUConst()); break; + case EOpConvUintToInt64: + newConstArray[i].setI64Const(unionArray[i].getUConst()); break; + case EOpConvUintToUint8: + newConstArray[i].setU8Const(unionArray[i].getUConst()); break; + case EOpConvUintToUint16: + newConstArray[i].setU16Const(unionArray[i].getUConst()); break; + case EOpConvUintToUint64: + newConstArray[i].setU64Const(unionArray[i].getUConst()); break; + case EOpConvIntToFloat16: + newConstArray[i].setDConst(unionArray[i].getIConst()); break; + case EOpConvIntToFloat: + newConstArray[i].setDConst(unionArray[i].getIConst()); break; + case EOpConvIntToDouble: + newConstArray[i].setDConst(unionArray[i].getIConst()); break; + case EOpConvUintToFloat16: + newConstArray[i].setDConst(unionArray[i].getUConst()); break; + case EOpConvUintToFloat: + newConstArray[i].setDConst(unionArray[i].getUConst()); break; + case EOpConvUintToDouble: + newConstArray[i].setDConst(unionArray[i].getUConst()); break; + case EOpConvInt64ToInt8: + newConstArray[i].setI8Const(static_cast(unionArray[i].getI64Const())); break; + case EOpConvInt64ToInt16: + newConstArray[i].setI16Const(static_cast(unionArray[i].getI64Const())); break; + case EOpConvInt64ToInt: + newConstArray[i].setIConst(static_cast(unionArray[i].getI64Const())); break; + case EOpConvInt64ToUint8: + newConstArray[i].setU8Const(static_cast(unionArray[i].getI64Const())); break; + case EOpConvInt64ToUint16: + newConstArray[i].setU16Const(static_cast(unionArray[i].getI64Const())); break; + case EOpConvInt64ToUint: + newConstArray[i].setUConst(static_cast(unionArray[i].getI64Const())); break; + case EOpConvInt64ToUint64: + newConstArray[i].setU64Const(unionArray[i].getI64Const()); break; + case EOpConvUint64ToInt8: + newConstArray[i].setI8Const(static_cast(unionArray[i].getU64Const())); break; + case EOpConvUint64ToInt16: + newConstArray[i].setI16Const(static_cast(unionArray[i].getU64Const())); break; + case EOpConvUint64ToInt: + newConstArray[i].setIConst(static_cast(unionArray[i].getU64Const())); break; + case EOpConvUint64ToInt64: + newConstArray[i].setI64Const(unionArray[i].getU64Const()); break; + case EOpConvUint64ToUint8: + newConstArray[i].setU8Const(static_cast(unionArray[i].getU64Const())); break; + case EOpConvUint64ToUint16: + newConstArray[i].setU16Const(static_cast(unionArray[i].getU64Const())); break; + case EOpConvUint64ToUint: + newConstArray[i].setUConst(static_cast(unionArray[i].getU64Const())); break; + case EOpConvInt64ToFloat16: + newConstArray[i].setDConst(static_cast(unionArray[i].getI64Const())); break; + case EOpConvInt64ToFloat: + newConstArray[i].setDConst(static_cast(unionArray[i].getI64Const())); break; + case EOpConvInt64ToDouble: + newConstArray[i].setDConst(static_cast(unionArray[i].getI64Const())); break; + case EOpConvUint64ToFloat16: + newConstArray[i].setDConst(static_cast(unionArray[i].getU64Const())); break; + case EOpConvUint64ToFloat: + newConstArray[i].setDConst(static_cast(unionArray[i].getU64Const())); break; + case EOpConvUint64ToDouble: + newConstArray[i].setDConst(static_cast(unionArray[i].getU64Const())); break; + case EOpConvFloat16ToInt8: + newConstArray[i].setI8Const(static_cast(unionArray[i].getDConst())); break; + case EOpConvFloat16ToInt16: + newConstArray[i].setI16Const(static_cast(unionArray[i].getDConst())); break; + case EOpConvFloat16ToInt: + newConstArray[i].setIConst(static_cast(unionArray[i].getDConst())); break; + case EOpConvFloat16ToInt64: + newConstArray[i].setI64Const(static_cast(unionArray[i].getDConst())); break; + case EOpConvFloat16ToUint8: + newConstArray[i].setU8Const(static_cast(unionArray[i].getDConst())); break; + case EOpConvFloat16ToUint16: + newConstArray[i].setU16Const(static_cast(unionArray[i].getDConst())); break; + case EOpConvFloat16ToUint: + newConstArray[i].setUConst(static_cast(unionArray[i].getDConst())); break; + case EOpConvFloat16ToUint64: + newConstArray[i].setU64Const(static_cast(unionArray[i].getDConst())); break; + case EOpConvFloat16ToFloat: + newConstArray[i].setDConst(unionArray[i].getDConst()); break; + case EOpConvFloat16ToDouble: + newConstArray[i].setDConst(unionArray[i].getDConst()); break; + case EOpConvFloatToInt8: + newConstArray[i].setI8Const(static_cast(unionArray[i].getDConst())); break; + case EOpConvFloatToInt16: + newConstArray[i].setI16Const(static_cast(unionArray[i].getDConst())); break; + case EOpConvFloatToInt: + newConstArray[i].setIConst(static_cast(unionArray[i].getDConst())); break; + case EOpConvFloatToInt64: + newConstArray[i].setI64Const(static_cast(unionArray[i].getDConst())); break; + case EOpConvFloatToUint8: + newConstArray[i].setU8Const(static_cast(unionArray[i].getDConst())); break; + case EOpConvFloatToUint16: + newConstArray[i].setU16Const(static_cast(unionArray[i].getDConst())); break; + case EOpConvFloatToUint: + newConstArray[i].setUConst(static_cast(unionArray[i].getDConst())); break; + case EOpConvFloatToUint64: + newConstArray[i].setU64Const(static_cast(unionArray[i].getDConst())); break; + case EOpConvFloatToFloat16: + newConstArray[i].setDConst(unionArray[i].getDConst()); break; + case EOpConvFloatToDouble: + newConstArray[i].setDConst(unionArray[i].getDConst()); break; + case EOpConvDoubleToInt8: + newConstArray[i].setI8Const(static_cast(unionArray[i].getDConst())); break; + case EOpConvDoubleToInt16: + newConstArray[i].setI16Const(static_cast(unionArray[i].getDConst())); break; + case EOpConvDoubleToInt: + newConstArray[i].setIConst(static_cast(unionArray[i].getDConst())); break; + case EOpConvDoubleToInt64: + newConstArray[i].setI64Const(static_cast(unionArray[i].getDConst())); break; + case EOpConvDoubleToUint8: + newConstArray[i].setU8Const(static_cast(unionArray[i].getDConst())); break; + case EOpConvDoubleToUint16: + newConstArray[i].setU16Const(static_cast(unionArray[i].getDConst())); break; + case EOpConvDoubleToUint: + newConstArray[i].setUConst(static_cast(unionArray[i].getDConst())); break; + case EOpConvDoubleToUint64: + newConstArray[i].setU64Const(static_cast(unionArray[i].getDConst())); break; + case EOpConvDoubleToFloat16: + newConstArray[i].setDConst(unionArray[i].getDConst()); break; + case EOpConvDoubleToFloat: + newConstArray[i].setDConst(unionArray[i].getDConst()); break; + + + // TODO: 3.0 Functionality: unary constant folding: the rest of the ops have to be fleshed out case EOpSinh: diff --git a/glslang/MachineIndependent/Intermediate.cpp b/glslang/MachineIndependent/Intermediate.cpp index 6355f30..46d4812 100644 --- a/glslang/MachineIndependent/Intermediate.cpp +++ b/glslang/MachineIndependent/Intermediate.cpp @@ -489,7 +489,7 @@ bool TIntermediate::isConversionAllowed(TOperator op, TIntermTyped* node) const // This is 'mechanism' here, it does any conversion told. // It is about basic type, not about shape. // The policy comes from the shader or the calling code. -TIntermUnary* TIntermediate::createConversion(TBasicType convertTo, TIntermTyped* node) const +TIntermTyped* TIntermediate::createConversion(TBasicType convertTo, TIntermTyped* node) const { // // Add a new newNode for the conversion. @@ -712,7 +712,11 @@ TIntermUnary* TIntermediate::createConversion(TBasicType convertTo, TIntermTyped TType newType(convertTo, EvqTemporary, node->getVectorSize(), node->getMatrixCols(), node->getMatrixRows()); newNode = addUnaryNode(newOp, node, node->getLoc(), newType); - // TODO: it seems that some unary folding operations should occur here, but are not + if (node->getAsConstantUnion()) { + TIntermTyped* folded = node->getAsConstantUnion()->fold(newOp, newType); + if (folded) + return folded; + } // Propagate specialization-constant-ness, if allowed if (node->getType().getQualifier().isSpecConstant() && isSpecializationOperation(*newNode)) @@ -1021,7 +1025,7 @@ TIntermTyped* TIntermediate::addConversion(TOperator op, const TType& type, TInt // // Add a new newNode for the conversion. // - TIntermUnary* newNode = createConversion(promoteTo, node); + TIntermTyped* newNode = createConversion(promoteTo, node); return newNode; } diff --git a/glslang/MachineIndependent/localintermediate.h b/glslang/MachineIndependent/localintermediate.h index 762b310..ff28c0e 100755 --- a/glslang/MachineIndependent/localintermediate.h +++ b/glslang/MachineIndependent/localintermediate.h @@ -732,7 +732,7 @@ protected: bool specConstantPropagates(const TIntermTyped&, const TIntermTyped&); void performTextureUpgradeAndSamplerRemovalTransformation(TIntermNode* root); bool isConversionAllowed(TOperator op, TIntermTyped* node) const; - TIntermUnary* createConversion(TBasicType convertTo, TIntermTyped* node) const; + TIntermTyped* createConversion(TBasicType convertTo, TIntermTyped* node) const; std::tuple getConversionDestinatonType(TBasicType type0, TBasicType type1, TOperator op) const; bool extensionRequested(const char *extension) const {return requestedExtensions.find(extension) != requestedExtensions.end();} static const char* getResourceName(TResourceType); diff --git a/gtests/AST.FromFile.cpp b/gtests/AST.FromFile.cpp index b89fc51..00bb433 100644 --- a/gtests/AST.FromFile.cpp +++ b/gtests/AST.FromFile.cpp @@ -231,6 +231,7 @@ INSTANTIATE_TEST_CASE_P( "precise_struct_block.vert", "maxClipDistances.vert", "findFunction.frag", + "constantUnaryConversion.comp" })), FileNameAsCustomTestSuffix ); -- 2.7.4