2 * Mesa 3-D graphics library
4 * Copyright (C) 2013 LunarG, Inc.
6 * Permission is hereby granted, free of charge, to any person obtaining a
7 * copy of this software and associated documentation files (the "Software"),
8 * to deal in the Software without restriction, including without limitation
9 * the rights to use, copy, modify, merge, publish, distribute, sublicense,
10 * and/or sell copies of the Software, and to permit persons to whom the
11 * Software is furnished to do so, subject to the following conditions:
13 * The above copyright notice and this permission notice shall be included
14 * in all copies or substantial portions of the Software.
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
21 * FROM, OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER
22 * DEALINGS IN THE SOFTWARE.
25 * Chia-I Wu <olv@lunarg.com>
28 #include "util/u_blitter.h"
29 #include "util/u_surface.h"
32 #include "ilo_context.h"
33 #include "ilo_blitter.h"
35 enum ilo_blitter_pipe_op
{
36 ILO_BLITTER_PIPE_BLIT
,
37 ILO_BLITTER_PIPE_COPY
,
38 ILO_BLITTER_PIPE_CLEAR
,
39 ILO_BLITTER_PIPE_CLEAR_FB
,
43 ilo_blitter_pipe_begin(struct ilo_blitter
*blitter
,
44 enum ilo_blitter_pipe_op op
,
47 struct blitter_context
*b
= blitter
->pipe_blitter
;
48 struct ilo_context
*ilo
= blitter
->ilo
;
51 util_blitter_save_vertex_buffer_slot(b
, ilo
->vb
.states
);
52 util_blitter_save_vertex_elements(b
, (void *) ilo
->ve
);
53 util_blitter_save_vertex_shader(b
, ilo
->vs
);
54 util_blitter_save_geometry_shader(b
, ilo
->gs
);
55 util_blitter_save_so_targets(b
, ilo
->so
.count
, ilo
->so
.states
);
56 util_blitter_save_rasterizer(b
, (void *) ilo
->rasterizer
);
59 util_blitter_save_fragment_shader(b
, ilo
->fs
);
60 util_blitter_save_depth_stencil_alpha(b
, (void *) ilo
->dsa
);
61 util_blitter_save_blend(b
, (void *) ilo
->blend
);
62 util_blitter_save_sample_mask(b
, ilo
->sample_mask
);
63 util_blitter_save_stencil_ref(b
, &ilo
->stencil_ref
);
64 util_blitter_save_viewport(b
, &ilo
->viewport
.viewport0
);
67 util_blitter_save_scissor(b
, &ilo
->scissor
.scissor0
);
70 case ILO_BLITTER_PIPE_BLIT
:
71 case ILO_BLITTER_PIPE_COPY
:
73 * we are about to call util_blitter_blit() or
74 * util_blitter_copy_texture()
76 util_blitter_save_fragment_sampler_states(b
,
77 ilo
->sampler
[PIPE_SHADER_FRAGMENT
].count
,
78 (void **) ilo
->sampler
[PIPE_SHADER_FRAGMENT
].cso
);
80 util_blitter_save_fragment_sampler_views(b
,
81 ilo
->view
[PIPE_SHADER_FRAGMENT
].count
,
82 ilo
->view
[PIPE_SHADER_FRAGMENT
].states
);
84 util_blitter_save_framebuffer(b
, &ilo
->fb
.state
);
86 /* resource_copy_region() or blit() does not honor render condition */
87 util_blitter_save_render_condition(b
,
88 ilo
->hw3d
->render_condition
.query
,
89 ilo
->hw3d
->render_condition
.cond
,
90 ilo
->hw3d
->render_condition
.mode
);
92 case ILO_BLITTER_PIPE_CLEAR
:
94 * we are about to call util_blitter_clear_render_target() or
95 * util_blitter_clear_depth_stencil()
97 util_blitter_save_framebuffer(b
, &ilo
->fb
.state
);
99 case ILO_BLITTER_PIPE_CLEAR_FB
:
100 /* we are about to call util_blitter_clear() */
108 ilo_blitter_pipe_end(struct ilo_blitter
*blitter
)
113 ilo_blitter_pipe_blit(struct ilo_blitter
*blitter
,
114 const struct pipe_blit_info
*info
)
116 struct blitter_context
*b
= blitter
->pipe_blitter
;
117 struct pipe_blit_info skip_stencil
;
119 if (util_try_blit_via_copy_region(&blitter
->ilo
->base
, info
))
122 if (!util_blitter_is_blit_supported(b
, info
)) {
123 /* try without stencil */
124 if (info
->mask
& PIPE_MASK_S
) {
125 skip_stencil
= *info
;
126 skip_stencil
.mask
= info
->mask
& ~PIPE_MASK_S
;
128 if (util_blitter_is_blit_supported(blitter
->pipe_blitter
,
130 ilo_warn("ignore stencil buffer blitting\n");
131 info
= &skip_stencil
;
135 if (info
!= &skip_stencil
) {
136 ilo_warn("failed to blit with pipe blitter\n");
141 ilo_blitter_pipe_begin(blitter
, ILO_BLITTER_PIPE_BLIT
,
142 info
->scissor_enable
);
143 util_blitter_blit(b
, info
);
144 ilo_blitter_pipe_end(blitter
);
150 ilo_blitter_pipe_copy_resource(struct ilo_blitter
*blitter
,
151 struct pipe_resource
*dst
, unsigned dst_level
,
152 unsigned dst_x
, unsigned dst_y
, unsigned dst_z
,
153 struct pipe_resource
*src
, unsigned src_level
,
154 const struct pipe_box
*src_box
)
156 const unsigned mask
= PIPE_MASK_RGBAZS
;
157 const bool copy_all_samples
= true;
159 /* not until we allow rendertargets to be buffers */
160 if (dst
->target
== PIPE_BUFFER
|| src
->target
== PIPE_BUFFER
)
163 if (!util_blitter_is_copy_supported(blitter
->pipe_blitter
, dst
, src
, mask
))
166 ilo_blitter_pipe_begin(blitter
, ILO_BLITTER_PIPE_COPY
, false);
168 util_blitter_copy_texture(blitter
->pipe_blitter
,
169 dst
, dst_level
, dst_x
, dst_y
, dst_z
,
170 src
, src_level
, src_box
,
171 mask
, copy_all_samples
);
173 ilo_blitter_pipe_end(blitter
);
179 ilo_blitter_pipe_clear_rt(struct ilo_blitter
*blitter
,
180 struct pipe_surface
*rt
,
181 const union pipe_color_union
*color
,
182 unsigned x
, unsigned y
,
183 unsigned width
, unsigned height
)
185 ilo_blitter_pipe_begin(blitter
, ILO_BLITTER_PIPE_CLEAR
, false);
187 util_blitter_clear_render_target(blitter
->pipe_blitter
,
188 rt
, color
, x
, y
, width
, height
);
190 ilo_blitter_pipe_end(blitter
);
196 ilo_blitter_pipe_clear_zs(struct ilo_blitter
*blitter
,
197 struct pipe_surface
*zs
,
198 unsigned clear_flags
,
199 double depth
, unsigned stencil
,
200 unsigned x
, unsigned y
,
201 unsigned width
, unsigned height
)
203 ilo_blitter_pipe_begin(blitter
, ILO_BLITTER_PIPE_CLEAR
, false);
205 util_blitter_clear_depth_stencil(blitter
->pipe_blitter
,
206 zs
, clear_flags
, depth
, stencil
, x
, y
, width
, height
);
208 ilo_blitter_pipe_end(blitter
);
214 ilo_blitter_pipe_clear_fb(struct ilo_blitter
*blitter
,
216 const union pipe_color_union
*color
,
217 double depth
, unsigned stencil
)
219 /* TODO we should pause/resume some queries */
220 ilo_blitter_pipe_begin(blitter
, ILO_BLITTER_PIPE_CLEAR_FB
, false);
222 util_blitter_clear(blitter
->pipe_blitter
,
223 blitter
->ilo
->fb
.state
.width
, blitter
->ilo
->fb
.state
.height
,
224 buffers
, color
, depth
, stencil
);
226 ilo_blitter_pipe_end(blitter
);