| Conformance Test |
| |
| GL_ARB_fragment_shader_interlock |
| |
| Contributors |
| |
| Adam Czupryna, Mobica |
| |
| Contacts |
| |
| Adam Czupryna, Mobica (adam.czupryna 'at' mobica.com) |
| |
| Status |
| |
| In review |
| |
| Version |
| |
| January 31, 2017 (version 1) |
| |
| Dependencies |
| |
| OpenGL 4.5 is required. |
| |
| ARB_fragment_shader_interlock extension is required. |
| |
| This specification is written against: |
| - OpenGL 4.5 Core Profile Specification, |
| - version 4.50 (revision 5) Shading Language Specification, |
| - ARB_fragment_shader_interlock extension Specification. |
| |
| Overview |
| |
| This test verifies if new GLSL built-in functions |
| beginInvocationInterlockARB() and endInvocationInterlockARB() provides |
| functionality for pairs of shader invocations with "overlapping" |
| coverage in a given pixel, which guarantee that the critical section of |
| the fragment shader will be executed for only one fragment at a time. |
| Test verifies also two ordered interlock modes supported by this |
| extension because testing unordered interlock modes would be |
| undeterministic. |
| |
| Tests |
| |
| Shader Extension Test |
| |
| * Create shader that require GL_ARB_fragment_shader_interlock extension |
| and check if GL_ARB_fragment_shader_interlock is defined and equal 1. |
| Check if shader compiles with no error. |
| |
| Shader Execution Ordering Test |
| |
| * Create 8x8 R8 texture and clear it. |
| |
| * Create fragment shader for ordered layout qualifiers added by this |
| extension. Shader should read pixel value from the texture at current |
| position and compare it with gl_PrimitiveID value. If value read from |
| texture is lower then gl_PrimitiveID write (1, 1, 1, 1) into |
| renderbuffer and store gl_PrimitiveID in the texture at current |
| position, otherwise write (0, 0, 0, 0) into renderbuffer and value 255 |
| into texture at current position. All operations should be executed |
| between beginInvocationInterlockARB and endInvocationInterlockARB |
| functions calls. |
| |
| * Iterate through the fragment shaders, clear texture and for each shader |
| draw three triangles at once in the same position. |
| |
| Expected result for ordered layout qualifires is renderbuffer filled with |
| (1, 1, 1, 1) if test passed. |
| |
| In case of sample_interlock_* qualifier multisampled texture has to be |
| used. |
| |
| There is no method to test if unordered qualifiers works correctly |
| because for those qualifiers fragment shader invocations are generally |
| executed in undefined order, which means that it could be either |
| ordered or unordered. Tests for unordered qualifiers would be |
| undeterministic. |
| |
| Shader Critical Section Execution Test |
| |
| * Create 1x1 R8UI texture. |
| |
| * Create two fragment shaders for all layout qualifiers added by this |
| extension. Shader should read pixel value from the texture, increase it |
| and store. In first fragment shader all operations should be executed |
| between beginInvocationInterlockARB and endInvocationInterlockARB |
| functions calls, in second one those calls should be missed. |
| |
| * Clear texture and draw 8x8 pixel sized polygon to the renderbuffer. |
| |
| The expected result is value 64 stored in the texture if |
| beginInvocationInterlockARB and endInvocationInterlockARB functions were |
| used. |
| |
| In case of sample_interlock_* qualifier multisampled texture has to be |
| used. |
| |
| Revision History |
| |
| Revision 1, 31 January, 2016 (Adam Czupryna) |
| - Initial version. |
| |