blob: c9ef1b9e5f80d29a5973f12340b4a44f075127da [file] [log] [blame]
Name
OVR_multiview_multisampled_render_to_texture
Name Strings
GL_OVR_multiview_multisampled_render_to_texture
Contact
Cass Everitt (cass.everitt 'at' oculus.com)
Contributors
Jason Allen, NVIDIA Corporation
Sam Holmes, Qualcomm
Jan-Harald Fredriksen, ARM
Status
Incomplete
Version
Last Modified Date: June 25, 2015
Revision: 0.4
Number
OpenGL ES Extension #250
Dependencies
OpenGL ES 3.0, EXT_multisampled_render_to_texture, and at least
one of OVR_multiview or OVR_multiview2 are required. This
extension is written against the OpenGL ES 3.0 Specification.
Overview
This extension brings to multiview rendering the functionality
originally introduced in EXT_multisampled_render_to_texture.
Essentially this just means adding one new function for
multisample multiview array attachments in the framebuffer object.
IP Status
No known IP claims.
New Procedures and Functions
void FramebufferTextureMultisampleMultiviewOVR(
enum target, enum attachment,
uint texture, int level, sizei samples,
int baseViewIndex, sizei numViews);
New Tokens
None.
Additions to Section 4.4.2 of the OpenGL ES 3.0 Specification
(Attaching Images to Framebuffer Objects)
Add the following after the paragraph describing FramebufferTexture2D:
(Logically, this follows after the paragraph in GL_OVR_multiview
describing FramebufferTextureMultiviewOVR and the paragraph in GL_EXT_-
multisampled_render_to_texture describing FramebufferTexture2D-
MultisampleEXT)
The command
void FramebufferTextureMultisampleMultiviewOVR(
enum target, enum attachment,
uint texture, int level, sizei samples,
int baseViewIndex, sizei numViews);
operates similarly to FramebufferTextureMultiviewOVR, except that it
also enables multisampled rendering into the images of a non-multisampled
texture object similarly to FramebufferTexture2DMultisampleEXT.
<target>, <attachment>, <texture>, <level>, <baseViewIndex>, and
<numViews> correspond to the same parameters for FramebufferTexture-
MultiviewOVR and have the same restrictions and errors. <samples>
corresponds to the same parameter for FramebufferTexture2DMultisampleEXT
and has the same restrictions and errors.
The contents of the multisample buffer of the texture level become
undefined under the same conditions and operations as for
FramebufferTexture2DMultisampleEXT.
Dependencies on GL and ES profiles, versions, and other extensions
This extension requires EXT_multisampled_render_to_texture, and at least
one of OVR_multiview or OVR_multiview2 and inherits their dependencies.
Errors
INVALID_FRAMEBUFFER_OPERATION is generated by commands that read from the
framebuffer such as ReadPixels, CopyTexImage*, and CopyTexSubImage*, if
the number of views in the current read framebuffer is greater than 1.
INVALID_VALUE is generated by FramebufferTextureMultisampleMultiviewOVR if
numViews is less than 1, if numViews is more than MAX_VIEWS_OVR or if
(baseViewIndex + numViews) exceeds GL_MAX_ARRAY_TEXTURE_LAYERS.
INVALID_VALUE is generated by FramebufferTextureMultisampleMultiviewOVR if
samples is greater than MAX_SAMPLES.
INVALID_OPERATION is generated if a rendering command is issued and the
number of views in the current draw framebuffer is not equal to the number
of views declared in the currently bound program.
INVALID_OPERATION is generated if the target type of <texture> specified
in FramebufferTextureMultisampleMultiviewOVR is not TEXTURE_2D_ARRAY.
New State
None.
New Implementation Dependent State
None.
Sample code
GLsizei width = ...;
GLsizei height = ...;
GLint samples = ...;
GLsizei views = 2;
glGenTextures(views, tex);
glBindTexture(GL_TEXTURE_2D_ARRAY, tex[0]);
/* Create a color texture */
glTexStorage3D(GL_TEXTURE_2D_ARRAY, 1, GL_RGBA8, width, height, views );
/* Create a depth texture */
glBindTexture(GL_TEXTURE_2D_ARRAY, tex[1]);
glTexStorage3D(GL_TEXTURE_2D_ARRAY, 1, GL_DEPTH_COMPONENT24, width, height, views )
/* attach the render targets */
glFramebufferTextureMultisampleMultiviewOVR(GL_DRAW_FRAMEBUFFER, GL_COLOR_ATTACHMENT0, tex[0], 0, samples, 0, views);
glFramebufferTextureMultisampleMultiviewOVR(GL_DRAW_FRAMEBUFFER, GL_DEPTH_ATTACHMENT, tex[1], 0, samples, 0, views);
/* .. draw to multisampled multiview .. */
Issues
1. Should there be a way for applications to preserve the multisample
buffer after a resolve?
RESOLVED: No. This spec is intended as a lightweight addition to multiview
support and the added complexity of allowing resolves with preservation goes
against this intention.
2. Should there be a way for applications to guarantee preservation of
the multisample buffer mid-frame.
RESOLVED: No. On tiling architectures application behavior may implicitly
trigger a mid-frame resolve. There is no requirement for a backing store
to be maintained for the samples and in the case of a mid-frame resolve
sample data may be lost.
3. Are there any implications on the framebuffer completeness check?
RESOLVED: No. The framebuffer completeness rules are fully specified
by the combination of the added rules in EXT_multisampled_render_to_texture
and OVR_multiview, i.e., the number of views and the number of samples
must both match across attachments.
4. Why does reading from multi-view framebuffers generate INVALID_-
FRAMEBUFFER_OPERATION?
PROPOSED.
GL_OVR_multiview tried to avoid reading from multi-view framebuffers
by specifying that INVALID_OPERATION is generated by FramebufferTexture-
MultiviewOVR if target is GL_READ_FRAMEBUFFER. This error is not
sufficient to prevent reads from multi-view targets. It disallows
attaching a multi-view texture to the current read framebuffer, but
there is no error that disallows attaching the multi-view texture to the
current write framebuffer, and later binding that as the read framebuffer.
Multiple options for resolving this is outlined below. As written, this
specification assumes Option B.
Option A: Detect the error on attach / bind
- keep the existing error on FramebufferTextureMultiviewOVR, but change it
to also generate an error on GL_FRAMEBUFFER (since that includes
GL_READ_FRAMEBUFFER).
- add an error on BindFramebuffer to prevent a multiview framebuffer to
be bound as the current draw framebuffer
- extend the error conditions on FramebufferTextureMultiviewOVR to also
generate an error if <target> is GL_WRITE_FRAMEBUFFER and the current
write framebuffer is the same as the current read framebuffer.
This has the benefit of maintaining compatibility with GL_OVR_multiview,
but it is a complex error condition, and interactions with other
features / extensions would also need to be considered.
Option B: Detect the error on read operations.
- remove the existing error on FramebufferTextureMultiviewOVR
- add an error condition that applies to all read operations
This has the benefit of being simple (the error is only generated when
the illegal operation is detected) and robust (i.e., there are no corner
cases to consider). The downside is that the error is detected late.
Option C: Remove the error and define what happens on reads.
- remove the existing error on FramebufferTextureMultiviewOVR
- add language similar to that for layered framebuffers, like:
"When commands such as ReadPixels read from a multi-view framebuffer,
the image at view zero of the selected attachment is always used to
obtain pixel values.
This has the benefit of being aligned with other GL features. The down-
side is that this adds implementation cost without providing a good
use-case (i.e., it could only read a single view).
Revision History
Rev. Date Author Changes
---- ---------- -------- -----------------------------------------
0.1 04/29/2015 cass Initial draft
0.2 05/04/2015 sam Clarify issues around sample preservation
0.3 06/01/2015 cass Remove renderbuffer support
0.4 06/25/2015 jhf Clarify error conditions, add language.