blob: 99f6b45510731bf9f04c9c7b0dc64ab3edcba3af [file] [log] [blame]
Name
QCOM_shader_framebuffer_fetch_rate
Name Strings
GL_QCOM_shader_framebuffer_fetch_rate
Contact
Jeff Leger ( jleger 'at' qti.qualcomm.com)
Contributors
Jeff Leger, Qualcomm
Jonathan Wicks, Qualcomm
Status
DRAFT
Version
Last Modified Date: August 20, 2018
Revision: 1
Number
OpenGL ES Extension #304
Dependencies
OpenGL ES 2.0 and GLSL ES 1.00 are required.
This extension is written against the OpenGL ES 3.2 (May 14, 2018)
and the OpenGL ES Shading Language 3.20.4 Specification
(June 14, 2018) specifications.
This extension interacts with EXT_shader_framebuffer_fetch.
This extension interacts with ARM_shader_framebuffer_fetch_depth_stencil.
Overview
When certain built-ins (e.g. gl_LastFragData, gl_LastFragStencilARM)
are referenced in the shader, the shader is required to execute at sample-rate
if the attachments are multisampled. In some use-cases executing such shaders
at fragment-rate is actually the preferred behavior. When this extension is
enabled, such GLSL shaders will execute at fragment-rate and the built-in
will return a per-fragment value. This avoids the significant performance
penalty that would otherwise be incurred with sample-rate shading.
The following built-ins are affected when the this extension is enabled:
gl_LastFragData (from EXT_shader_framebuffer_fetch)
gl_LastFragDepthARM (from ARM_shader_framebuffer_fetch_depth_stencil)
The following built-ins are disallowed when this extension is enabled:
gl_SampleID
gl_SamplePosition
interpolateAtSample()
IP Status
No known IP claims.
New Procedures and Functions
None
New Tokens
None
Additions to Chapter 13 of the OpenGL ES 3.2 Specification
(Fixed-Function Primitive Assembly and Rasterization)
Modify Section 13.4.1, Sample Shading, p. 353
Modify the first paragraph:
"Sample shading can be used to specify a minimum number of unique samples
to process for each fragment. Sample shading is controlled by calling
Enable or Disable with target SAMPLE_SHADING."
by adding one sentence to the end:
"Sample shading can be used to specify a minimum number of unique samples
to process for each fragment. Sample shading is controlled by calling
Enable or Disable with target SAMPLE_SHADING. For any fragment shader
that has forced fragment-rate by enabling QCOM_shader_framebuffer_fetch_rate,
such shader will execute as if SAMPLE_SHADING is disabled."
Additions to Chapter 14 (Programmable Fragment Processing) of the OpenGL ES 3.2 Specification
Modify Section 14.2.2 (Shader Inputs), p. 372
Modify the sentence:
"Using gl_SampleID in a fragment shader causes the entire shader to
be executed per-sample."
to:
"Using gl_SampleID in a fragment shader causes the entire shader to
be executed per-sample. If GL_QCOM_shader_framebuffer_fetch_rate is
enabled, any use of gl_SampleID will result in a compile or link error."
Modify the sentence:
"Using gl_SamplePosition in a fragment shader causes the entire shader to
be executed per-sample."
to:
"Using gl_SamplePosition in a fragment shader causes the entire shader to
be executed per-sample. If GL_QCOM_shader_framebuffer_fetch_rate is
enabled, any use of gl_SamplePosition will result in a compile or link
error."
Modify Section 14.2.3 (Shader Outputs), p. 372
[[ The following applies if EXT_shader_framebuffer_fetch is supported ]]
In the new paragraphs added by EXT_shader_framebuffer_fetch to the end
this section, change the following added sentence:
From:
"Reading from a user-defined fragment output declared inout
causes the shader to be evaluated per-sample, since the
framebuffer potentially contains different color values for
each sample."
To:
"If QCOM_shader_framebuffer_fetch_rate is not enabled, reading from
a user-defined fragment output declared inout causes the shader
to be evaluated per-sample, since the framebuffer potentially
contains different color values for each sample."
Add the following paragraph to the end of "Shader Outputs" section:
"If the current rendertarget is multisampled and if
QCOM_shader_framebuffer_fetch_rate is enabled, then reading from
a user-defined fragment output declared inout will return an
implementation-dependent weighted average of the samples within
the destination pixel covered by the current fragment. The value
will be between the minium and maximum value of the covered samples.
If the destination colors must be linearized from sRGB as
described in the preceding paragraphs, the conversion from sRGB
to linear happens before computing the weighted average.
Additions to the EGL Specifications
None.
Modifications to The OpenGL ES Shading Language Specification, Version 3.20.4
Changes to section 7.1.5. (Fragment Shader Special Variables), p 120.
Add the following at the start of this section:
"Static use of certain built-in variables described in this section
will cause the shader to be evaluated per-sample. This language feature
can be optionally disabled, forcing such shaders to evaluate per-
fragment. The optional behavior can be enabled using:
#extension GL_QCOM_shader_framebuffer_fetch_rate : <behavior>
where <behavior> is as specified in section 3.4 (Preprocessor).
If GL_QCOM_shader_framebuffer_fetch_rate is enabled, it is a compile-time
or link-time error if any variable is declared with the "sample"
qualifier or if the built-in function interpolateAtSample() is statically
referenced."
Add the New preprocessor #defines are added to the OpenGL ES Shading Language:
"#define GL_QCOM_shader_framebuffer_fetch_rate 1"
Modify the last sentence of the paragraph starting with "The input variable
gl_SampleID is filled with the sample number of the sample currently being
processed"
from:
"Any static use of this variable in a fragment shader causes the entire
shader to be evaluated per-sample."
to
"If GL_QCOM_shader_framebuffer_fetch_rate is not enabled, any static use
of this variable in a fragment shader causes the entire shader to be evaluated
per-sample. If GL_QCOM_shader_framebuffer_fetch_rate is enabled, an static
reference to gl_SampleID will cause a compile or link error."
Modify the last sentence of the paragraph starting with "The input variable
gl_SamplePosition contains the position of the current sample within the
multisample draw buffer."
from:
"Any static use of this variable in a fragment shader causes the entire
shader to be evaluated per-sample."
to
"If GL_QCOM_shader_framebuffer_fetch_rate is not enabled, any static use of
this variable in a fragment shader causes the entire shader to be evaluated
per-sample. If GL_QCOM_shader_framebuffer_fetch_rate is enabled, an static
reference to gl_SamplePosition will cause a compile or link error."
Interactions with EXT_shader_framebuffer_fetch.
Extension EXT_shader_framebuffer_fetch adds built-ins (gl_LastFragData[] for
version 1.0 shaders and inout variables version 3.0 shaders) that cause fragment
shaders to run at sample-rate. This extension relaxes that requirement to
allow fragment-rate and specifies that the value returned from gl_LastFragData
will be an implementation-dependent weighted average of the covered pixels.
Interactions with ARM_shader_framebuffer_fetch_depth_stencil.
Extension ARM_shader_framebuffer_fetch adds built-in "gl_LastFragDepthARM",
and specifies the value returned -- for both sample-rate and fragment-rate
execution. This extension can be used to control whether sample-rate or
fragment-rate execution is used.
Errors
None.
New State
None.
New Implementation Dependent State
None
Issues
(1) Does it make sense to enable this extension for a shader that references
per-sample built-ins like gl_SampleID and gl_SamplePosition?
RESOLVED: No. It doesn't make sense to force fragment-rate
execution using this extension, while also referencing per-sample
built-ins. Since there is no known use-case, this will be a compile
or link error.
For the same reason, using the "sample" qualifier or using
interpolateAtSample() will cause a compile or link error.
(2) How does this extension interact with API-controlled sample-rate shading?
RESOLVED: For shaders that enable this this extension, those the shaders
will always execute at fragment-rate, regardless of other API states.
In particular, the enable/disable of SAMPLE_SHADING and the value of
MIN_SAMPLE_SHADING_VALUE will have no effect on such shaders.
(3) How does this extension differ from ARM_shader_framebuffer_fetch?
ARM_shader_framebuffer_fetch provides a means for controlling whether
shaders fetching color from the framebuffer should execute at sample-rate or
fragement rate. The API state "FETCH_PER_SAMPLE_ARM" controls
this behavior.
This extension also provides control over sample-rate vs fragment-rate
for framebuffer fetch shaders, but does so in the GLSL shader. Some
implementations require this information at shader compile time.
Revision History
Rev. Date Author Changes
---- ---------- -------- -----------------------------------------
1 2018-08-20 jleger initial version