1Name 2 3 QCOM_shader_framebuffer_fetch_noncoherent 4 5Name Strings 6 7 GL_QCOM_shader_framebuffer_fetch_noncoherent 8 9Contact 10 11 Jeff Leger, Qualcomm (jleger@qti.qualcomm.com) 12 13Status 14 15 Complete 16 17Version 18 19 Last Modified Date: April 21, 2017 20 Author Revision: 2 21 22Number 23 24 OpenGL ES Extension #277 25 26Dependencies 27 28 OpenGL ES 2.0 is required. 29 30 Requires one of more of the following OpenGL ES extensions: 31 EXT_shader_framebuffer_fetch 32 ARM_shader_framebuffer_fetch_depth_stencil 33 ARM_shader_framebuffer_fetch 34 35Overview 36 37 Existing extensions such as EXT_shader_framebuffer_fetch and 38 ARM_shader_framebuffer_fetch_depth_stencil allow fragment 39 shaders to read existing framebuffer color or depth/stencil data as input. 40 This extension adds support for reading those same inputs with 41 relaxed coherency requirements. This mode can avoid expensive 42 per-primitive flushes of the pixel pipeline and may offer performance 43 improvements in some implementations. 44 45 When the relaxed coherency mode is enabled, reads of the framebuffer data 46 by the fragment shader will guarantee defined results only if each sample 47 is touched no more than once in any single rendering pass. The command 48 FramebufferFetchBarrierQCOM() is provided to indicate a boundary between 49 passes. 50 51New Procedures and Functions 52 53 void FramebufferFetchBarrierQCOM(void); 54 55New Tokens 56 57 Accepted by the <cap> parameter of Disable, Enable, and IsEnabled, and by 58 the <pname> parameter of GetIntegerv, GetBooleanv, GetFloatv, GetDoublev 59 and GetInteger64v: 60 61 FRAMEBUFFER_FETCH_NONCOHERENT_QCOM 0x96A2 62 63New Builtin Variables 64 none 65 66Changes to the OpenGL ES 2.0 Specification, Chapter 3 67 68 Append the following new sub-section at the end of section 3.8.2, Shader 69 Execution, page 197: 70 71 Framebuffer Fetch Coherency 72 73 Rendering is typically done coherently and in primitive order. When an 74 individual sample is covered by multiple primitives, rendering for that 75 sample is performed sequentially in the order in which the primitives were 76 submitted. When a Fragment shader reads framebuffer data (using 77 glLastFragData, gl_LastFragDepthARM, or an inout variable) the value will 78 always return the last fragment value written to the frame buffer. This 79 coherent behavior is enabled by default, but an optional non-coherent 80 behavior can be enabled or disabled by calling Enable or Disable with the 81 symbolic constant FRAMEBUFFER_FETCH_NONCOHERENT_QCOM. If the non-coherent 82 behavior is enabled, applications should split their rendering into a collection 83 of passes, none of which touch an individual sample in the framebuffer more than 84 once. When non-coherent behavior is enabled, the results of framebuffer reads 85 are undefined if the sample being read has been touched previously in the same 86 pass. The command 87 88 void FramebufferFetchBarrierQCOM(void); 89 90 specifies a boundary between passes. Any command that causes the value of a 91 sample to be modified using the framebuffer is considered to touch the sample, 92 including clears, blended or unblended primitives, and BlitFramebuffer copies. 93 Calling Disable with the symbolic constant FRAMEBUFFER_FETCH_NONCOHERENT_QCOM 94 implicilty ends the current pass. 95 96New State 97 98 99 Get Value Type Get Command Minimum Value Description Section 100 --------- ---- ----------- ------------- -------------- ------- 101 FRAMEBUFFER_FETCH_NONCOHERENT_QCOM B GetBooleanv - enables relaxed 102 coherency for reads 103 of framebuffer. 104 105Revision History 106 107 Version 1, 2017/01/06 - Initial draft. 108 Version 2, 2017/04/21 - Extended to include depth/stencil reads. 109