From 1b331ae505e63033634d9f5267ca1949336f75d8 Mon Sep 17 00:00:00 2001 From: "Kristian H. Kristensen" Date: Mon, 5 Nov 2018 21:19:21 -0800 Subject: [PATCH] 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 Signed-off-by: Kristian H. Kristensen --- .../EXT_multisampled_render_to_texture.xml | 34 +++++++++++ src/mapi/glapi/gen/Makefile.am | 1 + src/mapi/glapi/gen/gl_API.xml | 2 + src/mapi/glapi/gen/meson.build | 1 + src/mesa/drivers/common/meta.c | 2 +- src/mesa/main/extensions_table.h | 2 + src/mesa/main/fbobject.c | 57 ++++++++++++++----- src/mesa/main/fbobject.h | 8 ++- src/mesa/main/glheader.h | 3 + src/mesa/main/mtypes.h | 2 + 10 files changed, 96 insertions(+), 16 deletions(-) create mode 100644 src/mapi/glapi/gen/EXT_multisampled_render_to_texture.xml diff --git a/src/mapi/glapi/gen/EXT_multisampled_render_to_texture.xml b/src/mapi/glapi/gen/EXT_multisampled_render_to_texture.xml new file mode 100644 index 00000000000..555b008bd33 --- /dev/null +++ b/src/mapi/glapi/gen/EXT_multisampled_render_to_texture.xml @@ -0,0 +1,34 @@ + + + + + + + + + + + + + + + + + + + + + + + + + + diff --git a/src/mapi/glapi/gen/Makefile.am b/src/mapi/glapi/gen/Makefile.am index 6e0ee1e1687..40538b0ff2e 100644 --- a/src/mapi/glapi/gen/Makefile.am +++ b/src/mapi/glapi/gen/Makefile.am @@ -200,6 +200,7 @@ API_XML = \ EXT_external_objects_fd.xml \ EXT_framebuffer_object.xml \ EXT_gpu_shader4.xml \ + EXT_multisampled_render_to_texture.xml \ EXT_packed_depth_stencil.xml \ EXT_provoking_vertex.xml \ EXT_separate_shader_objects.xml \ diff --git a/src/mapi/glapi/gen/gl_API.xml b/src/mapi/glapi/gen/gl_API.xml index f4d0808f13b..f1def8090de 100644 --- a/src/mapi/glapi/gen/gl_API.xml +++ b/src/mapi/glapi/gen/gl_API.xml @@ -8175,6 +8175,8 @@ + + diff --git a/src/mapi/glapi/gen/meson.build b/src/mapi/glapi/gen/meson.build index f494e9707b6..8cc163b2989 100644 --- a/src/mapi/glapi/gen/meson.build +++ b/src/mapi/glapi/gen/meson.build @@ -107,6 +107,7 @@ api_xml_files = files( 'EXT_external_objects_fd.xml', 'EXT_framebuffer_object.xml', 'EXT_gpu_shader4.xml', + 'EXT_multisampled_render_to_texture.xml', 'EXT_packed_depth_stencil.xml', 'EXT_provoking_vertex.xml', 'EXT_separate_shader_objects.xml', diff --git a/src/mesa/drivers/common/meta.c b/src/mesa/drivers/common/meta.c index 4392c4bbd88..3515e312023 100644 --- a/src/mesa/drivers/common/meta.c +++ b/src/mesa/drivers/common/meta.c @@ -127,7 +127,7 @@ _mesa_meta_framebuffer_texture_image(struct gl_context *ctx, assert(att); _mesa_framebuffer_texture(ctx, fb, attachment, att, texObj, texTarget, - level, layer, false); + level, att->NumSamples, layer, false); } static struct gl_shader * diff --git a/src/mesa/main/extensions_table.h b/src/mesa/main/extensions_table.h index 7e45ffe4047..dad38124d57 100644 --- a/src/mesa/main/extensions_table.h +++ b/src/mesa/main/extensions_table.h @@ -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_fd , EXT_memory_object_fd , GLL, GLC, x , ES2, 2017) 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_packed_depth_stencil , dummy_true , GLL, GLC, x , x , 2005) EXT(EXT_packed_float , EXT_packed_float , GLL, GLC, x , x , 2004) diff --git a/src/mesa/main/fbobject.c b/src/mesa/main/fbobject.c index 68e0daf3423..23e49396199 100644 --- a/src/mesa/main/fbobject.c +++ b/src/mesa/main/fbobject.c @@ -497,8 +497,8 @@ set_texture_attachment(struct gl_context *ctx, struct gl_framebuffer *fb, struct gl_renderbuffer_attachment *att, struct gl_texture_object *texObj, - GLenum texTarget, GLuint level, GLuint layer, - GLboolean layered) + GLenum texTarget, GLuint level, GLsizei samples, + GLuint layer, GLboolean layered) { struct gl_renderbuffer *rb = att->Renderbuffer; @@ -520,6 +520,7 @@ set_texture_attachment(struct gl_context *ctx, /* always update these fields */ att->TextureLevel = level; + att->NumSamples = samples; att->CubeMapFace = _mesa_tex_target_to_face(texTarget); att->Zoffset = layer; att->Layered = layered; @@ -1085,8 +1086,11 @@ _mesa_test_framebuffer_completeness(struct gl_context *ctx, return; } - attNumSamples = texImg->NumSamples; - attNumStorageSamples = texImg->NumSamples; + if (att->NumSamples > 0) + attNumSamples = att->NumSamples; + else + attNumSamples = texImg->NumSamples; + attNumStorageSamples = attNumSamples; } else if (att->Type == GL_RENDERBUFFER_EXT) { minWidth = MIN2(minWidth, att->Renderbuffer->Width); @@ -3498,7 +3502,8 @@ _mesa_framebuffer_texture(struct gl_context *ctx, struct gl_framebuffer *fb, GLenum attachment, struct gl_renderbuffer_attachment *att, 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); @@ -3509,6 +3514,7 @@ _mesa_framebuffer_texture(struct gl_context *ctx, struct gl_framebuffer *fb, level == fb->Attachment[BUFFER_STENCIL].TextureLevel && _mesa_tex_target_to_face(textarget) == fb->Attachment[BUFFER_STENCIL].CubeMapFace && + samples == fb->Attachment[BUFFER_STENCIL].NumSamples && layer == fb->Attachment[BUFFER_STENCIL].Zoffset) { /* The texture object is already attached to the stencil attachment * 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 && _mesa_tex_target_to_face(textarget) == fb->Attachment[BUFFER_DEPTH].CubeMapFace && + samples == fb->Attachment[BUFFER_DEPTH].NumSamples && layer == fb->Attachment[BUFFER_DEPTH].Zoffset) { /* As above, but with depth and stencil transposed. */ reuse_framebuffer_texture_attachment(fb, BUFFER_STENCIL, BUFFER_DEPTH); } else { set_texture_attachment(ctx, fb, att, texObj, textarget, - level, layer, layered); + level, samples, layer, layered); if (attachment == GL_DEPTH_STENCIL_ATTACHMENT) { /* 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); _mesa_framebuffer_texture(ctx, fb, attachment, att, texObj, textarget, - level, layer, GL_FALSE); + level, 0, layer, GL_FALSE); } static void framebuffer_texture_with_dims(int dims, GLenum target, GLenum attachment, GLenum textarget, - GLuint texture, GLint level, GLint layer, - const char *caller) + GLuint texture, GLint level, GLsizei samples, + GLint layer, const char *caller) { GET_CURRENT_CONTEXT(ctx); struct gl_framebuffer *fb; @@ -3626,7 +3633,7 @@ framebuffer_texture_with_dims(int dims, GLenum target, return; _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) { 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) { 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) { 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, - level, layer, layered); + level, 0, layer, layered); } void GLAPIENTRY @@ -4357,6 +4374,18 @@ get_framebuffer_attachment_parameter(struct gl_context *ctx, goto invalid_pname_enum; } 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: goto invalid_pname_enum; } diff --git a/src/mesa/main/fbobject.h b/src/mesa/main/fbobject.h index 5cd3c60297f..fcf9835dfa4 100644 --- a/src/mesa/main/fbobject.h +++ b/src/mesa/main/fbobject.h @@ -129,7 +129,8 @@ _mesa_framebuffer_texture(struct gl_context *ctx, struct gl_framebuffer *fb, GLenum attachment, struct gl_renderbuffer_attachment *att, struct gl_texture_object *texObj, GLenum textarget, - GLint level, GLuint layer, GLboolean layered); + GLint level, GLsizei samples, + GLuint layer, GLboolean layered); extern GLenum _mesa_check_framebuffer_status(struct gl_context *ctx, @@ -250,6 +251,11 @@ extern void GLAPIENTRY _mesa_FramebufferTexture2D(GLenum target, GLenum attachment, 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 _mesa_FramebufferTexture3D_no_error(GLenum target, GLenum attachment, GLenum textarget, GLuint texture, diff --git a/src/mesa/main/glheader.h b/src/mesa/main/glheader.h index 4dd9a182be1..5764b83ffbb 100644 --- a/src/mesa/main/glheader.h +++ b/src/mesa/main/glheader.h @@ -151,6 +151,9 @@ typedef int GLclampx; */ #define GL_SHADER_PROGRAM_MESA 0x9999 +#ifndef GL_EXT_multisampled_render_to_texture +#define GL_FRAMEBUFFER_ATTACHMENT_TEXTURE_SAMPLES_EXT 0x8D6C +#endif #ifdef __cplusplus } diff --git a/src/mesa/main/mtypes.h b/src/mesa/main/mtypes.h index 411d30602f2..3d4673aa7e8 100644 --- a/src/mesa/main/mtypes.h +++ b/src/mesa/main/mtypes.h @@ -3414,6 +3414,7 @@ struct gl_renderbuffer_attachment */ struct gl_texture_object *Texture; GLuint TextureLevel; /**< Attached mipmap level. */ + GLsizei NumSamples; /**< from FramebufferTexture2DMultisampleEXT */ GLuint CubeMapFace; /**< 0 .. 5, for cube map textures. */ GLuint Zoffset; /**< Slice for 3D textures, or layer for both 1D * and 2D array textures */ @@ -4254,6 +4255,7 @@ struct gl_extensions GLboolean EXT_gpu_shader4; GLboolean EXT_memory_object; GLboolean EXT_memory_object_fd; + GLboolean EXT_multisampled_render_to_texture; GLboolean EXT_packed_float; GLboolean EXT_pixel_buffer_object; GLboolean EXT_point_parameters; -- 2.30.2