| Name |
| |
| QCOM_shader_framebuffer_fetch_noncoherent |
| |
| Name Strings |
| |
| GL_QCOM_shader_framebuffer_fetch_noncoherent |
| |
| Contact |
| |
| Jeff Leger, Qualcomm (jleger@qti.qualcomm.com) |
| |
| Status |
| |
| Complete |
| |
| Version |
| |
| Last Modified Date: April 21, 2017 |
| Author Revision: 2 |
| |
| Number |
| |
| OpenGL ES Extension #277 |
| |
| Dependencies |
| |
| OpenGL ES 2.0 is required. |
| |
| Requires one of more of the following OpenGL ES extensions: |
| EXT_shader_framebuffer_fetch |
| ARM_shader_framebuffer_fetch_depth_stencil |
| ARM_shader_framebuffer_fetch |
| |
| Overview |
| |
| Existing extensions such as EXT_shader_framebuffer_fetch and |
| ARM_shader_framebuffer_fetch_depth_stencil allow fragment |
| shaders to read existing framebuffer color or depth/stencil data as input. |
| This extension adds support for reading those same inputs with |
| relaxed coherency requirements. This mode can avoid expensive |
| per-primitive flushes of the pixel pipeline and may offer performance |
| improvements in some implementations. |
| |
| When the relaxed coherency mode is enabled, reads of the framebuffer data |
| by the fragment shader will guarantee defined results only if each sample |
| is touched no more than once in any single rendering pass. The command |
| FramebufferFetchBarrierQCOM() is provided to indicate a boundary between |
| passes. |
| |
| New Procedures and Functions |
| |
| void FramebufferFetchBarrierQCOM(void); |
| |
| New Tokens |
| |
| Accepted by the <cap> parameter of Disable, Enable, and IsEnabled, and by |
| the <pname> parameter of GetIntegerv, GetBooleanv, GetFloatv, GetDoublev |
| and GetInteger64v: |
| |
| FRAMEBUFFER_FETCH_NONCOHERENT_QCOM 0x96A2 |
| |
| New Builtin Variables |
| none |
| |
| Changes to the OpenGL ES 2.0 Specification, Chapter 3 |
| |
| Append the following new sub-section at the end of section 3.8.2, Shader |
| Execution, page 197: |
| |
| Framebuffer Fetch Coherency |
| |
| Rendering is typically done coherently and in primitive order. When an |
| individual sample is covered by multiple primitives, rendering for that |
| sample is performed sequentially in the order in which the primitives were |
| submitted. When a Fragment shader reads framebuffer data (using |
| glLastFragData, gl_LastFragDepthARM, or an inout variable) the value will |
| always return the last fragment value written to the frame buffer. This |
| coherent behavior is enabled by default, but an optional non-coherent |
| behavior can be enabled or disabled by calling Enable or Disable with the |
| symbolic constant FRAMEBUFFER_FETCH_NONCOHERENT_QCOM. If the non-coherent |
| behavior is enabled, applications should split their rendering into a collection |
| of passes, none of which touch an individual sample in the framebuffer more than |
| once. When non-coherent behavior is enabled, the results of framebuffer reads |
| are undefined if the sample being read has been touched previously in the same |
| pass. The command |
| |
| void FramebufferFetchBarrierQCOM(void); |
| |
| specifies a boundary between passes. Any command that causes the value of a |
| sample to be modified using the framebuffer is considered to touch the sample, |
| including clears, blended or unblended primitives, and BlitFramebuffer copies. |
| Calling Disable with the symbolic constant FRAMEBUFFER_FETCH_NONCOHERENT_QCOM |
| implicilty ends the current pass. |
| |
| New State |
| |
| |
| Get Value Type Get Command Minimum Value Description Section |
| --------- ---- ----------- ------------- -------------- ------- |
| FRAMEBUFFER_FETCH_NONCOHERENT_QCOM B GetBooleanv - enables relaxed |
| coherency for reads |
| of framebuffer. |
| |
| Revision History |
| |
| Version 1, 2017/01/06 - Initial draft. |
| Version 2, 2017/04/21 - Extended to include depth/stencil reads. |