From 5d5af7d359e0060fa00b90a8f04900b96f9058b0 Mon Sep 17 00:00:00 2001 From: Christoph Bumiller Date: Wed, 25 Jul 2012 13:47:58 +0200 Subject: [PATCH] gallium: specify resource_resolve destination via a pipe_surface The format member of pipe_surface may differ from that of the pipe_resource, which is used to communicate, for instance, whether sRGB encode should be enabled in the resolve operation or not. Fixes resolve to sRGB surfaces in mesa/st when GL_FRAMEBUFFER_SRGB is disabled. Reviewed-by: Brian Paul --- src/gallium/drivers/nv30/nv30_miptree.c | 5 +++- src/gallium/drivers/nv50/nv50_surface.c | 32 ++++++++++--------------- src/gallium/drivers/nvc0/nvc0_surface.c | 32 ++++++++++--------------- src/gallium/drivers/r300/r300_render.c | 7 +----- src/gallium/include/pipe/p_state.h | 6 ++--- src/mesa/state_tracker/st_cb_blit.c | 15 +++++------- 6 files changed, 39 insertions(+), 58 deletions(-) diff --git a/src/gallium/drivers/nv30/nv30_miptree.c b/src/gallium/drivers/nv30/nv30_miptree.c index 7e677291f6a..cd6a81428d9 100644 --- a/src/gallium/drivers/nv30/nv30_miptree.c +++ b/src/gallium/drivers/nv30/nv30_miptree.c @@ -153,7 +153,10 @@ nv30_resource_resolve(struct pipe_context *pipe, define_rect(info->src.res, 0, 0, info->src.x0, info->src.y0, info->src.x1 - info->src.x0, info->src.y1 - info->src.y0, &src); - define_rect(info->dst.res, info->dst.level, 0, info->dst.x0, info->dst.y0, + define_rect(info->dst.surface->texture, + info->dst.surface->u.tex.level, + info->dst.surface->u.tex.first_layer, + info->dst.x0, info->dst.y0, info->dst.x1 - info->dst.x0, info->dst.y1 - info->dst.y0, &dst); nv30_transfer_rect(nv30, BILINEAR, &src, &dst); diff --git a/src/gallium/drivers/nv50/nv50_surface.c b/src/gallium/drivers/nv50/nv50_surface.c index 0872f8d0dc4..ed5223b2085 100644 --- a/src/gallium/drivers/nv50/nv50_surface.c +++ b/src/gallium/drivers/nv50/nv50_surface.c @@ -436,6 +436,7 @@ struct nv50_blitctx unsigned num_samplers[3]; struct pipe_sampler_view *texture[2]; struct nv50_tsc_entry *sampler[2]; + enum pipe_format format; unsigned dirty; } saved; struct nv50_program vp; @@ -661,26 +662,19 @@ nv50_blitctx_get_color_mask_and_fp(struct nv50_blitctx *blit, } static void -nv50_blit_set_dst(struct nv50_context *nv50, - struct pipe_resource *res, unsigned level, unsigned layer) +nv50_blit_set_dst(struct nv50_context *nv50, struct pipe_surface *surf, + struct nv50_blitctx *blit) { - struct pipe_context *pipe = &nv50->base.pipe; - struct pipe_surface templ; + blit->saved.format = surf->format; - if (util_format_is_depth_or_stencil(res->format)) - templ.format = nv50_blit_zeta_to_colour_format(res->format); - else - templ.format = res->format; - - templ.usage = PIPE_USAGE_STREAM; - templ.u.tex.level = level; - templ.u.tex.first_layer = templ.u.tex.last_layer = layer; + if (util_format_is_depth_or_stencil(surf->format)) + surf->format = nv50_blit_zeta_to_colour_format(surf->format); - nv50->framebuffer.cbufs[0] = nv50_miptree_surface_new(pipe, res, &templ); + nv50->framebuffer.cbufs[0] = surf; nv50->framebuffer.nr_cbufs = 1; nv50->framebuffer.zsbuf = NULL; - nv50->framebuffer.width = nv50->framebuffer.cbufs[0]->width; - nv50->framebuffer.height = nv50->framebuffer.cbufs[0]->height; + nv50->framebuffer.width = surf->width; + nv50->framebuffer.height = surf->height; } static INLINE void @@ -822,7 +816,7 @@ nv50_blitctx_post_blit(struct nv50_context *nv50, struct nv50_blitctx *blit) { int s; - pipe_surface_reference(&nv50->framebuffer.cbufs[0], NULL); + nv50->framebuffer.cbufs[0]->format = blit->saved.format; nv50->framebuffer.width = blit->saved.fb.width; nv50->framebuffer.height = blit->saved.fb.height; @@ -862,7 +856,7 @@ nv50_resource_resolve(struct pipe_context *pipe, struct nv50_blitctx *blit = screen->blitctx; struct nouveau_pushbuf *push = nv50->base.pushbuf; struct pipe_resource *src = info->src.res; - struct pipe_resource *dst = info->dst.res; + struct pipe_resource *dst = info->dst.surface->texture; float x0, x1, y0, y1, z; float x_range, y_range; @@ -872,8 +866,8 @@ nv50_resource_resolve(struct pipe_context *pipe, nv50_blitctx_pre_blit(blit, nv50); - nv50_blit_set_dst(nv50, dst, info->dst.level, info->dst.layer); - nv50_blit_set_src(nv50, src, 0, info->src.layer); + nv50_blit_set_dst(nv50, info->dst.surface, blit); + nv50_blit_set_src(nv50, src, 0, info->src.layer); nv50_blitctx_prepare_state(blit); diff --git a/src/gallium/drivers/nvc0/nvc0_surface.c b/src/gallium/drivers/nvc0/nvc0_surface.c index 607b02e0277..6773f96baa6 100644 --- a/src/gallium/drivers/nvc0/nvc0_surface.c +++ b/src/gallium/drivers/nvc0/nvc0_surface.c @@ -457,6 +457,7 @@ struct nvc0_blitctx unsigned num_samplers[5]; struct pipe_sampler_view *texture[2]; struct nv50_tsc_entry *sampler[2]; + enum pipe_format format; unsigned dirty; } saved; struct nvc0_program vp; @@ -727,26 +728,19 @@ nvc0_blitctx_get_color_mask_and_fp(struct nvc0_blitctx *blit, } static void -nvc0_blit_set_dst(struct nvc0_context *nvc0, - struct pipe_resource *res, unsigned level, unsigned layer) +nvc0_blit_set_dst(struct nvc0_context *nvc0, struct pipe_surface *surf, + struct nvc0_blitctx *blit) { - struct pipe_context *pipe = &nvc0->base.pipe; - struct pipe_surface templ; - - if (util_format_is_depth_or_stencil(res->format)) - templ.format = nvc0_blit_zeta_to_colour_format(res->format); - else - templ.format = res->format; + blit->saved.format = surf->format; - templ.usage = PIPE_USAGE_STREAM; - templ.u.tex.level = level; - templ.u.tex.first_layer = templ.u.tex.last_layer = layer; + if (util_format_is_depth_or_stencil(surf->format)) + surf->format = nvc0_blit_zeta_to_colour_format(surf->format); - nvc0->framebuffer.cbufs[0] = nvc0_miptree_surface_new(pipe, res, &templ); + nvc0->framebuffer.cbufs[0] = surf; nvc0->framebuffer.nr_cbufs = 1; nvc0->framebuffer.zsbuf = NULL; - nvc0->framebuffer.width = nvc0->framebuffer.cbufs[0]->width; - nvc0->framebuffer.height = nvc0->framebuffer.cbufs[0]->height; + nvc0->framebuffer.width = surf->width; + nvc0->framebuffer.height = surf->height; } static INLINE void @@ -899,7 +893,7 @@ nvc0_blitctx_post_blit(struct nvc0_context *nvc0, struct nvc0_blitctx *blit) { int s; - pipe_surface_reference(&nvc0->framebuffer.cbufs[0], NULL); + nvc0->framebuffer.cbufs[0]->format = blit->saved.format; nvc0->framebuffer.width = blit->saved.fb.width; nvc0->framebuffer.height = blit->saved.fb.height; @@ -948,7 +942,7 @@ nvc0_resource_resolve(struct pipe_context *pipe, struct nvc0_blitctx *blit = screen->blitctx; struct nouveau_pushbuf *push = screen->base.pushbuf; struct pipe_resource *src = info->src.res; - struct pipe_resource *dst = info->dst.res; + struct pipe_resource *dst = info->dst.surface->texture; float x0, x1, y0, y1; float x_range, y_range; @@ -964,8 +958,8 @@ nvc0_resource_resolve(struct pipe_context *pipe, nvc0_blitctx_pre_blit(blit, nvc0); - nvc0_blit_set_dst(nvc0, dst, info->dst.level, info->dst.layer); - nvc0_blit_set_src(nvc0, src, 0, info->src.layer, blit->filter); + nvc0_blit_set_dst(nvc0, info->dst.surface, blit); + nvc0_blit_set_src(nvc0, src, 0, info->src.layer, blit->filter); nvc0_blitctx_prepare_state(blit); diff --git a/src/gallium/drivers/r300/r300_render.c b/src/gallium/drivers/r300/r300_render.c index ceda1269707..74e137d0220 100644 --- a/src/gallium/drivers/r300/r300_render.c +++ b/src/gallium/drivers/r300/r300_render.c @@ -1272,11 +1272,7 @@ static void r300_resource_resolve(struct pipe_context *pipe, srcsurf = pipe->create_surface(pipe, info->src.res, &surf_tmpl); /* XXX Offset both surfaces by x0,y1. */ - surf_tmpl.format = info->dst.res->format; - surf_tmpl.u.tex.level = info->dst.level; - surf_tmpl.u.tex.first_layer = - surf_tmpl.u.tex.last_layer = info->dst.layer; - dstsurf = pipe->create_surface(pipe, info->dst.res, &surf_tmpl); + dstsurf = info->dst.surface; DBG(r300, DBG_DRAW, "r300: Resolving resource...\n"); @@ -1302,7 +1298,6 @@ static void r300_resource_resolve(struct pipe_context *pipe, r300_mark_atom_dirty(r300, &r300->aa_state); pipe_surface_reference(&srcsurf, NULL); - pipe_surface_reference(&dstsurf, NULL); } void r300_init_render_functions(struct r300_context *r300) diff --git a/src/gallium/include/pipe/p_state.h b/src/gallium/include/pipe/p_state.h index c828c806aef..dbe726dbf9a 100644 --- a/src/gallium/include/pipe/p_state.h +++ b/src/gallium/include/pipe/p_state.h @@ -572,9 +572,7 @@ struct pipe_draw_info struct pipe_resolve_info { struct { - struct pipe_resource *res; - unsigned level; - unsigned layer; + struct pipe_surface *surface; int x0; /**< always left */ int y0; /**< always top */ int x1; /**< determines scale if PIPE_CAP_SCALED_RESOLVE is supported */ @@ -587,7 +585,7 @@ struct pipe_resolve_info int x0; int y0; int x1; /**< may be < x0 only if PIPE_CAP_SCALED_RESOLVE is supported */ - int y1; /**< may be < y1 even if PIPE_CAP_SCALED_RESOLVE not supported */ + int y1; /**< may be < y0 even if PIPE_CAP_SCALED_RESOLVE not supported */ } src; unsigned mask; /**< PIPE_MASK_RGBA, Z, S or ZS */ diff --git a/src/mesa/state_tracker/st_cb_blit.c b/src/mesa/state_tracker/st_cb_blit.c index 1486779fd9f..b189cb40688 100644 --- a/src/mesa/state_tracker/st_cb_blit.c +++ b/src/mesa/state_tracker/st_cb_blit.c @@ -80,9 +80,8 @@ st_BlitFramebuffer_resolve(struct gl_context *ctx, info->src.res = srcRb->texture; info->src.layer = srcRb->surface->u.tex.first_layer; - info->dst.res = dstRb->texture; - info->dst.level = dstRb->surface->u.tex.level; - info->dst.layer = dstRb->surface->u.tex.first_layer; + + info->dst.surface = dstRb->surface; st->pipe->resource_resolve(st->pipe, info); } @@ -114,9 +113,8 @@ st_BlitFramebuffer_resolve(struct gl_context *ctx, info->src.res = srcRb->texture; info->src.layer = srcRb->surface->u.tex.first_layer; - info->dst.res = dstRb->texture; - info->dst.level = dstRb->surface->u.tex.level; - info->dst.layer = dstRb->surface->u.tex.first_layer; + + info->dst.surface = dstRb->surface; st->pipe->resource_resolve(st->pipe, info); } @@ -130,9 +128,8 @@ st_BlitFramebuffer_resolve(struct gl_context *ctx, info->src.res = srcRb->texture; info->src.layer = srcRb->surface->u.tex.first_layer; - info->dst.res = dstRb->texture; - info->dst.level = dstRb->surface->u.tex.level; - info->dst.layer = dstRb->surface->u.tex.first_layer; + + info->dst.surface = dstRb->surface; st->pipe->resource_resolve(st->pipe, info); } -- 2.30.2