I've noticed that none of the blitters use scissor state, and wondered if there was a reason for this.
It looks like drivers are expected to setup scissor state in the framebuffer setup and in the set scissor state, but with r600g due to the underlying state tracking it can end up doing the wrong thing. The 3 patches add CSO cache + u_blit + u_blitter scissor usage. Just wondering if I'm violating some rules of the gallium interface or not. Dave.
From f2498533444c7e4ecde84681544face0da2a5616 Mon Sep 17 00:00:00 2001 From: Dave Airlie <airl...@redhat.com> Date: Wed, 13 Oct 2010 12:00:42 +1000 Subject: [PATCH 1/3] cso: add scissor support --- src/gallium/auxiliary/cso_cache/cso_context.c | 49 +++++++++++++++++++++++++ src/gallium/auxiliary/cso_cache/cso_context.h | 11 ++++++ 2 files changed, 60 insertions(+), 0 deletions(-) diff --git a/src/gallium/auxiliary/cso_cache/cso_context.c b/src/gallium/auxiliary/cso_cache/cso_context.c index 58b022d..5e3dc41 100644 --- a/src/gallium/auxiliary/cso_cache/cso_context.c +++ b/src/gallium/auxiliary/cso_cache/cso_context.c @@ -96,6 +96,8 @@ struct cso_context { struct pipe_clip_state clip; struct pipe_clip_state clip_saved; + struct pipe_scissor_state scissor, scissor_saved; + struct pipe_framebuffer_state fb, fb_saved; struct pipe_viewport_state vp, vp_saved; struct pipe_blend_color blend_color; @@ -1080,6 +1082,53 @@ cso_restore_clip(struct cso_context *ctx) } } +/* scissor state */ + +static INLINE void +scissor_state_cpy(struct pipe_scissor_state *dst, + const struct pipe_scissor_state *src) +{ + dst->minx = src->minx; + dst->miny = src->miny; + dst->maxx = src->maxx; + dst->maxy = src->maxy; +} + +static INLINE int +scissor_state_cmp(const struct pipe_scissor_state *a, + const struct pipe_scissor_state *b) +{ + if ((a->minx != b->minx) || (a->miny != b->miny) || (a->maxx != b->maxx) || (a->maxy != b->maxy)) { + return 1; + } + return 0; +} + +void +cso_set_scissor(struct cso_context *ctx, + const struct pipe_scissor_state *scissor) +{ + if (scissor_state_cmp(&ctx->scissor, scissor)) { + scissor_state_cpy(&ctx->scissor, scissor); + ctx->pipe->set_scissor_state(ctx->pipe, scissor); + } +} + +void +cso_save_scissor(struct cso_context *ctx) +{ + scissor_state_cpy(&ctx->scissor_saved, &ctx->scissor); +} + +void +cso_restore_scissor(struct cso_context *ctx) +{ + if (scissor_state_cmp(&ctx->scissor, &ctx->scissor_saved)) { + scissor_state_cpy(&ctx->scissor, &ctx->scissor_saved); + ctx->pipe->set_scissor_state(ctx->pipe, &ctx->scissor_saved); + } +} + enum pipe_error cso_set_vertex_elements(struct cso_context *ctx, unsigned count, const struct pipe_vertex_element *states) diff --git a/src/gallium/auxiliary/cso_cache/cso_context.h b/src/gallium/auxiliary/cso_cache/cso_context.h index f0b07f7..5380b88 100644 --- a/src/gallium/auxiliary/cso_cache/cso_context.h +++ b/src/gallium/auxiliary/cso_cache/cso_context.h @@ -181,6 +181,17 @@ void cso_restore_clip(struct cso_context *cso); +/* scissor state */ +void +cso_set_scissor(struct cso_context *cso, + const struct pipe_scissor_state *clip); + +void +cso_save_scissor(struct cso_context *cso); + +void +cso_restore_scissor(struct cso_context *cso); + /* fragment sampler view state */ void -- 1.7.2.3
From a15ed013fbd802d9771f06ce760957c318cd12c9 Mon Sep 17 00:00:00 2001 From: Dave Airlie <airl...@redhat.com> Date: Wed, 13 Oct 2010 12:01:00 +1000 Subject: [PATCH 2/3] u_blit: save/restore scissor state across blits. --- src/gallium/auxiliary/util/u_blit.c | 12 ++++++++++++ 1 files changed, 12 insertions(+), 0 deletions(-) diff --git a/src/gallium/auxiliary/util/u_blit.c b/src/gallium/auxiliary/util/u_blit.c index dfb142b..23e1b25 100644 --- a/src/gallium/auxiliary/util/u_blit.c +++ b/src/gallium/auxiliary/util/u_blit.c @@ -63,6 +63,7 @@ struct blit_state struct pipe_sampler_state sampler; struct pipe_viewport_state viewport; struct pipe_clip_state clip; + struct pipe_scissor_state scissor; struct pipe_vertex_element velem[2]; enum pipe_texture_target internal_target; @@ -474,6 +475,7 @@ util_blit_pixels_writemask(struct blit_state *ctx, cso_save_fragment_shader(ctx->cso); cso_save_vertex_shader(ctx->cso); cso_save_clip(ctx->cso); + cso_save_scissor(ctx->cso); cso_save_vertex_elements(ctx->cso); /* set misc state we care about */ @@ -485,6 +487,12 @@ util_blit_pixels_writemask(struct blit_state *ctx, cso_set_clip(ctx->cso, &ctx->clip); cso_set_vertex_elements(ctx->cso, 2, ctx->velem); + ctx->scissor.minx = 0; + ctx->scissor.miny = 0; + ctx->scissor.maxx = dst->width; + ctx->scissor.maxy = dst->height; + cso_set_scissor(ctx->cso, &ctx->scissor); + /* sampler */ ctx->sampler.normalized_coords = normalized; ctx->sampler.min_img_filter = filter; @@ -566,6 +574,7 @@ util_blit_pixels_writemask(struct blit_state *ctx, cso_restore_fragment_shader(ctx->cso); cso_restore_vertex_shader(ctx->cso); cso_restore_clip(ctx->cso); + cso_restore_scissor(ctx->cso); cso_restore_vertex_elements(ctx->cso); pipe_sampler_view_reference(&sampler_view, NULL); @@ -666,6 +675,7 @@ util_blit_pixels_tex(struct blit_state *ctx, cso_save_fragment_shader(ctx->cso); cso_save_vertex_shader(ctx->cso); cso_save_clip(ctx->cso); + cso_save_scissor(ctx->cso); cso_save_vertex_elements(ctx->cso); /* set misc state we care about */ @@ -673,6 +683,7 @@ util_blit_pixels_tex(struct blit_state *ctx, cso_set_depth_stencil_alpha(ctx->cso, &ctx->depthstencil_keep); cso_set_rasterizer(ctx->cso, &ctx->rasterizer); cso_set_clip(ctx->cso, &ctx->clip); + cso_set_scissor(ctx->cso, &ctx->scissor); cso_set_vertex_elements(ctx->cso, 2, ctx->velem); /* sampler */ @@ -733,5 +744,6 @@ util_blit_pixels_tex(struct blit_state *ctx, cso_restore_fragment_shader(ctx->cso); cso_restore_vertex_shader(ctx->cso); cso_restore_clip(ctx->cso); + cso_restore_scissor(ctx->cso); cso_restore_vertex_elements(ctx->cso); } -- 1.7.2.3
From 787a6ff28be241b12e9a9c485063983c92b10e36 Mon Sep 17 00:00:00 2001 From: Dave Airlie <airl...@redhat.com> Date: Wed, 13 Oct 2010 12:01:49 +1000 Subject: [PATCH 3/3] u_blitter: save scissor state and set up properly. --- src/gallium/auxiliary/util/u_blitter.c | 6 ++++++ src/gallium/auxiliary/util/u_blitter.h | 8 ++++++++ src/gallium/drivers/nvfx/nvfx_surface.c | 1 + src/gallium/drivers/r300/r300_blit.c | 1 + 4 files changed, 16 insertions(+), 0 deletions(-) diff --git a/src/gallium/auxiliary/util/u_blitter.c b/src/gallium/auxiliary/util/u_blitter.c index a163f93..7bc53e7 100644 --- a/src/gallium/auxiliary/util/u_blitter.c +++ b/src/gallium/auxiliary/util/u_blitter.c @@ -315,6 +315,7 @@ static void blitter_restore_CSOs(struct blitter_context_priv *ctx) pipe->set_viewport_state(pipe, &ctx->base.saved_viewport); pipe->set_clip_state(pipe, &ctx->base.saved_clip); + pipe->set_scissor_state(pipe, &ctx->base.saved_scissor); /* restore the state objects which are required to be saved before copy/fill */ @@ -727,6 +728,7 @@ void util_blitter_copy_region(struct blitter_context *blitter, struct pipe_screen *screen = pipe->screen; struct pipe_surface *dstsurf; struct pipe_framebuffer_state fb_state; + struct pipe_scissor_state scissor_state; struct pipe_sampler_view viewTempl, *view; unsigned bind; boolean is_stencil, is_depth; @@ -779,6 +781,9 @@ void util_blitter_copy_region(struct blitter_context *blitter, assert(blitter->saved_num_sampler_states != ~0); /* Initialize framebuffer state. */ + scissor_state.minx = scissor_state.miny = 0; + scissor_state.maxx = dstsurf->width; + scissor_state.maxy = dstsurf->height; fb_state.width = dstsurf->width; fb_state.height = dstsurf->height; @@ -816,6 +821,7 @@ void util_blitter_copy_region(struct blitter_context *blitter, pipe->bind_vertex_elements_state(pipe, ctx->velem_state); pipe->set_fragment_sampler_views(pipe, 1, &view); pipe->set_framebuffer_state(pipe, &fb_state); + pipe->set_scissor_state(pipe, &scissor_state); blitter_set_dst_dimensions(ctx, dstsurf->width, dstsurf->height); diff --git a/src/gallium/auxiliary/util/u_blitter.h b/src/gallium/auxiliary/util/u_blitter.h index f9f96f2..55bc5c0 100644 --- a/src/gallium/auxiliary/util/u_blitter.h +++ b/src/gallium/auxiliary/util/u_blitter.h @@ -92,6 +92,7 @@ struct blitter_context struct pipe_stencil_ref saved_stencil_ref; /**< stencil ref */ struct pipe_viewport_state saved_viewport; struct pipe_clip_state saved_clip; + struct pipe_scissor_state saved_scissor; int saved_num_sampler_states; void *saved_sampler_states[PIPE_MAX_SAMPLERS]; @@ -288,6 +289,13 @@ void util_blitter_save_clip(struct blitter_context *blitter, } static INLINE +void util_blitter_save_scissor(struct blitter_context *blitter, + struct pipe_scissor_state *state) +{ + blitter->saved_scissor = *state; +} + +static INLINE void util_blitter_save_fragment_sampler_states( struct blitter_context *blitter, int num_sampler_states, diff --git a/src/gallium/drivers/nvfx/nvfx_surface.c b/src/gallium/drivers/nvfx/nvfx_surface.c index 70adebc..f282165 100644 --- a/src/gallium/drivers/nvfx/nvfx_surface.c +++ b/src/gallium/drivers/nvfx/nvfx_surface.c @@ -187,6 +187,7 @@ nvfx_get_blitter(struct pipe_context* pipe, int copy) util_blitter_save_viewport(blitter, &nvfx->viewport); util_blitter_save_framebuffer(blitter, &nvfx->framebuffer); util_blitter_save_clip(blitter, &nvfx->clip); + util_blitter_save_scissor(blitter, &nvfx->scissor); util_blitter_save_vertex_elements(blitter, nvfx->vtxelt); util_blitter_save_vertex_buffers(blitter, nvfx->vtxbuf_nr, nvfx->vtxbuf); diff --git a/src/gallium/drivers/r300/r300_blit.c b/src/gallium/drivers/r300/r300_blit.c index 91a374a..75b4d99 100644 --- a/src/gallium/drivers/r300/r300_blit.c +++ b/src/gallium/drivers/r300/r300_blit.c @@ -54,6 +54,7 @@ static void r300_blitter_begin(struct r300_context* r300, enum r300_blitter_op o util_blitter_save_vertex_shader(r300->blitter, r300->vs_state.state); util_blitter_save_viewport(r300->blitter, &r300->viewport); util_blitter_save_clip(r300->blitter, (struct pipe_clip_state*)r300->clip_state.state); + util_blitter_save_scissor(r300->blitter, (struct pipe_scissor_state*)r300->scissor_state.state); util_blitter_save_vertex_elements(r300->blitter, r300->velems); util_blitter_save_vertex_buffers(r300->blitter, r300->vertex_buffer_count, r300->vertex_buffer); -- 1.7.2.3
_______________________________________________ mesa-dev mailing list mesa-dev@lists.freedesktop.org http://lists.freedesktop.org/mailman/listinfo/mesa-dev