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 parameter of Disable, Enable, and IsEnabled, and by the 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.