mirror of
https://gitlab.freedesktop.org/mesa/mesa.git
synced 2026-04-20 10:00:36 +02:00
mesa: Add core support for EXT_multisampled_render_to_texture{,2}
This also turns on EXT_multisampled_render_to_texture which is a subset of EXT_multisampled_render_to_texture2, allowing only COLOR_ATTACHMENT0. Reviewed-by: Eric Anholt <eric@anholt.net> Signed-off-by: Kristian H. Kristensen <hoegsberg@chromium.org>
This commit is contained in:
parent
b4fd59075b
commit
1b331ae505
10 changed files with 96 additions and 16 deletions
34
src/mapi/glapi/gen/EXT_multisampled_render_to_texture.xml
Normal file
34
src/mapi/glapi/gen/EXT_multisampled_render_to_texture.xml
Normal file
|
|
@ -0,0 +1,34 @@
|
||||||
|
<?xml version="1.0"?>
|
||||||
|
<!DOCTYPE OpenGLAPI SYSTEM "gl_API.dtd">
|
||||||
|
|
||||||
|
<OpenGLAPI>
|
||||||
|
|
||||||
|
<category name="GL_EXT_multisampled_render_to_texture" number="106">
|
||||||
|
|
||||||
|
<enum name="RENDERBUFFER_SAMPLES_EXT" value="0x8CAB"/>
|
||||||
|
<enum name="FRAMEBUFFER_INCOMPLETE_MULTISAMPLE_EXT" value="0x8D56"/>
|
||||||
|
<enum name="MAX_SAMPLES_EXT" value="0x8D57"/>
|
||||||
|
<enum name="FRAMEBUFFER_ATTACHMENT_TEXTURE_SAMPLES_EXT" value="0x8D6C"/>
|
||||||
|
|
||||||
|
<!-- Already defined in EXT_framebuffer_object.xml
|
||||||
|
<function name="RenderbufferStorageMultisampleEXT" es2="2.0">
|
||||||
|
<param name="target" type="GLenum"/>
|
||||||
|
<param name="samples" type="GLsizei"/>
|
||||||
|
<param name="internalformat" type="GLenum"/>
|
||||||
|
<param name="width" type="GLsizei"/>
|
||||||
|
<param name="height" type="GLsizei"/>
|
||||||
|
</function>
|
||||||
|
-->
|
||||||
|
|
||||||
|
<function name="FramebufferTexture2DMultisampleEXT" es2="2.0">
|
||||||
|
<param name="target" type="GLenum"/>
|
||||||
|
<param name="attachment" type="GLenum"/>
|
||||||
|
<param name="textarget" type="GLenum"/>
|
||||||
|
<param name="texture" type="GLuint"/>
|
||||||
|
<param name="level" type="GLint"/>
|
||||||
|
<param name="samples" type="GLsizei"/>
|
||||||
|
</function>
|
||||||
|
|
||||||
|
</category>
|
||||||
|
|
||||||
|
</OpenGLAPI>
|
||||||
|
|
@ -200,6 +200,7 @@ API_XML = \
|
||||||
EXT_external_objects_fd.xml \
|
EXT_external_objects_fd.xml \
|
||||||
EXT_framebuffer_object.xml \
|
EXT_framebuffer_object.xml \
|
||||||
EXT_gpu_shader4.xml \
|
EXT_gpu_shader4.xml \
|
||||||
|
EXT_multisampled_render_to_texture.xml \
|
||||||
EXT_packed_depth_stencil.xml \
|
EXT_packed_depth_stencil.xml \
|
||||||
EXT_provoking_vertex.xml \
|
EXT_provoking_vertex.xml \
|
||||||
EXT_separate_shader_objects.xml \
|
EXT_separate_shader_objects.xml \
|
||||||
|
|
|
||||||
|
|
@ -8175,6 +8175,8 @@
|
||||||
|
|
||||||
<xi:include href="ARB_robustness.xml" xmlns:xi="http://www.w3.org/2001/XInclude"/>
|
<xi:include href="ARB_robustness.xml" xmlns:xi="http://www.w3.org/2001/XInclude"/>
|
||||||
|
|
||||||
|
<xi:include href="EXT_multisampled_render_to_texture.xml" xmlns:xi="http://www.w3.org/2001/XInclude"/>
|
||||||
|
|
||||||
<xi:include href="ARB_base_instance.xml" xmlns:xi="http://www.w3.org/2001/XInclude"/>
|
<xi:include href="ARB_base_instance.xml" xmlns:xi="http://www.w3.org/2001/XInclude"/>
|
||||||
|
|
||||||
<category name="GL_ARB_transform_feedback_instanced" number="109">
|
<category name="GL_ARB_transform_feedback_instanced" number="109">
|
||||||
|
|
|
||||||
|
|
@ -107,6 +107,7 @@ api_xml_files = files(
|
||||||
'EXT_external_objects_fd.xml',
|
'EXT_external_objects_fd.xml',
|
||||||
'EXT_framebuffer_object.xml',
|
'EXT_framebuffer_object.xml',
|
||||||
'EXT_gpu_shader4.xml',
|
'EXT_gpu_shader4.xml',
|
||||||
|
'EXT_multisampled_render_to_texture.xml',
|
||||||
'EXT_packed_depth_stencil.xml',
|
'EXT_packed_depth_stencil.xml',
|
||||||
'EXT_provoking_vertex.xml',
|
'EXT_provoking_vertex.xml',
|
||||||
'EXT_separate_shader_objects.xml',
|
'EXT_separate_shader_objects.xml',
|
||||||
|
|
|
||||||
|
|
@ -127,7 +127,7 @@ _mesa_meta_framebuffer_texture_image(struct gl_context *ctx,
|
||||||
assert(att);
|
assert(att);
|
||||||
|
|
||||||
_mesa_framebuffer_texture(ctx, fb, attachment, att, texObj, texTarget,
|
_mesa_framebuffer_texture(ctx, fb, attachment, att, texObj, texTarget,
|
||||||
level, layer, false);
|
level, att->NumSamples, layer, false);
|
||||||
}
|
}
|
||||||
|
|
||||||
static struct gl_shader *
|
static struct gl_shader *
|
||||||
|
|
|
||||||
|
|
@ -242,6 +242,8 @@ EXT(EXT_map_buffer_range , ARB_map_buffer_range
|
||||||
EXT(EXT_memory_object , EXT_memory_object , GLL, GLC, x , ES2, 2017)
|
EXT(EXT_memory_object , EXT_memory_object , GLL, GLC, x , ES2, 2017)
|
||||||
EXT(EXT_memory_object_fd , EXT_memory_object_fd , GLL, GLC, x , ES2, 2017)
|
EXT(EXT_memory_object_fd , EXT_memory_object_fd , GLL, GLC, x , ES2, 2017)
|
||||||
EXT(EXT_multi_draw_arrays , dummy_true , GLL, x , ES1, ES2, 1999)
|
EXT(EXT_multi_draw_arrays , dummy_true , GLL, x , ES1, ES2, 1999)
|
||||||
|
EXT(EXT_multisampled_render_to_texture , EXT_multisampled_render_to_texture , x , x , x , ES2, 2016)
|
||||||
|
EXT(EXT_multisampled_render_to_texture2 , EXT_multisampled_render_to_texture , x , x , x , ES2, 2016)
|
||||||
EXT(EXT_occlusion_query_boolean , ARB_occlusion_query2 , x , x , x , ES2, 2011)
|
EXT(EXT_occlusion_query_boolean , ARB_occlusion_query2 , x , x , x , ES2, 2011)
|
||||||
EXT(EXT_packed_depth_stencil , dummy_true , GLL, GLC, x , x , 2005)
|
EXT(EXT_packed_depth_stencil , dummy_true , GLL, GLC, x , x , 2005)
|
||||||
EXT(EXT_packed_float , EXT_packed_float , GLL, GLC, x , x , 2004)
|
EXT(EXT_packed_float , EXT_packed_float , GLL, GLC, x , x , 2004)
|
||||||
|
|
|
||||||
|
|
@ -497,8 +497,8 @@ set_texture_attachment(struct gl_context *ctx,
|
||||||
struct gl_framebuffer *fb,
|
struct gl_framebuffer *fb,
|
||||||
struct gl_renderbuffer_attachment *att,
|
struct gl_renderbuffer_attachment *att,
|
||||||
struct gl_texture_object *texObj,
|
struct gl_texture_object *texObj,
|
||||||
GLenum texTarget, GLuint level, GLuint layer,
|
GLenum texTarget, GLuint level, GLsizei samples,
|
||||||
GLboolean layered)
|
GLuint layer, GLboolean layered)
|
||||||
{
|
{
|
||||||
struct gl_renderbuffer *rb = att->Renderbuffer;
|
struct gl_renderbuffer *rb = att->Renderbuffer;
|
||||||
|
|
||||||
|
|
@ -520,6 +520,7 @@ set_texture_attachment(struct gl_context *ctx,
|
||||||
|
|
||||||
/* always update these fields */
|
/* always update these fields */
|
||||||
att->TextureLevel = level;
|
att->TextureLevel = level;
|
||||||
|
att->NumSamples = samples;
|
||||||
att->CubeMapFace = _mesa_tex_target_to_face(texTarget);
|
att->CubeMapFace = _mesa_tex_target_to_face(texTarget);
|
||||||
att->Zoffset = layer;
|
att->Zoffset = layer;
|
||||||
att->Layered = layered;
|
att->Layered = layered;
|
||||||
|
|
@ -1085,8 +1086,11 @@ _mesa_test_framebuffer_completeness(struct gl_context *ctx,
|
||||||
return;
|
return;
|
||||||
}
|
}
|
||||||
|
|
||||||
attNumSamples = texImg->NumSamples;
|
if (att->NumSamples > 0)
|
||||||
attNumStorageSamples = texImg->NumSamples;
|
attNumSamples = att->NumSamples;
|
||||||
|
else
|
||||||
|
attNumSamples = texImg->NumSamples;
|
||||||
|
attNumStorageSamples = attNumSamples;
|
||||||
}
|
}
|
||||||
else if (att->Type == GL_RENDERBUFFER_EXT) {
|
else if (att->Type == GL_RENDERBUFFER_EXT) {
|
||||||
minWidth = MIN2(minWidth, att->Renderbuffer->Width);
|
minWidth = MIN2(minWidth, att->Renderbuffer->Width);
|
||||||
|
|
@ -3498,7 +3502,8 @@ _mesa_framebuffer_texture(struct gl_context *ctx, struct gl_framebuffer *fb,
|
||||||
GLenum attachment,
|
GLenum attachment,
|
||||||
struct gl_renderbuffer_attachment *att,
|
struct gl_renderbuffer_attachment *att,
|
||||||
struct gl_texture_object *texObj, GLenum textarget,
|
struct gl_texture_object *texObj, GLenum textarget,
|
||||||
GLint level, GLuint layer, GLboolean layered)
|
GLint level, GLsizei samples,
|
||||||
|
GLuint layer, GLboolean layered)
|
||||||
{
|
{
|
||||||
FLUSH_VERTICES(ctx, _NEW_BUFFERS);
|
FLUSH_VERTICES(ctx, _NEW_BUFFERS);
|
||||||
|
|
||||||
|
|
@ -3509,6 +3514,7 @@ _mesa_framebuffer_texture(struct gl_context *ctx, struct gl_framebuffer *fb,
|
||||||
level == fb->Attachment[BUFFER_STENCIL].TextureLevel &&
|
level == fb->Attachment[BUFFER_STENCIL].TextureLevel &&
|
||||||
_mesa_tex_target_to_face(textarget) ==
|
_mesa_tex_target_to_face(textarget) ==
|
||||||
fb->Attachment[BUFFER_STENCIL].CubeMapFace &&
|
fb->Attachment[BUFFER_STENCIL].CubeMapFace &&
|
||||||
|
samples == fb->Attachment[BUFFER_STENCIL].NumSamples &&
|
||||||
layer == fb->Attachment[BUFFER_STENCIL].Zoffset) {
|
layer == fb->Attachment[BUFFER_STENCIL].Zoffset) {
|
||||||
/* The texture object is already attached to the stencil attachment
|
/* The texture object is already attached to the stencil attachment
|
||||||
* point. Don't create a new renderbuffer; just reuse the stencil
|
* point. Don't create a new renderbuffer; just reuse the stencil
|
||||||
|
|
@ -3522,13 +3528,14 @@ _mesa_framebuffer_texture(struct gl_context *ctx, struct gl_framebuffer *fb,
|
||||||
level == fb->Attachment[BUFFER_DEPTH].TextureLevel &&
|
level == fb->Attachment[BUFFER_DEPTH].TextureLevel &&
|
||||||
_mesa_tex_target_to_face(textarget) ==
|
_mesa_tex_target_to_face(textarget) ==
|
||||||
fb->Attachment[BUFFER_DEPTH].CubeMapFace &&
|
fb->Attachment[BUFFER_DEPTH].CubeMapFace &&
|
||||||
|
samples == fb->Attachment[BUFFER_DEPTH].NumSamples &&
|
||||||
layer == fb->Attachment[BUFFER_DEPTH].Zoffset) {
|
layer == fb->Attachment[BUFFER_DEPTH].Zoffset) {
|
||||||
/* As above, but with depth and stencil transposed. */
|
/* As above, but with depth and stencil transposed. */
|
||||||
reuse_framebuffer_texture_attachment(fb, BUFFER_STENCIL,
|
reuse_framebuffer_texture_attachment(fb, BUFFER_STENCIL,
|
||||||
BUFFER_DEPTH);
|
BUFFER_DEPTH);
|
||||||
} else {
|
} else {
|
||||||
set_texture_attachment(ctx, fb, att, texObj, textarget,
|
set_texture_attachment(ctx, fb, att, texObj, textarget,
|
||||||
level, layer, layered);
|
level, samples, layer, layered);
|
||||||
|
|
||||||
if (attachment == GL_DEPTH_STENCIL_ATTACHMENT) {
|
if (attachment == GL_DEPTH_STENCIL_ATTACHMENT) {
|
||||||
/* Above we created a new renderbuffer and attached it to the
|
/* Above we created a new renderbuffer and attached it to the
|
||||||
|
|
@ -3583,15 +3590,15 @@ framebuffer_texture_with_dims_no_error(GLenum target, GLenum attachment,
|
||||||
get_attachment(ctx, fb, attachment, NULL);
|
get_attachment(ctx, fb, attachment, NULL);
|
||||||
|
|
||||||
_mesa_framebuffer_texture(ctx, fb, attachment, att, texObj, textarget,
|
_mesa_framebuffer_texture(ctx, fb, attachment, att, texObj, textarget,
|
||||||
level, layer, GL_FALSE);
|
level, 0, layer, GL_FALSE);
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|
||||||
static void
|
static void
|
||||||
framebuffer_texture_with_dims(int dims, GLenum target,
|
framebuffer_texture_with_dims(int dims, GLenum target,
|
||||||
GLenum attachment, GLenum textarget,
|
GLenum attachment, GLenum textarget,
|
||||||
GLuint texture, GLint level, GLint layer,
|
GLuint texture, GLint level, GLsizei samples,
|
||||||
const char *caller)
|
GLint layer, const char *caller)
|
||||||
{
|
{
|
||||||
GET_CURRENT_CONTEXT(ctx);
|
GET_CURRENT_CONTEXT(ctx);
|
||||||
struct gl_framebuffer *fb;
|
struct gl_framebuffer *fb;
|
||||||
|
|
@ -3626,7 +3633,7 @@ framebuffer_texture_with_dims(int dims, GLenum target,
|
||||||
return;
|
return;
|
||||||
|
|
||||||
_mesa_framebuffer_texture(ctx, fb, attachment, att, texObj, textarget,
|
_mesa_framebuffer_texture(ctx, fb, attachment, att, texObj, textarget,
|
||||||
level, layer, GL_FALSE);
|
level, samples, layer, GL_FALSE);
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|
||||||
|
|
@ -3645,7 +3652,7 @@ _mesa_FramebufferTexture1D(GLenum target, GLenum attachment,
|
||||||
GLenum textarget, GLuint texture, GLint level)
|
GLenum textarget, GLuint texture, GLint level)
|
||||||
{
|
{
|
||||||
framebuffer_texture_with_dims(1, target, attachment, textarget, texture,
|
framebuffer_texture_with_dims(1, target, attachment, textarget, texture,
|
||||||
level, 0, "glFramebufferTexture1D");
|
level, 0, 0, "glFramebufferTexture1D");
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|
||||||
|
|
@ -3664,7 +3671,17 @@ _mesa_FramebufferTexture2D(GLenum target, GLenum attachment,
|
||||||
GLenum textarget, GLuint texture, GLint level)
|
GLenum textarget, GLuint texture, GLint level)
|
||||||
{
|
{
|
||||||
framebuffer_texture_with_dims(2, target, attachment, textarget, texture,
|
framebuffer_texture_with_dims(2, target, attachment, textarget, texture,
|
||||||
level, 0, "glFramebufferTexture2D");
|
level, 0, 0, "glFramebufferTexture2D");
|
||||||
|
}
|
||||||
|
|
||||||
|
|
||||||
|
void GLAPIENTRY
|
||||||
|
_mesa_FramebufferTexture2DMultisampleEXT(GLenum target, GLenum attachment,
|
||||||
|
GLenum textarget, GLuint texture,
|
||||||
|
GLint level, GLsizei samples)
|
||||||
|
{
|
||||||
|
framebuffer_texture_with_dims(2, target, attachment, textarget, texture,
|
||||||
|
level, samples, 0, "glFramebufferTexture2DMultisampleEXT");
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|
||||||
|
|
@ -3684,7 +3701,7 @@ _mesa_FramebufferTexture3D(GLenum target, GLenum attachment,
|
||||||
GLint level, GLint layer)
|
GLint level, GLint layer)
|
||||||
{
|
{
|
||||||
framebuffer_texture_with_dims(3, target, attachment, textarget, texture,
|
framebuffer_texture_with_dims(3, target, attachment, textarget, texture,
|
||||||
level, layer, "glFramebufferTexture3D");
|
level, 0, layer, "glFramebufferTexture3D");
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|
||||||
|
|
@ -3774,7 +3791,7 @@ frame_buffer_texture(GLuint framebuffer, GLenum target,
|
||||||
}
|
}
|
||||||
|
|
||||||
_mesa_framebuffer_texture(ctx, fb, attachment, att, texObj, textarget,
|
_mesa_framebuffer_texture(ctx, fb, attachment, att, texObj, textarget,
|
||||||
level, layer, layered);
|
level, 0, layer, layered);
|
||||||
}
|
}
|
||||||
|
|
||||||
void GLAPIENTRY
|
void GLAPIENTRY
|
||||||
|
|
@ -4357,6 +4374,18 @@ get_framebuffer_attachment_parameter(struct gl_context *ctx,
|
||||||
goto invalid_pname_enum;
|
goto invalid_pname_enum;
|
||||||
}
|
}
|
||||||
return;
|
return;
|
||||||
|
case GL_FRAMEBUFFER_ATTACHMENT_TEXTURE_SAMPLES_EXT:
|
||||||
|
if (!ctx->Extensions.EXT_multisampled_render_to_texture) {
|
||||||
|
goto invalid_pname_enum;
|
||||||
|
} else if (att->Type == GL_TEXTURE) {
|
||||||
|
*params = att->NumSamples;
|
||||||
|
} else if (att->Type == GL_NONE) {
|
||||||
|
_mesa_error(ctx, err, "%s(invalid pname %s)", caller,
|
||||||
|
_mesa_enum_to_string(pname));
|
||||||
|
} else {
|
||||||
|
goto invalid_pname_enum;
|
||||||
|
}
|
||||||
|
return;
|
||||||
default:
|
default:
|
||||||
goto invalid_pname_enum;
|
goto invalid_pname_enum;
|
||||||
}
|
}
|
||||||
|
|
|
||||||
|
|
@ -129,7 +129,8 @@ _mesa_framebuffer_texture(struct gl_context *ctx, struct gl_framebuffer *fb,
|
||||||
GLenum attachment,
|
GLenum attachment,
|
||||||
struct gl_renderbuffer_attachment *att,
|
struct gl_renderbuffer_attachment *att,
|
||||||
struct gl_texture_object *texObj, GLenum textarget,
|
struct gl_texture_object *texObj, GLenum textarget,
|
||||||
GLint level, GLuint layer, GLboolean layered);
|
GLint level, GLsizei samples,
|
||||||
|
GLuint layer, GLboolean layered);
|
||||||
|
|
||||||
extern GLenum
|
extern GLenum
|
||||||
_mesa_check_framebuffer_status(struct gl_context *ctx,
|
_mesa_check_framebuffer_status(struct gl_context *ctx,
|
||||||
|
|
@ -250,6 +251,11 @@ extern void GLAPIENTRY
|
||||||
_mesa_FramebufferTexture2D(GLenum target, GLenum attachment,
|
_mesa_FramebufferTexture2D(GLenum target, GLenum attachment,
|
||||||
GLenum textarget, GLuint texture, GLint level);
|
GLenum textarget, GLuint texture, GLint level);
|
||||||
|
|
||||||
|
void GLAPIENTRY
|
||||||
|
_mesa_FramebufferTexture2DMultisampleEXT(GLenum target, GLenum attachment,
|
||||||
|
GLenum textarget, GLuint texture,
|
||||||
|
GLint level, GLsizei samples);
|
||||||
|
|
||||||
extern void GLAPIENTRY
|
extern void GLAPIENTRY
|
||||||
_mesa_FramebufferTexture3D_no_error(GLenum target, GLenum attachment,
|
_mesa_FramebufferTexture3D_no_error(GLenum target, GLenum attachment,
|
||||||
GLenum textarget, GLuint texture,
|
GLenum textarget, GLuint texture,
|
||||||
|
|
|
||||||
|
|
@ -151,6 +151,9 @@ typedef int GLclampx;
|
||||||
*/
|
*/
|
||||||
#define GL_SHADER_PROGRAM_MESA 0x9999
|
#define GL_SHADER_PROGRAM_MESA 0x9999
|
||||||
|
|
||||||
|
#ifndef GL_EXT_multisampled_render_to_texture
|
||||||
|
#define GL_FRAMEBUFFER_ATTACHMENT_TEXTURE_SAMPLES_EXT 0x8D6C
|
||||||
|
#endif
|
||||||
|
|
||||||
#ifdef __cplusplus
|
#ifdef __cplusplus
|
||||||
}
|
}
|
||||||
|
|
|
||||||
|
|
@ -3414,6 +3414,7 @@ struct gl_renderbuffer_attachment
|
||||||
*/
|
*/
|
||||||
struct gl_texture_object *Texture;
|
struct gl_texture_object *Texture;
|
||||||
GLuint TextureLevel; /**< Attached mipmap level. */
|
GLuint TextureLevel; /**< Attached mipmap level. */
|
||||||
|
GLsizei NumSamples; /**< from FramebufferTexture2DMultisampleEXT */
|
||||||
GLuint CubeMapFace; /**< 0 .. 5, for cube map textures. */
|
GLuint CubeMapFace; /**< 0 .. 5, for cube map textures. */
|
||||||
GLuint Zoffset; /**< Slice for 3D textures, or layer for both 1D
|
GLuint Zoffset; /**< Slice for 3D textures, or layer for both 1D
|
||||||
* and 2D array textures */
|
* and 2D array textures */
|
||||||
|
|
@ -4254,6 +4255,7 @@ struct gl_extensions
|
||||||
GLboolean EXT_gpu_shader4;
|
GLboolean EXT_gpu_shader4;
|
||||||
GLboolean EXT_memory_object;
|
GLboolean EXT_memory_object;
|
||||||
GLboolean EXT_memory_object_fd;
|
GLboolean EXT_memory_object_fd;
|
||||||
|
GLboolean EXT_multisampled_render_to_texture;
|
||||||
GLboolean EXT_packed_float;
|
GLboolean EXT_packed_float;
|
||||||
GLboolean EXT_pixel_buffer_object;
|
GLboolean EXT_pixel_buffer_object;
|
||||||
GLboolean EXT_point_parameters;
|
GLboolean EXT_point_parameters;
|
||||||
|
|
|
||||||
Loading…
Add table
Reference in a new issue