From 6801af4dce61e1fafab045f1ff2a3d6cdc2a8867 Mon Sep 17 00:00:00 2001 From: Hans-Kristian Arntzen Date: Sat, 25 Mar 2017 15:38:20 +0100 Subject: [PATCH 1/2] Fix bitfield functions. --- reference/shaders/comp/bitfield.comp | 19 +++++++++++++++++++ shaders/comp/bitfield.comp | 21 +++++++++++++++++++++ spirv_glsl.cpp | 4 +++- 3 files changed, 43 insertions(+), 1 deletion(-) create mode 100644 reference/shaders/comp/bitfield.comp create mode 100644 shaders/comp/bitfield.comp diff --git a/reference/shaders/comp/bitfield.comp b/reference/shaders/comp/bitfield.comp new file mode 100644 index 00000000..46c83956 --- /dev/null +++ b/reference/shaders/comp/bitfield.comp @@ -0,0 +1,19 @@ +#version 310 es +layout(local_size_x = 1, local_size_y = 1, local_size_z = 1) in; + +void main() +{ + int signed_value = 0; + uint unsigned_value = 0u; + int s = bitfieldExtract(signed_value, 5, 20); + uint u = bitfieldExtract(unsigned_value, 6, 21); + s = bitfieldInsert(s, 40, 5, 4); + u = bitfieldInsert(u, 60u, 5, 4); + u = bitfieldReverse(u); + s = bitfieldReverse(s); + int v0 = bitCount(u); + int v1 = bitCount(s); + int v2 = findMSB(u); + int v3 = findMSB(s); +} + diff --git a/shaders/comp/bitfield.comp b/shaders/comp/bitfield.comp new file mode 100644 index 00000000..cfba289d --- /dev/null +++ b/shaders/comp/bitfield.comp @@ -0,0 +1,21 @@ +#version 310 es + +void main() +{ + int signed_value = 0; + uint unsigned_value = 0u; + + int s = bitfieldExtract(signed_value, 5, 20); + uint u = bitfieldExtract(unsigned_value, 6, 21); + s = bitfieldInsert(s, 40, 5, 4); + u = bitfieldInsert(u, 60u, 5, 4); + + u = bitfieldReverse(u); + s = bitfieldReverse(s); + + int v0 = bitCount(u); + int v1 = bitCount(s); + + int v2 = findMSB(u); + int v3 = findMSB(s); +} diff --git a/spirv_glsl.cpp b/spirv_glsl.cpp index 743f358e..86d2d551 100644 --- a/spirv_glsl.cpp +++ b/spirv_glsl.cpp @@ -5103,12 +5103,14 @@ void CompilerGLSL::emit_instruction(const Instruction &instruction) // Bitfield case OpBitFieldInsert: + // TODO: The signedness of inputs is strict in GLSL, but not in SPIR-V, bitcast if necessary. QFOP(bitfieldInsert); break; case OpBitFieldSExtract: case OpBitFieldUExtract: - QFOP(bitfieldExtract); + // TODO: The signedness of inputs is strict in GLSL, but not in SPIR-V, bitcast if necessary. + TFOP(bitfieldExtract); break; case OpBitReverse: From 24382a8ea25797b68c85c70e0aeb82456fb3669b Mon Sep 17 00:00:00 2001 From: Hans-Kristian Arntzen Date: Sat, 25 Mar 2017 15:46:12 +0100 Subject: [PATCH 2/2] Use findLSB as well in bitfield test. --- reference/shaders/comp/bitfield.comp | 2 +- shaders/comp/bitfield.comp | 2 +- 2 files changed, 2 insertions(+), 2 deletions(-) diff --git a/reference/shaders/comp/bitfield.comp b/reference/shaders/comp/bitfield.comp index 46c83956..49bbddb0 100644 --- a/reference/shaders/comp/bitfield.comp +++ b/reference/shaders/comp/bitfield.comp @@ -14,6 +14,6 @@ void main() int v0 = bitCount(u); int v1 = bitCount(s); int v2 = findMSB(u); - int v3 = findMSB(s); + int v3 = findLSB(s); } diff --git a/shaders/comp/bitfield.comp b/shaders/comp/bitfield.comp index cfba289d..d75b556b 100644 --- a/shaders/comp/bitfield.comp +++ b/shaders/comp/bitfield.comp @@ -17,5 +17,5 @@ void main() int v1 = bitCount(s); int v2 = findMSB(u); - int v3 = findMSB(s); + int v3 = findLSB(s); }