1 #include "zink_context.h"
2 #include "zink_helpers.h"
3 #include "zink_resource.h"
4 #include "zink_screen.h"
6 #include "util/u_blitter.h"
7 #include "util/format/u_format.h"
10 blit_resolve(struct zink_context
*ctx
, const struct pipe_blit_info
*info
)
12 if (util_format_get_mask(info
->dst
.format
) != info
->mask
||
13 util_format_get_mask(info
->src
.format
) != info
->mask
||
14 info
->scissor_enable
||
18 struct zink_resource
*src
= zink_resource(info
->src
.resource
);
19 struct zink_resource
*dst
= zink_resource(info
->dst
.resource
);
21 struct zink_screen
*screen
= zink_screen(ctx
->base
.screen
);
22 if (src
->format
!= zink_get_format(screen
, info
->src
.format
) ||
23 dst
->format
!= zink_get_format(screen
, info
->dst
.format
))
26 struct zink_batch
*batch
= zink_batch_no_rp(ctx
);
28 zink_batch_reference_resoure(batch
, src
);
29 zink_batch_reference_resoure(batch
, dst
);
31 if (src
->layout
!= VK_IMAGE_LAYOUT_TRANSFER_SRC_OPTIMAL
)
32 zink_resource_barrier(batch
->cmdbuf
, src
, src
->aspect
,
33 VK_IMAGE_LAYOUT_TRANSFER_SRC_OPTIMAL
);
35 if (dst
->layout
!= VK_IMAGE_LAYOUT_TRANSFER_DST_OPTIMAL
)
36 zink_resource_barrier(batch
->cmdbuf
, dst
, dst
->aspect
,
37 VK_IMAGE_LAYOUT_TRANSFER_DST_OPTIMAL
);
39 VkImageResolve region
= {};
41 region
.srcSubresource
.aspectMask
= src
->aspect
;
42 region
.srcSubresource
.mipLevel
= info
->src
.level
;
43 region
.srcSubresource
.baseArrayLayer
= 0; // no clue
44 region
.srcSubresource
.layerCount
= 1; // no clue
45 region
.srcOffset
.x
= info
->src
.box
.x
;
46 region
.srcOffset
.y
= info
->src
.box
.y
;
47 region
.srcOffset
.z
= info
->src
.box
.z
;
49 region
.dstSubresource
.aspectMask
= dst
->aspect
;
50 region
.dstSubresource
.mipLevel
= info
->dst
.level
;
51 region
.dstSubresource
.baseArrayLayer
= 0; // no clue
52 region
.dstSubresource
.layerCount
= 1; // no clue
53 region
.dstOffset
.x
= info
->dst
.box
.x
;
54 region
.dstOffset
.y
= info
->dst
.box
.y
;
55 region
.dstOffset
.z
= info
->dst
.box
.z
;
57 region
.extent
.width
= info
->dst
.box
.width
;
58 region
.extent
.height
= info
->dst
.box
.height
;
59 region
.extent
.depth
= info
->dst
.box
.depth
;
60 vkCmdResolveImage(batch
->cmdbuf
, src
->image
, src
->layout
,
61 dst
->image
, dst
->layout
,
68 blit_native(struct zink_context
*ctx
, const struct pipe_blit_info
*info
)
70 if (util_format_get_mask(info
->dst
.format
) != info
->mask
||
71 util_format_get_mask(info
->src
.format
) != info
->mask
||
72 info
->scissor_enable
||
76 if (util_format_is_depth_or_stencil(info
->dst
.format
) &&
77 info
->dst
.format
!= info
->src
.format
)
80 struct zink_resource
*src
= zink_resource(info
->src
.resource
);
81 struct zink_resource
*dst
= zink_resource(info
->dst
.resource
);
83 struct zink_screen
*screen
= zink_screen(ctx
->base
.screen
);
84 if (src
->format
!= zink_get_format(screen
, info
->src
.format
) ||
85 dst
->format
!= zink_get_format(screen
, info
->dst
.format
))
88 struct zink_batch
*batch
= zink_batch_no_rp(ctx
);
89 zink_batch_reference_resoure(batch
, src
);
90 zink_batch_reference_resoure(batch
, dst
);
92 if (src
->layout
!= VK_IMAGE_LAYOUT_TRANSFER_SRC_OPTIMAL
)
93 zink_resource_barrier(batch
->cmdbuf
, src
, src
->aspect
,
94 VK_IMAGE_LAYOUT_TRANSFER_SRC_OPTIMAL
);
96 if (dst
->layout
!= VK_IMAGE_LAYOUT_TRANSFER_DST_OPTIMAL
)
97 zink_resource_barrier(batch
->cmdbuf
, dst
, dst
->aspect
,
98 VK_IMAGE_LAYOUT_TRANSFER_DST_OPTIMAL
);
100 VkImageBlit region
= {};
101 region
.srcSubresource
.aspectMask
= src
->aspect
;
102 region
.srcSubresource
.mipLevel
= info
->src
.level
;
103 region
.srcOffsets
[0].x
= info
->src
.box
.x
;
104 region
.srcOffsets
[0].y
= info
->src
.box
.y
;
105 region
.srcOffsets
[1].x
= info
->src
.box
.x
+ info
->src
.box
.width
;
106 region
.srcOffsets
[1].y
= info
->src
.box
.y
+ info
->src
.box
.height
;
108 if (src
->base
.array_size
> 1) {
109 region
.srcOffsets
[0].z
= 0;
110 region
.srcOffsets
[1].z
= 1;
111 region
.srcSubresource
.baseArrayLayer
= info
->src
.box
.z
;
112 region
.srcSubresource
.layerCount
= info
->src
.box
.depth
;
114 region
.srcOffsets
[0].z
= info
->src
.box
.z
;
115 region
.srcOffsets
[1].z
= info
->src
.box
.z
+ info
->src
.box
.depth
;
116 region
.srcSubresource
.baseArrayLayer
= 0;
117 region
.srcSubresource
.layerCount
= 1;
120 region
.dstSubresource
.aspectMask
= dst
->aspect
;
121 region
.dstSubresource
.mipLevel
= info
->dst
.level
;
122 region
.dstOffsets
[0].x
= info
->dst
.box
.x
;
123 region
.dstOffsets
[0].y
= info
->dst
.box
.y
;
124 region
.dstOffsets
[1].x
= info
->dst
.box
.x
+ info
->dst
.box
.width
;
125 region
.dstOffsets
[1].y
= info
->dst
.box
.y
+ info
->dst
.box
.height
;
127 if (dst
->base
.array_size
> 1) {
128 region
.dstOffsets
[0].z
= 0;
129 region
.dstOffsets
[1].z
= 1;
130 region
.dstSubresource
.baseArrayLayer
= info
->dst
.box
.z
;
131 region
.dstSubresource
.layerCount
= info
->dst
.box
.depth
;
133 region
.dstOffsets
[0].z
= info
->dst
.box
.z
;
134 region
.dstOffsets
[1].z
= info
->dst
.box
.z
+ info
->dst
.box
.depth
;
135 region
.dstSubresource
.baseArrayLayer
= 0;
136 region
.dstSubresource
.layerCount
= 1;
139 vkCmdBlitImage(batch
->cmdbuf
, src
->image
, src
->layout
,
140 dst
->image
, dst
->layout
,
142 zink_filter(info
->filter
));
148 zink_blit(struct pipe_context
*pctx
,
149 const struct pipe_blit_info
*info
)
151 struct zink_context
*ctx
= zink_context(pctx
);
152 if (info
->src
.resource
->nr_samples
> 1 &&
153 info
->dst
.resource
->nr_samples
<= 1) {
154 if (blit_resolve(ctx
, info
))
157 if (blit_native(ctx
, info
))
161 if (!util_blitter_is_blit_supported(ctx
->blitter
, info
)) {
162 debug_printf("blit unsupported %s -> %s\n",
163 util_format_short_name(info
->src
.resource
->format
),
164 util_format_short_name(info
->dst
.resource
->format
));
168 util_blitter_save_blend(ctx
->blitter
, ctx
->gfx_pipeline_state
.blend_state
);
169 util_blitter_save_depth_stencil_alpha(ctx
->blitter
, ctx
->gfx_pipeline_state
.depth_stencil_alpha_state
);
170 util_blitter_save_vertex_elements(ctx
->blitter
, ctx
->element_state
);
171 util_blitter_save_stencil_ref(ctx
->blitter
, &ctx
->stencil_ref
);
172 util_blitter_save_rasterizer(ctx
->blitter
, ctx
->rast_state
);
173 util_blitter_save_fragment_shader(ctx
->blitter
, ctx
->gfx_stages
[PIPE_SHADER_FRAGMENT
]);
174 util_blitter_save_vertex_shader(ctx
->blitter
, ctx
->gfx_stages
[PIPE_SHADER_VERTEX
]);
175 util_blitter_save_framebuffer(ctx
->blitter
, &ctx
->fb_state
);
176 util_blitter_save_viewport(ctx
->blitter
, ctx
->viewport_states
);
177 util_blitter_save_scissor(ctx
->blitter
, ctx
->scissor_states
);
178 util_blitter_save_fragment_sampler_states(ctx
->blitter
,
179 ctx
->num_samplers
[PIPE_SHADER_FRAGMENT
],
180 ctx
->sampler_states
[PIPE_SHADER_FRAGMENT
]);
181 util_blitter_save_fragment_sampler_views(ctx
->blitter
,
182 ctx
->num_image_views
[PIPE_SHADER_FRAGMENT
],
183 ctx
->image_views
[PIPE_SHADER_FRAGMENT
]);
184 util_blitter_save_fragment_constant_buffer_slot(ctx
->blitter
, ctx
->ubos
[PIPE_SHADER_FRAGMENT
]);
185 util_blitter_save_vertex_buffer_slot(ctx
->blitter
, ctx
->buffers
);
186 util_blitter_save_sample_mask(ctx
->blitter
, ctx
->gfx_pipeline_state
.sample_mask
);
188 util_blitter_blit(ctx
->blitter
, info
);