[Mesa-dev] [PATCH v2 1/5] mesa: Add core support for EXT_multisampled_render_to_texture2

Ilia Mirkin imirkin at alum.mit.edu
Tue Nov 6 23:02:56 UTC 2018


On Tue, Nov 6, 2018 at 5:18 PM Kristian H. Kristensen
<hoegsberg at gmail.com> wrote:
>
> This also turns on EXT_multisampled_render_to_texture which is a
> subset of EXT_multisampled_render_to_texture2, allowing only
> COLOR_ATTACHMENT0.

You also enable the texture2 variant as well, no?

>
> Signed-off-by: Kristian H. Kristensen <hoegsberg at chromium.org>
> ---
>  .../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                      | 45 +++++++++++++------
>  src/mesa/main/fbobject.h                      |  8 +++-
>  src/mesa/main/mtypes.h                        |  2 +
>  9 files changed, 81 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..cf44e6976f0
> --- /dev/null
> +++ b/src/mapi/glapi/gen/EXT_multisampled_render_to_texture.xml
> @@ -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"/>

I don't see any logic to enable retrieving these (*_SAMPLES_EXT), so I
think this implementation is slightly incomplete.

> +
> +<!-- Already defined in FramebufferTexture2DMultisampleEXT

I think you meant to say something else here...

> +    <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>
> 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 aae9a5835db..ee4d13f1f06 100644
> --- a/src/mapi/glapi/gen/gl_API.xml
> +++ b/src/mapi/glapi/gen/gl_API.xml
> @@ -8166,6 +8166,8 @@
>
>  <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"/>
>
>  <category name="GL_ARB_transform_feedback_instanced" number="109">
> 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 a516a1b17f8..f13b8b6a21a 100644
> --- a/src/mesa/main/extensions_table.h
> +++ b/src/mesa/main/extensions_table.h
> @@ -241,6 +241,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_query                    ,  x ,  x ,  x , ES2, 2001)
>  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 c3dded6b928..d270dbb1648 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;
> @@ -1084,8 +1085,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;

Do you want attNumStorageSamples to be attNumSamples here, or
texImg->NumSamples? Not sure what this affects...

>        }
>        else if (att->Type == GL_RENDERBUFFER_EXT) {
>           minWidth = MIN2(minWidth, att->Renderbuffer->Width);
> @@ -3497,7 +3501,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);
>
> @@ -3508,6 +3513,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
> @@ -3521,13 +3527,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
> @@ -3582,15 +3589,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, NO_SAMPLES, 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;
> @@ -3625,7 +3632,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);
>  }
>
>
> @@ -3644,7 +3651,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");
>  }
>
>
> @@ -3663,7 +3670,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");
>  }
>
>
> @@ -3683,7 +3700,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");
>  }
>
>
> @@ -3773,7 +3790,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
> 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/mtypes.h b/src/mesa/main/mtypes.h
> index 656e1226f94..88ec55ff333 100644
> --- a/src/mesa/main/mtypes.h
> +++ b/src/mesa/main/mtypes.h
> @@ -3404,6 +3404,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 */
> @@ -4244,6 +4245,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.19.1.930.g4563a0d9d0-goog
>
> _______________________________________________
> mesa-dev mailing list
> mesa-dev at lists.freedesktop.org
> https://lists.freedesktop.org/mailman/listinfo/mesa-dev


More information about the mesa-dev mailing list