[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