2 * Copyright (C) 2014 Broadcom
3 * Copyright (C) 2019 Collabora, Ltd.
5 * Permission is hereby granted, free of charge, to any person obtaining a
6 * copy of this software and associated documentation files (the "Software"),
7 * to deal in the Software without restriction, including without limitation
8 * the rights to use, copy, modify, merge, publish, distribute, sublicense,
9 * and/or sell copies of the Software, and to permit persons to whom the
10 * Software is furnished to do so, subject to the following conditions:
12 * The above copyright notice and this permission notice (including the next
13 * paragraph) shall be included in all copies or substantial portions of the
16 * THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR
17 * IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,
18 * FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL
19 * THE AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER
20 * LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM,
21 * OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE
24 * Authors (Collabora):
25 * Tomeu Vizoso <tomeu.vizoso@collabora.com>
26 * Alyssa Rosenzweig <alyssa.rosenzweig@collabora.com>
30 #include "pan_context.h"
31 #include "util/u_format.h"
34 panfrost_blitter_save(
35 struct panfrost_context
*ctx
,
36 struct blitter_context
*blitter
)
39 util_blitter_save_vertex_buffer_slot(blitter
, ctx
->vertex_buffers
);
40 util_blitter_save_vertex_elements(blitter
, ctx
->vertex
);
41 util_blitter_save_vertex_shader(blitter
, ctx
->vs
);
42 util_blitter_save_rasterizer(blitter
, ctx
->rasterizer
);
43 util_blitter_save_viewport(blitter
, &ctx
->pipe_viewport
);
44 util_blitter_save_scissor(blitter
, &ctx
->scissor
);
45 util_blitter_save_fragment_shader(blitter
, ctx
->fs
);
46 util_blitter_save_blend(blitter
, ctx
->blend
);
47 util_blitter_save_depth_stencil_alpha(blitter
, ctx
->depth_stencil
);
48 util_blitter_save_stencil_ref(blitter
, &ctx
->stencil_ref
);
49 util_blitter_save_so_targets(blitter
, 0, NULL
);
52 // util_blitter_save_sample_mask(blitter, ctx->sample_mask);
54 util_blitter_save_framebuffer(blitter
, &ctx
->pipe_framebuffer
);
55 util_blitter_save_fragment_sampler_states(blitter
,
56 ctx
->sampler_count
[PIPE_SHADER_FRAGMENT
],
57 (void **)(&ctx
->samplers
[PIPE_SHADER_FRAGMENT
]));
58 util_blitter_save_fragment_sampler_views(blitter
,
59 ctx
->sampler_view_count
[PIPE_SHADER_FRAGMENT
],
60 (struct pipe_sampler_view
**)&ctx
->sampler_views
[PIPE_SHADER_FRAGMENT
]);
64 panfrost_u_blitter_blit(struct pipe_context
*pipe
,
65 const struct pipe_blit_info
*info
)
67 struct panfrost_context
*ctx
= pan_context(pipe
);
69 if (!util_blitter_is_blit_supported(ctx
->blitter
, info
)) {
70 fprintf(stderr
, "blit unsupported %s -> %s\n",
71 util_format_short_name(info
->src
.resource
->format
),
72 util_format_short_name(info
->dst
.resource
->format
));
78 panfrost_blitter_save(ctx
, ctx
->blitter
);
79 util_blitter_blit(ctx
->blitter
, info
);
85 panfrost_blit(struct pipe_context
*pipe
,
86 const struct pipe_blit_info
*info
)
88 /* We don't have a hardware blit, so we just fake it with
89 * u_blitter. We could do a little better by culling
90 * vertex jobs, though. */
92 if (panfrost_u_blitter_blit(pipe
, info
))
95 fprintf(stderr
, "Unhandled blit");
100 /* Blits a framebuffer to "itself". Mali is a tiler, so the
101 * framebuffer is implicitly cleared every frame, so if there is
102 * no actual glClear(), we have to blit it back ourselves.
106 panfrost_blit_wallpaper(struct panfrost_context
*ctx
)
108 struct pipe_blit_info binfo
= { };
110 panfrost_blitter_save(ctx
, ctx
->blitter_wallpaper
);
112 struct pipe_surface
*surf
= ctx
->pipe_framebuffer
.cbufs
[0];
113 unsigned level
= surf
->u
.tex
.level
;
114 unsigned layer
= surf
->u
.tex
.first_layer
;
115 assert(surf
->u
.tex
.last_layer
== layer
);
117 binfo
.src
.resource
= binfo
.dst
.resource
= ctx
->pipe_framebuffer
.cbufs
[0]->texture
;
118 binfo
.src
.level
= binfo
.dst
.level
= level
;
119 binfo
.src
.box
.x
= binfo
.dst
.box
.x
= 0;
120 binfo
.src
.box
.y
= binfo
.dst
.box
.y
= 0;
121 binfo
.src
.box
.z
= binfo
.dst
.box
.z
= layer
;
122 binfo
.src
.box
.width
= binfo
.dst
.box
.width
= ctx
->pipe_framebuffer
.width
;
123 binfo
.src
.box
.height
= binfo
.dst
.box
.height
= ctx
->pipe_framebuffer
.height
;
124 binfo
.src
.box
.depth
= binfo
.dst
.box
.depth
= 1;
126 binfo
.src
.format
= binfo
.dst
.format
= ctx
->pipe_framebuffer
.cbufs
[0]->format
;
128 assert(ctx
->pipe_framebuffer
.nr_cbufs
== 1);
129 binfo
.mask
= PIPE_MASK_RGBA
;
130 binfo
.filter
= PIPE_TEX_FILTER_LINEAR
;
131 binfo
.scissor_enable
= FALSE
;
133 util_blitter_blit(ctx
->blitter_wallpaper
, &binfo
);