blob: aedb7d4bda6fe0887b8f67a0983fb5d06b6604e0 [file] [log] [blame]
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.
* Shader Binary Multiple Shader Objects
- Create GLSL shader for at least two shading stages. Use glslang to compile
GLSL shaders to single SPIR-V module. Create shader object for each stage and
perform ShaderBinary function passing shader set as an argument, use
SHADER_BINARY_FORMAT_SPIR_V_ARB binary format. Specialize shader objects
using SpecializeShader function with proper entry point argument for each
shader.
Perform drawing and verify if the result is as expected.
* 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.
NOTE: noise* built-in functions are excluded from testing as they are deprecated.
* 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.