mirror of
https://gitlab.freedesktop.org/mesa/mesa.git
synced 2025-12-24 19:40:10 +01:00
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 <brianp@vmware.com>
This commit is contained in:
parent
51e41a0d89
commit
5d5af7d359
6 changed files with 39 additions and 58 deletions
|
|
@ -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);
|
||||
|
|
|
|||
|
|
@ -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;
|
||||
if (util_format_is_depth_or_stencil(surf->format))
|
||||
surf->format = nv50_blit_zeta_to_colour_format(surf->format);
|
||||
|
||||
templ.usage = PIPE_USAGE_STREAM;
|
||||
templ.u.tex.level = level;
|
||||
templ.u.tex.first_layer = templ.u.tex.last_layer = layer;
|
||||
|
||||
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);
|
||||
|
||||
|
|
|
|||
|
|
@ -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;
|
||||
blit->saved.format = surf->format;
|
||||
|
||||
if (util_format_is_depth_or_stencil(res->format))
|
||||
templ.format = nvc0_blit_zeta_to_colour_format(res->format);
|
||||
else
|
||||
templ.format = res->format;
|
||||
if (util_format_is_depth_or_stencil(surf->format))
|
||||
surf->format = nvc0_blit_zeta_to_colour_format(surf->format);
|
||||
|
||||
templ.usage = PIPE_USAGE_STREAM;
|
||||
templ.u.tex.level = level;
|
||||
templ.u.tex.first_layer = templ.u.tex.last_layer = layer;
|
||||
|
||||
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);
|
||||
|
||||
|
|
|
|||
|
|
@ -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)
|
||||
|
|
|
|||
|
|
@ -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 */
|
||||
|
|
|
|||
|
|
@ -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);
|
||||
}
|
||||
|
|
|
|||
Loading…
Add table
Reference in a new issue