+Conformance Test
+
+ GL_ARB_gl_spirv
+
+Contributors
+
+ Adam Czupryna, Mobica
+
+Contacts
+
+ Adam Czupryna, Mobica (adam.czupryna 'at' mobica.com)
+
+Status
+
+ In review
+
+Version
+
+ July 5, 2017 (version 1)
+
+Dependencies
+
+ OpenGL 4.5 is required.
+
+ ARB_gl_spirv extension is required.
+
+ This specification is written against:
+ - OpenGL 4.5 Core Profile Specification,
+ - version 4.50 (revision 5) Shading Language Specification,
+ - ARB_gl_spirv extension Specification.
+
+Overview
+
+ This test verifies two things:
+
+ 1. Verifies if OpenGL API allows a SPIR-V module to be specified as containing a
+ programmable shader stage, rather than using GLSL, whatever the source language
+ was used to create the SPIR-V module.
+
+ 2. Verifies if GLSL is modified to be a source language for creating SPIR-V
+ modules for OpenGL consumption.
+
+Tests
+
+ SPIR-V Modules Tests
+
+ * Positive Tests
+
+ - Create GLSL shader for each shading stage. Each stage should receive color
+ vector from previous stage and multiply it by constant value greater than 1.
+ First stage should set color components to non zero values. Last stage should
+ draw color to the framebuffer.
+
+ Perform drawing and verify the result. Expect that color read from the
+ framebuffer will be correctly multiplied.
+
+ - Use glslang to compile GLSL shaders to SPIR-V binary modules. Create shader
+ objects using ShaderBinary function with binary format set to
+ SHADER_BINARY_FORMAT_SPIR_V_ARB and specialize it using SpecializeShader
+ function.
+
+ Perform drawing and verify the result. Expect the same result as for
+ previous case.
+
+ * State Queries
+
+ - Verify if GetShaderiv with <pname> set to SPIR_V_BINARY_ARB used on valid
+ shader created using SHADER_BINARY_FORMAT_SPIR_V_ARB binary format will
+ result in TRUE.
+
+ - Verify if ShaderSource function used on shader with SPIR_V_BINARY_ARB state
+ set to TRUE will result in changing SPIR_V_BINARY_ARB state to FALSE.
+
+ - Verify if ShaderSource function used on shader with SPIR_V_BINARY_ARB state
+ set to TRUE will result in changing SPIR_V_BINARY_ARB state to FALSE.
+
+ - Verify if shader compile status is set to TRUE if shader is specialized.
+
+ - Verify if GetShaderInfoLog function return information about the last
+ specialization attempt if SpecializeShader is use in a wrong way.
+
+ - Verify if GetProgramiv function return one for ACTIVE_ATTRIBUTE_MAX_LENGTH
+ <pname> when no name reflection information is available.
+
+ - Verify if GetProgramiv function return one for ACTIVE_UNIFORM_MAX_LENGTH
+ <pname> when no name reflection information is available.
+
+ - Verify if GetProgramiv function return one for TRANSFORM_FEEDBACK_VARYING_MAX_LENGTH
+ <pname> when no name reflection information is available.
+
+ - Verify if GetProgramiv function return one for ACTIVE_UNIFORM_BLOCK_MAX_NAME_LENGTH
+ <pname> when no name reflection information is available.
+
+ * Error Verification
+
+ - Verify if CompileShader function used on shader with SPIR_V_BINARY_ARB state
+ will result in generating INVALID_OPERATION error.
+
+ - Verify if SpecializeShader function generate INVALID_VALUE error when
+ <shader> is not the name of either a program or shader object.
+
+ - Verify if SpecializeShader function generate INVALID_OPERATION error when
+ <shader> is the name of a program object.
+
+ - Verify if SpecializeShader function generate INVALID_OPERATION error when
+ SPIR_V_BINARY_ARB state for <shader> is not TRUE, or if the shader has
+ already been specialized.
+
+ - Verify if SpecializeShader function generate INVALID_VALUE when <pEntryPoint>
+ does not name a valid entry point for <shader>.
+
+ - Verify if SpecializeShader function generate INVALID_VALUE when any element
+ of <pConstantIndex> refers to a specialization constant that does not exist
+ in the shader module contained in <shader>.
+
+ - Verify if LinkProgram fail when one or more of the shader objects attached to
+ <program> are not specialized.
+
+ - Verify if LinkProgram fail when not all of shaders attached to <program> have
+ the same value for the SPIR_V_BINARY_ARB state.
+
+ GLSL to SPIR-V Features Tests
+
+ * Enable SPIR-V Features
+
+ - Create vertex shader that checks if GL_SPIRV is defined and returns error
+ message if not.
+
+ * Built-in Functions
+
+ - Create set of shaders that uses built-in functions listed in section 8 of
+ The OpenGL Shading Language 4.50 specification. Compile shader to SPIR-V
+ binary module using glslang and disassembly module.
+
+ - Verify if no error occured during compilation.
+
+ - Verify if built-in functions are converted from GLSL to SPIR-V as expected.
+
+ * Specialization Constants
+
+ - Create fragment shader with specialized constant floats - one for each color
+ component and forward it to default fragment output as vec4. Compile shader
+ to SPIR-V binary module using glslang. Create shader object and specialize it
+ with different values.
+
+ - Render a fullscreen polygon and read back pixels from framebuffer.
+
+ - Expect that color components of read pixels follows values used in shader
+ specialization.
+
+ SPIR-V Validation
+
+ * SPIR-V Built-In Variable Decorations
+
+ Create SPIR-V modules set that uses built-in variable decorations listed below:
+
+ Built-in Variable Decoration Minimum GL version (Extension)
+ ---------------------------- -----------------------------
+ NumWorkgroups GL 4.3 (ARB_compute_shader)
+ WorkgroupSize GL 4.3 (ARB_compute_shader)
+ WorkgroupId GL 4.3 (ARB_compute_shader)
+ LocalInvocationId GL 4.3 (ARB_compute_shader)
+ GlobalInvocationId GL 4.3 (ARB_compute_shader)
+ LocalInvocationIndex GL 4.3 (ARB_compute_shader)
+ VertexId
+ InstanceId
+ Position
+ PointSize
+ ClipDistance
+ CullDistance GL 4.5 (ARB_cull_distance)
+ PrimitiveId
+ InvocationId GL 4.0 (ARB_tessellation_shader)
+ Layer
+ ViewportIndex GL 4.1 (ARB_viewport_array)
+ PatchVertices GL 4.0 (ARB_tessellation_shader)
+ TessLevelOuter GL 4.0 (ARB_tessellation_shader)
+ TessLevelInner GL 4.0 (ARB_tessellation_shader)
+ TessCoord GL 4.0 (ARB_tessellation_shader)
+ FragCoord
+ FrontFacing
+ PointCoord
+ SampleId GL 4.0 (ARB_sample_shading)
+ SamplePosition GL 4.0 (ARB_sample_shading)
+ SampleMask GL 4.0 (ARB_sample_shading)
+ HelperInvocation GL 4.5 (ARB_ES3_1_compatibility)
+
+ Use SPIR-V modules in apropriate shader stage (adequate to variable it tests).
+ Create program objects and execute them. Make sure that no error occured and
+ the result of program execution is as expected.
+
+ * SPIR-V Capabilities
+
+ Create SPIR-V modules set that capabilities listed below:
+
+ OpCapability Minimum GL version (Extension)
+ ------------------------------ -----------------------------
+ Matrix
+ Shader
+ Geometry
+ Tessellation GL 4.0 (ARB_tessellation_shader)
+ Float64 GL 4.0 (ARB_gpu_shader_fp64)
+ AtomicStorage GL 4.2 (ARB_shader_atomic_counters)
+ TessellationPointSize GL 4.0 (ARB_tessellation_shader)
+ GeometryPointSize
+ ImageGatherExtended GL 4.0 (ARB_gpu_shader5)
+ StorageImageMultisample GL 4.2 (ARB_shader_image_load_store)
+ UniformBufferArrayDynamicIndexing GL 4.0 (ARB_gpu_shader5)
+ SampledImageArrayDynamicIndexing GL 4.0 (ARB_gpu_shader5)
+ StorageBufferArrayDynamicIndexing GL 4.3 (ARB_shader_storage_buffer_object)
+ StorageImageArrayDynamicIndexing GL 4.2 (ARB_shader_image_load_store)
+ ClipDistance
+ CullDistance GL 4.5 (ARB_cull_distance)
+ ImageCubeArray GL 4.0 (ARB_texture_cube_map_array)
+ SampleRateShading GL 4.0 (ARB_sample_shading)
+ ImageRect
+ SampledRect
+ Sampled1D
+ Image1D
+ SampledCubeArray GL 4.0 (ARB_texture_cube_map_array)
+ SampledBuffer
+ ImageBuffer
+ ImageMSArray
+ StorageImageExtendedFormats GL 4.2 (ARB_shader_image_load_store)
+ ImageQuery
+ DerivativeControl GL 4.5 (ARB_derivative_control)
+ InterpolationFunction GL 4.0 (ARB_gpu_shader5)
+ TransformFeedback
+ GeometryStreams GL 4.0 (ARB_gpu_shader5)
+ StorageImageWriteWithoutFormat GL 4.2 (ARB_shader_image_load_store)
+ MultiViewport GL 4.1 (ARB_viewport_array)
+ Int64 (ARB_gpu_shader_int64)
+ SparseResidency (ARB_sparse_texture2)
+ MinLod (ARB_sparse_texture_clamp)
+ StorageImageReadWithoutFormat (EXT_shader_image_load_formatted)
+ Int64Atomics (NV_shader_atomic_int64)
+
+ Use SPIR-V modules in apropriate shader stage (adequate to capability it tests).
+ Create program objects and execute them. Make sure that no error occured and
+ the result of program execution is as expected.
+
+Revision History
+
+ Revision 1, 5 July, 2017 (Adam Czupryna)
+ - Initial version.
+