blob: 6ecb7176b4695af9ba64de9c37497bed8688b116 [file] [log] [blame]
Name
AMD_framebuffer_multisample_advanced
Name Strings
GL_AMD_framebuffer_multisample_advanced
Contact
Marek Olsak, AMD (marek.olsak 'at' amd.com)
Status
Complete.
Version
Last Modified Date: June 28, 2018
Revision #1
Number
OpenGL Extension #523
OpenGL ES Extension #303
Dependencies
OpenGL dependencies:
Requires GL_ARB_framebuffer_object.
OpenGL ES dependencies:
Requires OpenGL ES 3.0.
This extension is written against the OpenGL 4.5 (Core Profile)
specification.
Overview
This extension extends ARB_framebuffer_object by allowing compromises
between image quality and memory footprint of multisample
antialiasing.
ARB_framebuffer_object introduced RenderbufferStorageMultisample
as a method of defining the parameters for a multisample render
buffer. This function takes a <samples> parameter that has strict
requirements on behavior such that no compromises in the final image
quality are allowed. Additionally, ARB_framebuffer_object requires
that all framebuffer attachments have the same number of samples.
This extension extends ARB_framebuffer_object by providing a new
function, RenderbufferStorageMultisampleAdvancedAMD, that
distinguishes between samples and storage samples for color
renderbuffers where the number of storage samples can be less than
the number of samples. This extension also allows non-matching sample
counts between color and depth/stencil renderbuffers.
This extension does not require any specific combination of sample
counts to be supported.
IP Status
No known IP issues.
New Procedures and Functions
void RenderbufferStorageMultisampleAdvancedAMD(
enum target, sizei samples, sizei storageSamples,
enum internalformat, sizei width, sizei height );
void NamedRenderbufferStorageMultisampleAdvancedAMD(
uint renderbuffer, sizei samples, sizei storageSamples,
enum internalformat, sizei width, sizei height );
New Tokens
Accepted by the <pname> parameter of GetRenderbufferParameteriv:
RENDERBUFFER_STORAGE_SAMPLES_AMD 0x91B2
Accepted by the <pname> parameter of GetBooleanv, GetIntegerv,
GetInteger64v, GetFloatv, GetDoublev:
MAX_COLOR_FRAMEBUFFER_SAMPLES_AMD 0x91B3
MAX_COLOR_FRAMEBUFFER_STORAGE_SAMPLES_AMD 0x91B4
MAX_DEPTH_STENCIL_FRAMEBUFFER_SAMPLES_AMD 0x91B5
NUM_SUPPORTED_MULTISAMPLE_MODES_AMD 0x91B6
SUPPORTED_MULTISAMPLE_MODES_AMD 0x91B7
Additions to Chapter 9 of the OpenGL 4.5 (Core Profile) Specification
(Framebuffers and Framebuffer Objects)
In section 9.2.3.1, "Multisample Queries", remove the last paragraph
beginning with "Otherwise" and add:
Otherwise, the value of SAMPLES is equal to the value of
RENDERBUFFER_SAMPLES or TEXTURE_SAMPLES (depending on the type of
attachments) of color attachments if any is present. If there is no
color attachment, SAMPLES is equal to the same value from the depth or
stencil attachment, whichever is present.
An implementation may only support a subset of the possible
combinations of sample counts of textures and renderbuffers attached
to a framebuffer object. The number of supported combinations is
NUM_SUPPORTED_MULTISAMPLE_MODES_AMD. SUPPORTED_MULTISAMPLE_MODES_AMD
is an array of NUM_SUPPORTED_MULTISAMPLE_MODES_AMD triples of integers
where each triple contains a valid combination of sample counts in
the form {color samples, color storage samples, depth and stencil
samples}. The first element in each triple is at least 2. The second
and third element in each triple are at least 1 and are not greater
than the first element.
In section 9.2.4, "Renderbuffer Objects", replace the description of
(Named)RenderbufferStorageMultisample:
The data storage, format, dimensions, number of samples, and number of
storage samples of a renderbuffer objects image are established with
the commands
void RenderbufferStorageMultisampleAdvancedAMD( enum target,
sizei samples, sizei storageSamples, enum internalformat,
sizei width, sizei height );
void NamedRenderbufferStorageMultisampleAdvancedAMD(
uint renderbuffer, sizei samples, sizei storageSamples,
enum internalformat, sizei width, sizei height );
For RenderbufferStorageMultisampleAdvancedAMD, the renderbuffer object
is that bound to <target>, which must be RENDERBUFFER.
For NamedRenderbufferStorageMultisampleAdvancedAMD, <renderbuffer> is
the name of the renderbuffer object.
<internalformat> must be color-renderable, depth-renderable, or
stencil-renderable (as defined in section 9.4). <width> and <height>
are the dimensions in pixels of the renderbuffer.
Upon success, *RenderbufferStorageMultisampleAdvancedAMD deletes any
existing data store for the renderbuffer image, and the contents of
the data store are undefined. RENDERBUFFER_WIDTH is set to <width>,
RENDERBUFFER_HEIGHT is set to <height>, and RENDERBUFFER_INTERNAL_-
FORMAT is set to <internalformat>.
If <samples> is zero, then <storageSamples> must be zero, and
RENDERBUFFER_SAMPLES and RENDERBUFFER_STORAGE_SAMPLES_AMD are set to
zero. Otherwise <samples> represents a request for a desired minimum
number of samples and <storageSamples> represents a request for
a desired minimum number of storage samples, where <storageSamples>
must not be greater than <samples>. Since different implementations
may support different sample counts for multisampled rendering,
the actual number of samples and the actual number of storage samples
allocated for the renderbuffer image are implementation-dependent.
However, the resulting value for RENDERBUFFER_SAMPLES is guaranteed
to be greater than or equal to <samples> and no more than the next
larger sample count supported by the implementation, and the resulting
value for RENDERBUFFER_STORAGE_SAMPLES_AMD is guaranteed to be greater
than or equal to <storageSamples>, no more than the next larger
storage sample count supported by the implementation, and no more than
RENDERBUFFER_SAMPLES.
A GL implementation may vary its allocation of internal component
resolution based on any *RenderbufferStorageMultisampleAdvancedAMD
parameter (except <target> and <renderbuffer>), but the allocation and
chosen internal format must not be a function of any other state and
cannot be changed once they are established.
Remove the first 4 errors and add these errors:
An INVALID_ENUM error is generated by RenderbufferStorageMultisample-
AdvancedAMD if <target> is not RENDERBUFFER.
An INVALID_OPERATION error is generated by NamedRenderbufferStorage-
MultisampleAdvancedAMD if <renderbuffer> is not the name of
an existing renderbuffer object.
An INVALID_VALUE error is generated if <samples>, <storageSamples>,
<width>, or <height> is negative.
An INVALID_OPERATION error is generated if <internalformat> is a color
format and <samples> is greater than the implementation-dependent
limit MAX_COLOR_FRAMEBUFFER_SAMPLES_AMD.
An INVALID_OPERATION error is generated if <internalformat> is a color
format and <storageSamples> is greater than the implementation-
dependent limit MAX_COLOR_FRAMEBUFFER_STORAGE_SAMPLES_AMD.
An INVALID_OPERATION error is generated if <storageSamples> is greater
than <samples>.
An INVALID_OPERATION error is generated if <internalformat> is a depth
or stencil format and <samples> is greater than the maximum number of
samples supported for <internalformat> (see GetInternalformativ
in section 22.3).
An INVALID_OPERATION error is generated if <internalformat> is a depth
or stencil format and <storageSamples> is not equal to <samples>.
Finish the section as follows:
The commands
void RenderbufferStorageMultisample( enum target,
sizei samples, enum internalformat, sizei width,
sizei height );
void RenderbufferStorage( enum target, enum internalformat,
sizei width, sizei height );
are equivalent to
RenderbufferStorageMultisampleAdvancedAMD(target, samples,
samples, internalformat, width, height);
and
RenderbufferStorageMultisampleAdvancedAMD(target, 0, 0,
internalformat, width, height);
respectively.
The commands
void NamedRenderbufferStorageMultisample( uint renderbuffer,
sizei samples, enum internalformat, sizei width,
sizei height );
void NamedRenderbufferStorage( uint renderbuffer,
enum internalformat, sizei width, sizei height );
are equivalent to
NamedRenderbufferStorageMultisampleAdvancedAMD(renderbuffer,
samples, samples, internalformat, width, height);
and
NamedRenderbufferStorageMultisampleAdvancedAMD(renderbuffer,
0, 0, internalformat, width, height);
respectively.
In section 9.2.5, "Required Renderbuffer Formats", replace the last
paragraph with:
Implementations must support creation of renderbuffers in these
required formats with sample counts up to and including:
* MAX_COLOR_FRAMEBUFFER_SAMPLES_AMD as color renderbuffer samples
* MAX_COLOR_FRAMEBUFFER_STORAGE_SAMPLES_AMD as color renderbuffer
storage samples
* MAX_DEPTH_STENCIL_FRAMEBUFFER_SAMPLES_AMD as depth and stencil
samples
with the exception that the signed and unsigned integer formats are
required only to support creation of renderbuffers with up to
the value of MAX_INTEGER_SAMPLES samples and storage samples, which
must be at least one.
In section 9.2.6, "Renderbuffer Object Queries", replace the paragraph
mentioning RENDERBUFFER_SAMPLES with:
If <pname> is RENDERBUFFER_WIDTH, RENDERBUFFER_HEIGHT,
RENDERBUFFER_INTERNAL_FORMAT, RENDERBUFFER_SAMPLES, or
RENDERBUFFER_STORAGE_SAMPLES_AMD then <params> will contain the width
in pixels, height in pixels, internal format, number of samples, or
number of storage samples, respectively, of the image of
the renderbuffer object.
In section 9.4.1, "Framebuffer Attachment Completeness", remove
the bullet beginning with "If <image> has multisample samples" and
replace the last 3 bullets about <attachment> with:
If <attachment> is COLOR_ATTACHMENTi, then <image> must have a color-
renderable internal format, the sample count must be less than or
equal to the value of the implementation-dependent limit
MAX_COLOR_FRAMEBUFFER_SAMPLES_AMD, and the storage sample count must
be less than or equal to the value of the implementation-dependent
limit MAX_COLOR_FRAMEBUFFER_STORAGE_SAMPLES_AMD.
If <attachment> is DEPTH_ATTACHMENT, then <image> must have a depth-
renderable internal format, and its sample count must be less than or
equal to the value of the implementation-dependent limit
MAX_DEPTH_STENCIL_FRAMEBUFFER_SAMPLES_AMD.
If <attachment> is STENCIL_ATTACHMENT, then <image> must have
a stencil-renderable internal format, and its sample count must be
less than or equal to the value of the implementation-dependent limit
MAX_DEPTH_STENCIL_FRAMEBUFFER_SAMPLES_AMD.
In section 9.4.2, replace the bullet mentioning RENDERBUFFER_SAMPLES
with:
* The value of RENDERBUFFER_SAMPLES of a color attachment defines its
<number of color samples>; the value of RENDERBUFFER_STORAGE_SAMPLES
of a color attachment defines its <number of color storage samples>;
the value of RENDERBUFFER_SAMPLES of a depth or stencil attachment
defines its <number of depth-stencil samples> for each separately;
the value of TEXTURE_SAMPLES of a color attachment defines both its
<number of color samples> and its <number of color storage samples>;
the value of TEXTURE_SAMPLES of a depth or stencil attachment defines
its <number of depth-stencil samples> for each separately. If any of
the defined values is 0, it is treated as 1. Any undefined value is
treated as equal to any number. For all attachment values that are
defined, all values of <number of color samples> must be equal, all
values of <number of color storage samples> must be equal, all values
of <number of depth-stencil samples> must be equal, and the triple
{<number of color samples>, <number of color storage samples>, <number
of depth-stencil samples>} must be in SUPPORTED_MULTISAMPLE_MODES_AMD
or must be equal to {1, 1, 1}.
{ FRAMEBUFFER_INCOMPLETE_MULTISAMPLE }
Additions to Chapter 17 of the OpenGL 4.5 (Core Profile) Specification
(Writing Fragments and Samples to the Framebuffer)
In section 17.3.10, "Additional Multisample Fragment Operations", add
this paragraph after the "If MULTISAMPLE is enabled" paragraph:
If there are fewer color storage samples (see section 9.2.4) than
the value of SAMPLES, the number of color storage samples determines
the number of unique color values that can be stored per pixel.
The implementation must determine which samples within a pixel share
the same color value, write that value into 1 color storage sample,
and remember a mapping between color samples and color storage
samples to be able to map color storage samples back to color samples.
The color value equality determination is done in an implementation-
specific manner, but the implementation must at least recognize a set
of color samples coming from the same primitive as 1 storage sample if
sample shading (see section 14.3.1.1) is disabled. If there are not
enough color storage samples per pixel to store all incoming color
values, the excessive color values are not stored and the color samples
with unstored values are marked as having an unknown value. Color
samples with an unknown value will not contribute to the final color
value of the pixel when all color samples are resolved by
BlitFramebuffer (see section 18.3.1).
If there are fewer depth and stencil samples than the value of SAMPLES
and implementation-specific optimizations are unable to represent more
depth and stencil samples within the given storage, the missing depth
and stencil values should be pulled from or derived from the nearest
existing depth and stencil samples within the same pixel. The mapping
from missing to existing depth and stencil samples is implementation-
specific, but the mapping must be at least:
* injective if missing samples < existing samples
* bijective if missing samples = existing samples
* surjective if missing samples > existing samples
Depth and stencil tests operate as if the number of depth and stencil
samples was equal to the value of SAMPLES.
Errors
An INVALID_ENUM error is generated by RenderbufferStorageMultisample-
AdvancedAMD if <target> is not RENDERBUFFER.
An INVALID_OPERATION error is generated by NamedRenderbufferStorage-
MultisampleAdvancedAMD if <renderbuffer> is not the name of
an existing renderbuffer object.
An INVALID_VALUE error is generated if <samples>, <storageSamples>,
<width>, or <height> is negative.
An INVALID_OPERATION error is generated if <internalformat> is a color
format and <samples> is greater than the implementation-dependent
limit MAX_COLOR_FRAMEBUFFER_SAMPLES_AMD.
An INVALID_OPERATION error is generated if <internalformat> is a color
format and <storageSamples> is greater than the implementation-
dependent limit MAX_COLOR_FRAMEBUFFER_STORAGE_SAMPLES_AMD.
An INVALID_OPERATION error is generated if <storageSamples> is greater
than <samples>.
An INVALID_OPERATION error is generated if <internalformat> is a depth
or stencil format and <samples> is greater than the maximum number of
samples supported for <internalformat> (see GetInternalformativ
in section 22.3).
An INVALID_OPERATION error is generated if <internalformat> is a depth
or stencil format and <storageSamples> is not equal to <samples>.
New State
Add to Table 23.27, "Renderbuffer (state per renderbuffer object)"
Initial
Get Value Type Get Command Value Description Section
-------------------------------- ---- -------------------------- ------- ---------------------- -------
RENDERBUFFER_STORAGE_SAMPLES_AMD Z+ GetRenderbufferParameteriv 0 No. of storage samples 9.2.4
New Implementation Dependent Values
Minimum
Get Value Type Get Command Value Description Section
---------------------------------------- ---------- ----------- ------- --------------------------------------- -------
MAX_COLOR_FRAMEBUFFER_SAMPLES_AMD Z+ GetIntegerv 4 Max. no. of color samples supported by 9.2.4
framebuffer objects.
MAX_COLOR_FRAMEBUFFER_STORAGE_SAMPLES_AMD Z+ GetIntegerv 4 Max. no. of color storage samples 9.2.4
supported by framebuffer objects.
MAX_DEPTH_STENCIL_FRAMEBUFFER_SAMPLES_AMD Z+ GetIntegerv 4 Max. no. of depth and stencil samples 9.2.4
supported by framebuffer objects.
NUM_SUPPORTED_MULTISAMPLE_MODES_AMD Z+ GetIntegerv 1 No. of supported combinations of color 9.2.4
samples, color storage samples, and
depth-stencil samples by framebuffer
objects.
SUPPORTED_MULTISAMPLE_MODES_AMD n * 3 x Z+ GetIntegerv - NUM_SUPPORTED_MULTISAMPLE_MODES_AMD (n) 9.2.4
triples of integers. Each triple is
a unique combination of color samples,
color storage samples, and depth-stencil
samples supported by framebuffer objects.
AMD Implementation Details
The following multisample modes are supported by AMD's open source
OpenGL driver:
Color Depth &
Color storage stencil
samples samples samples
======= ======= =======
16 8 8
16 4 8
16 2 8
16 4 4
16 2 4
16 2 2
------- ------- -------
8 8 8
8 4 8
8 2 8
8 4 4
8 2 4
8 2 2
------- ------- -------
4 4 4
4 2 4
4 2 2
------- ------- -------
2 2 2
Issues
None.
Revision History
Rev. Date Author Changes
---- -------- -------- --------------------------------------------
1 06/28/18 mareko Initial version