[Mesa-dev] [PATCH v3 5/6] st/mesa: add support for GL_EXT_window_rectangles

Nicolai Hähnle nhaehnle at gmail.com
Tue Jun 14 10:35:49 UTC 2016


Reviewed-by: Nicolai Hähnle <nicolai.haehnle at amd.com>

On 12.06.2016 08:37, Ilia Mirkin wrote:
> Make sure to pass the requisite information in draws, blits, and clears
> that work on the context's draw buffer.
>
> Signed-off-by: Ilia Mirkin <imirkin at alum.mit.edu>
> ---
>   src/mesa/Makefile.sources                 |  2 ++
>   src/mesa/state_tracker/st_atom.c          |  1 +
>   src/mesa/state_tracker/st_atom.h          |  1 +
>   src/mesa/state_tracker/st_atom_scissor.c  | 49 +++++++++++++++++++++++++++++
>   src/mesa/state_tracker/st_cb_blit.c       |  5 +++
>   src/mesa/state_tracker/st_cb_clear.c      | 17 ++++++++++-
>   src/mesa/state_tracker/st_cb_drawpixels.c |  4 +++
>   src/mesa/state_tracker/st_context.h       |  5 +++
>   src/mesa/state_tracker/st_extensions.c    |  4 +++
>   src/mesa/state_tracker/st_scissor.c       | 51 +++++++++++++++++++++++++++++++
>   src/mesa/state_tracker/st_scissor.h       | 38 +++++++++++++++++++++++
>   11 files changed, 176 insertions(+), 1 deletion(-)
>   create mode 100644 src/mesa/state_tracker/st_scissor.c
>   create mode 100644 src/mesa/state_tracker/st_scissor.h
>
> diff --git a/src/mesa/Makefile.sources b/src/mesa/Makefile.sources
> index a49ad95..d95153d 100644
> --- a/src/mesa/Makefile.sources
> +++ b/src/mesa/Makefile.sources
> @@ -505,6 +505,8 @@ STATETRACKER_FILES = \
>   	state_tracker/st_pbo.h \
>   	state_tracker/st_program.c \
>   	state_tracker/st_program.h \
> +	state_tracker/st_scissor.c \
> +	state_tracker/st_scissor.h \
>   	state_tracker/st_texture.c \
>   	state_tracker/st_texture.h \
>   	state_tracker/st_vdpau.c \
> diff --git a/src/mesa/state_tracker/st_atom.c b/src/mesa/state_tracker/st_atom.c
> index fc80adf..b9d3191 100644
> --- a/src/mesa/state_tracker/st_atom.c
> +++ b/src/mesa/state_tracker/st_atom.c
> @@ -55,6 +55,7 @@ static const struct st_tracked_state *render_atoms[] =
>      &st_update_polygon_stipple,
>      &st_update_viewport,
>      &st_update_scissor,
> +   &st_update_window_rectangles,
>      &st_update_blend,
>      &st_update_vertex_texture,
>      &st_update_fragment_texture,
> diff --git a/src/mesa/state_tracker/st_atom.h b/src/mesa/state_tracker/st_atom.h
> index 31bb2dd..d5fb941 100644
> --- a/src/mesa/state_tracker/st_atom.h
> +++ b/src/mesa/state_tracker/st_atom.h
> @@ -63,6 +63,7 @@ extern const struct st_tracked_state st_update_rasterizer;
>   extern const struct st_tracked_state st_update_polygon_stipple;
>   extern const struct st_tracked_state st_update_viewport;
>   extern const struct st_tracked_state st_update_scissor;
> +extern const struct st_tracked_state st_update_window_rectangles;
>   extern const struct st_tracked_state st_update_blend;
>   extern const struct st_tracked_state st_update_msaa;
>   extern const struct st_tracked_state st_update_sample_shading;
> diff --git a/src/mesa/state_tracker/st_atom_scissor.c b/src/mesa/state_tracker/st_atom_scissor.c
> index 605d5cb..357c4bb 100644
> --- a/src/mesa/state_tracker/st_atom_scissor.c
> +++ b/src/mesa/state_tracker/st_atom_scissor.c
> @@ -99,6 +99,46 @@ update_scissor( struct st_context *st )
>         st->pipe->set_scissor_states(st->pipe, 0, ctx->Const.MaxViewports, scissor); /* activate */
>   }
>
> +static void
> +update_window_rectangles(struct st_context *st)
> +{
> +   struct pipe_scissor_state new_rects[PIPE_MAX_WINDOW_RECTANGLES];
> +   const struct gl_context *ctx = st->ctx;
> +   const struct gl_scissor_attrib *scissor = &ctx->Scissor;
> +   unsigned i;
> +   bool changed = false;
> +   unsigned num_rects = scissor->NumWindowRects;
> +   bool include = scissor->WindowRectMode == GL_INCLUSIVE_EXT;
> +
> +   if (ctx->DrawBuffer == ctx->WinSysDrawBuffer) {
> +      num_rects = 0;
> +      include = false;
> +   }
> +   for (i = 0; i < num_rects; i++) {
> +      const struct gl_scissor_rect *rect = &scissor->WindowRects[i];
> +      new_rects[i].minx = MAX2(rect->X, 0);
> +      new_rects[i].miny = MAX2(rect->Y, 0);
> +      new_rects[i].maxx = MAX2(rect->X + rect->Width, 0);
> +      new_rects[i].maxy = MAX2(rect->Y + rect->Height, 0);
> +   }
> +   if (num_rects > 0 && memcmp(new_rects, st->state.window_rects.rects,
> +                               num_rects * sizeof(struct pipe_scissor_state))) {
> +      memcpy(st->state.window_rects.rects, new_rects,
> +             num_rects * sizeof(struct pipe_scissor_state));
> +      changed = true;
> +   }
> +   if (st->state.window_rects.num != num_rects) {
> +      st->state.window_rects.num = num_rects;
> +      changed = true;
> +   }
> +   if (st->state.window_rects.include != include) {
> +      st->state.window_rects.include = include;
> +      changed = true;
> +   }
> +   if (changed)
> +      st->pipe->set_window_rectangle_states(
> +            st->pipe, include, num_rects, new_rects);
> +}
>
>   const struct st_tracked_state st_update_scissor = {
>      "st_update_scissor",					/* name */
> @@ -108,3 +148,12 @@ const struct st_tracked_state st_update_scissor = {
>      },
>      update_scissor					/* update */
>   };
> +
> +const struct st_tracked_state st_update_window_rectangles = {
> +   "st_update_window_rectangles",			/* name */
> +   {							/* dirty */
> +      (_NEW_SCISSOR | _NEW_BUFFERS),			/* mesa */
> +      0,						/* st */
> +   },
> +   update_window_rectangles				/* update */
> +};
> diff --git a/src/mesa/state_tracker/st_cb_blit.c b/src/mesa/state_tracker/st_cb_blit.c
> index a05a5af..be0b103 100644
> --- a/src/mesa/state_tracker/st_cb_blit.c
> +++ b/src/mesa/state_tracker/st_cb_blit.c
> @@ -40,6 +40,7 @@
>   #include "st_cb_blit.h"
>   #include "st_cb_fbo.h"
>   #include "st_manager.h"
> +#include "st_scissor.h"
>
>   #include "util/u_format.h"
>
> @@ -117,6 +118,7 @@ st_BlitFramebuffer(struct gl_context *ctx,
>                           &clip.dstX0, &clip.dstY0, &clip.dstX1, &clip.dstY1)) {
>         return; /* nothing to draw/blit */
>      }
> +   memset(&blit, 0, sizeof(struct pipe_blit_info));
>      blit.scissor_enable =
>         (dstX0 != clip.dstX0) ||
>         (dstY0 != clip.dstY0) ||
> @@ -190,6 +192,9 @@ st_BlitFramebuffer(struct gl_context *ctx,
>         blit.src.box.height = srcY0 - srcY1;
>      }
>
> +   if (drawFB != ctx->WinSysDrawBuffer)
> +      st_window_rectangles_to_blit(ctx, &blit);
> +
>      blit.filter = pFilter;
>      blit.render_condition_enable = TRUE;
>      blit.alpha_blend = FALSE;
> diff --git a/src/mesa/state_tracker/st_cb_clear.c b/src/mesa/state_tracker/st_cb_clear.c
> index 362cef4..d630664 100644
> --- a/src/mesa/state_tracker/st_cb_clear.c
> +++ b/src/mesa/state_tracker/st_cb_clear.c
> @@ -320,6 +320,18 @@ is_scissor_enabled(struct gl_context *ctx, struct gl_renderbuffer *rb)
>              (unsigned) ctx->Scissor.ScissorArray[0].Height < rb->Height);
>   }
>
> +/**
> + * Return if window rectangles must be enabled during the clear.
> + */
> +static inline bool
> +is_window_rectangle_enabled(struct gl_context *ctx)
> +{
> +   if (ctx->DrawBuffer == ctx->WinSysDrawBuffer)
> +      return false;
> +   return ctx->Scissor.NumWindowRects > 0 ||
> +      ctx->Scissor.WindowRectMode == GL_INCLUSIVE_EXT;
> +}
> +
>
>   /**
>    * Return if all of the color channels are masked.
> @@ -410,6 +422,7 @@ st_Clear(struct gl_context *ctx, GLbitfield mask)
>                  continue;
>
>               if (is_scissor_enabled(ctx, rb) ||
> +                is_window_rectangle_enabled(ctx) ||
>                   is_color_masked(ctx, colormask_index))
>                  quad_buffers |= PIPE_CLEAR_COLOR0 << i;
>               else
> @@ -422,7 +435,8 @@ st_Clear(struct gl_context *ctx, GLbitfield mask)
>         struct st_renderbuffer *strb = st_renderbuffer(depthRb);
>
>         if (strb->surface && ctx->Depth.Mask) {
> -         if (is_scissor_enabled(ctx, depthRb))
> +         if (is_scissor_enabled(ctx, depthRb) ||
> +             is_window_rectangle_enabled(ctx))
>               quad_buffers |= PIPE_CLEAR_DEPTH;
>            else
>               clear_buffers |= PIPE_CLEAR_DEPTH;
> @@ -433,6 +447,7 @@ st_Clear(struct gl_context *ctx, GLbitfield mask)
>
>         if (strb->surface && !is_stencil_disabled(ctx, stencilRb)) {
>            if (is_scissor_enabled(ctx, stencilRb) ||
> +             is_window_rectangle_enabled(ctx) ||
>                is_stencil_masked(ctx, stencilRb))
>               quad_buffers |= PIPE_CLEAR_STENCIL;
>            else
> diff --git a/src/mesa/state_tracker/st_cb_drawpixels.c b/src/mesa/state_tracker/st_cb_drawpixels.c
> index 311ba25..ae3ca7a 100644
> --- a/src/mesa/state_tracker/st_cb_drawpixels.c
> +++ b/src/mesa/state_tracker/st_cb_drawpixels.c
> @@ -60,6 +60,7 @@
>   #include "st_draw.h"
>   #include "st_format.h"
>   #include "st_program.h"
> +#include "st_scissor.h"
>   #include "st_texture.h"
>
>   #include "pipe/p_context.h"
> @@ -1394,6 +1395,9 @@ blit_copy_pixels(struct gl_context *ctx, GLint srcx, GLint srcy,
>            blit.mask = PIPE_MASK_RGBA;
>            blit.filter = PIPE_TEX_FILTER_NEAREST;
>
> +         if (ctx->DrawBuffer != ctx->WinSysDrawBuffer)
> +            st_window_rectangles_to_blit(ctx, &blit);
> +
>            if (screen->is_format_supported(screen, blit.src.format,
>                                            blit.src.resource->target,
>                                            blit.src.resource->nr_samples,
> diff --git a/src/mesa/state_tracker/st_context.h b/src/mesa/state_tracker/st_context.h
> index a4f56ea..e3bee60 100644
> --- a/src/mesa/state_tracker/st_context.h
> +++ b/src/mesa/state_tracker/st_context.h
> @@ -161,6 +161,11 @@ struct st_context
>         struct pipe_framebuffer_state framebuffer;
>         struct pipe_scissor_state scissor[PIPE_MAX_VIEWPORTS];
>         struct pipe_viewport_state viewport[PIPE_MAX_VIEWPORTS];
> +      struct {
> +         unsigned num;
> +         boolean include;
> +         struct pipe_scissor_state rects[PIPE_MAX_WINDOW_RECTANGLES];
> +      } window_rects;
>         unsigned sample_mask;
>
>         GLuint poly_stipple[32];  /**< In OpenGL's bottom-to-top order */
> diff --git a/src/mesa/state_tracker/st_extensions.c b/src/mesa/state_tracker/st_extensions.c
> index 13b0acc..04f6b1a 100644
> --- a/src/mesa/state_tracker/st_extensions.c
> +++ b/src/mesa/state_tracker/st_extensions.c
> @@ -460,6 +460,9 @@ void st_init_limits(struct pipe_screen *screen,
>       */
>      c->MaxFramebufferLayers =
>         screen->get_param(screen, PIPE_CAP_MAX_TEXTURE_ARRAY_LAYERS);
> +
> +   c->MaxWindowRectangles =
> +      screen->get_param(screen, PIPE_CAP_MAX_WINDOW_RECTANGLES);
>   }
>
>
> @@ -624,6 +627,7 @@ void st_init_extensions(struct pipe_screen *screen,
>         { o(EXT_texture_mirror_clamp),         PIPE_CAP_TEXTURE_MIRROR_CLAMP             },
>         { o(EXT_texture_swizzle),              PIPE_CAP_TEXTURE_SWIZZLE                  },
>         { o(EXT_transform_feedback),           PIPE_CAP_MAX_STREAM_OUTPUT_BUFFERS        },
> +      { o(EXT_window_rectangles),            PIPE_CAP_MAX_WINDOW_RECTANGLES            },
>
>         { o(AMD_pinned_memory),                PIPE_CAP_RESOURCE_FROM_USER_MEMORY        },
>         { o(ATI_meminfo),                      PIPE_CAP_QUERY_MEMORY_INFO                },
> diff --git a/src/mesa/state_tracker/st_scissor.c b/src/mesa/state_tracker/st_scissor.c
> new file mode 100644
> index 0000000..40b8ecc
> --- /dev/null
> +++ b/src/mesa/state_tracker/st_scissor.c
> @@ -0,0 +1,51 @@
> +/**************************************************************************
> + *
> + * Copyright 2016 Ilia Mirkin
> + * All Rights Reserved.
> + *
> + * Permission is hereby granted, free of charge, to any person obtaining a
> + * copy of this software and associated documentation files (the
> + * "Software"), to deal in the Software without restriction, including
> + * without limitation the rights to use, copy, modify, merge, publish,
> + * distribute, sub license, and/or sell copies of the Software, and to
> + * permit persons to whom the Software is furnished to do so, subject to
> + * the following conditions:
> + *
> + * The above copyright notice and this permission notice (including the
> + * next paragraph) shall be included in all copies or substantial portions
> + * of the Software.
> + *
> + * THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS
> + * OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF
> + * MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND NON-INFRINGEMENT.
> + * IN NO EVENT SHALL VMWARE AND/OR ITS SUPPLIERS BE LIABLE FOR
> + * ANY CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER IN AN ACTION OF CONTRACT,
> + * TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN CONNECTION WITH THE
> + * SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE.
> + *
> + **************************************************************************/
> +
> +#include "main/macros.h"
> +#include "main/mtypes.h"
> +#include "pipe/p_state.h"
> +
> +#include "st_scissor.h"
> +
> +void
> +st_window_rectangles_to_blit(const struct gl_context *ctx,
> +                             struct pipe_blit_info *blit)
> +{
> +   unsigned i;
> +
> +   blit->num_window_rectangles = ctx->Scissor.NumWindowRects;
> +   blit->window_rectangle_include =
> +      ctx->Scissor.WindowRectMode == GL_INCLUSIVE_EXT;
> +   for (i = 0; i < blit->num_window_rectangles; i++) {
> +      const struct gl_scissor_rect *src_rect = &ctx->Scissor.WindowRects[i];
> +      struct pipe_scissor_state *dst_rect = &blit->window_rectangles[i];
> +      dst_rect->minx = MAX2(src_rect->X, 0);
> +      dst_rect->miny = MAX2(src_rect->Y, 0);
> +      dst_rect->maxx = MAX2(src_rect->X + src_rect->Width, 0);
> +      dst_rect->maxy = MAX2(src_rect->Y + src_rect->Height, 0);
> +   }
> +}
> diff --git a/src/mesa/state_tracker/st_scissor.h b/src/mesa/state_tracker/st_scissor.h
> new file mode 100644
> index 0000000..4608cb9
> --- /dev/null
> +++ b/src/mesa/state_tracker/st_scissor.h
> @@ -0,0 +1,38 @@
> +/**************************************************************************
> + *
> + * Copyright 2016 Ilia Mirkin.
> + * All Rights Reserved.
> + *
> + * Permission is hereby granted, free of charge, to any person obtaining a
> + * copy of this software and associated documentation files (the
> + * "Software"), to deal in the Software without restriction, including
> + * without limitation the rights to use, copy, modify, merge, publish,
> + * distribute, sub license, and/or sell copies of the Software, and to
> + * permit persons to whom the Software is furnished to do so, subject to
> + * the following conditions:
> + *
> + * The above copyright notice and this permission notice (including the
> + * next paragraph) shall be included in all copies or substantial portions
> + * of the Software.
> + *
> + * THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS
> + * OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF
> + * MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND NON-INFRINGEMENT.
> + * IN NO EVENT SHALL VMWARE AND/OR ITS SUPPLIERS BE LIABLE FOR
> + * ANY CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER IN AN ACTION OF CONTRACT,
> + * TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN CONNECTION WITH THE
> + * SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE.
> + *
> + **************************************************************************/
> +
> +#ifndef ST_SCISSOR_H
> +#define ST_SCISSOR_H
> +
> +struct gl_context;
> +struct pipe_blit_info;
> +
> +void
> +st_window_rectangles_to_blit(const struct gl_context *ctx,
> +                             struct pipe_blit_info *blit);
> +
> +#endif /* ST_SCISSOR_H */
>


More information about the mesa-dev mailing list