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
||
16 info
->render_condition_enable
)
19 struct zink_resource
*src
= zink_resource(info
->src
.resource
);
20 struct zink_resource
*dst
= zink_resource(info
->dst
.resource
);
22 struct zink_screen
*screen
= zink_screen(ctx
->base
.screen
);
23 if (src
->format
!= zink_get_format(screen
, info
->src
.format
) ||
24 dst
->format
!= zink_get_format(screen
, info
->dst
.format
))
27 struct zink_batch
*batch
= zink_batch_no_rp(ctx
);
29 zink_batch_reference_resoure(batch
, src
);
30 zink_batch_reference_resoure(batch
, dst
);
32 if (src
->layout
!= VK_IMAGE_LAYOUT_TRANSFER_SRC_OPTIMAL
)
33 zink_resource_barrier(batch
->cmdbuf
, src
, src
->aspect
,
34 VK_IMAGE_LAYOUT_TRANSFER_SRC_OPTIMAL
);
36 if (dst
->layout
!= VK_IMAGE_LAYOUT_TRANSFER_DST_OPTIMAL
)
37 zink_resource_barrier(batch
->cmdbuf
, dst
, dst
->aspect
,
38 VK_IMAGE_LAYOUT_TRANSFER_DST_OPTIMAL
);
40 VkImageResolve region
= {};
42 region
.srcSubresource
.aspectMask
= src
->aspect
;
43 region
.srcSubresource
.mipLevel
= info
->src
.level
;
44 region
.srcSubresource
.baseArrayLayer
= 0; // no clue
45 region
.srcSubresource
.layerCount
= 1; // no clue
46 region
.srcOffset
.x
= info
->src
.box
.x
;
47 region
.srcOffset
.y
= info
->src
.box
.y
;
48 region
.srcOffset
.z
= info
->src
.box
.z
;
50 region
.dstSubresource
.aspectMask
= dst
->aspect
;
51 region
.dstSubresource
.mipLevel
= info
->dst
.level
;
52 region
.dstSubresource
.baseArrayLayer
= 0; // no clue
53 region
.dstSubresource
.layerCount
= 1; // no clue
54 region
.dstOffset
.x
= info
->dst
.box
.x
;
55 region
.dstOffset
.y
= info
->dst
.box
.y
;
56 region
.dstOffset
.z
= info
->dst
.box
.z
;
58 region
.extent
.width
= info
->dst
.box
.width
;
59 region
.extent
.height
= info
->dst
.box
.height
;
60 region
.extent
.depth
= info
->dst
.box
.depth
;
61 vkCmdResolveImage(batch
->cmdbuf
, src
->image
, src
->layout
,
62 dst
->image
, dst
->layout
,
69 blit_native(struct zink_context
*ctx
, const struct pipe_blit_info
*info
)
71 if (util_format_get_mask(info
->dst
.format
) != info
->mask
||
72 util_format_get_mask(info
->src
.format
) != info
->mask
||
73 info
->scissor_enable
||
75 info
->render_condition_enable
)
78 if (util_format_is_depth_or_stencil(info
->dst
.format
) &&
79 info
->dst
.format
!= info
->src
.format
)
82 struct zink_resource
*src
= zink_resource(info
->src
.resource
);
83 struct zink_resource
*dst
= zink_resource(info
->dst
.resource
);
85 struct zink_screen
*screen
= zink_screen(ctx
->base
.screen
);
86 if (src
->format
!= zink_get_format(screen
, info
->src
.format
) ||
87 dst
->format
!= zink_get_format(screen
, info
->dst
.format
))
90 struct zink_batch
*batch
= zink_batch_no_rp(ctx
);
91 zink_batch_reference_resoure(batch
, src
);
92 zink_batch_reference_resoure(batch
, dst
);
94 if (src
->layout
!= VK_IMAGE_LAYOUT_TRANSFER_SRC_OPTIMAL
)
95 zink_resource_barrier(batch
->cmdbuf
, src
, src
->aspect
,
96 VK_IMAGE_LAYOUT_TRANSFER_SRC_OPTIMAL
);
98 if (dst
->layout
!= VK_IMAGE_LAYOUT_TRANSFER_DST_OPTIMAL
)
99 zink_resource_barrier(batch
->cmdbuf
, dst
, dst
->aspect
,
100 VK_IMAGE_LAYOUT_TRANSFER_DST_OPTIMAL
);
102 VkImageBlit region
= {};
103 region
.srcSubresource
.aspectMask
= src
->aspect
;
104 region
.srcSubresource
.mipLevel
= info
->src
.level
;
105 region
.srcOffsets
[0].x
= info
->src
.box
.x
;
106 region
.srcOffsets
[0].y
= info
->src
.box
.y
;
107 region
.srcOffsets
[1].x
= info
->src
.box
.x
+ info
->src
.box
.width
;
108 region
.srcOffsets
[1].y
= info
->src
.box
.y
+ info
->src
.box
.height
;
110 if (src
->base
.array_size
> 1) {
111 region
.srcOffsets
[0].z
= 0;
112 region
.srcOffsets
[1].z
= 1;
113 region
.srcSubresource
.baseArrayLayer
= info
->src
.box
.z
;
114 region
.srcSubresource
.layerCount
= info
->src
.box
.depth
;
116 region
.srcOffsets
[0].z
= info
->src
.box
.z
;
117 region
.srcOffsets
[1].z
= info
->src
.box
.z
+ info
->src
.box
.depth
;
118 region
.srcSubresource
.baseArrayLayer
= 0;
119 region
.srcSubresource
.layerCount
= 1;
122 region
.dstSubresource
.aspectMask
= dst
->aspect
;
123 region
.dstSubresource
.mipLevel
= info
->dst
.level
;
124 region
.dstOffsets
[0].x
= info
->dst
.box
.x
;
125 region
.dstOffsets
[0].y
= info
->dst
.box
.y
;
126 region
.dstOffsets
[1].x
= info
->dst
.box
.x
+ info
->dst
.box
.width
;
127 region
.dstOffsets
[1].y
= info
->dst
.box
.y
+ info
->dst
.box
.height
;
129 if (dst
->base
.array_size
> 1) {
130 region
.dstOffsets
[0].z
= 0;
131 region
.dstOffsets
[1].z
= 1;
132 region
.dstSubresource
.baseArrayLayer
= info
->dst
.box
.z
;
133 region
.dstSubresource
.layerCount
= info
->dst
.box
.depth
;
135 region
.dstOffsets
[0].z
= info
->dst
.box
.z
;
136 region
.dstOffsets
[1].z
= info
->dst
.box
.z
+ info
->dst
.box
.depth
;
137 region
.dstSubresource
.baseArrayLayer
= 0;
138 region
.dstSubresource
.layerCount
= 1;
141 vkCmdBlitImage(batch
->cmdbuf
, src
->image
, src
->layout
,
142 dst
->image
, dst
->layout
,
144 zink_filter(info
->filter
));
150 zink_blit(struct pipe_context
*pctx
,
151 const struct pipe_blit_info
*info
)
153 struct zink_context
*ctx
= zink_context(pctx
);
154 if (info
->src
.resource
->nr_samples
> 1 &&
155 info
->dst
.resource
->nr_samples
<= 1) {
156 if (blit_resolve(ctx
, info
))
159 if (blit_native(ctx
, info
))
163 if (!util_blitter_is_blit_supported(ctx
->blitter
, info
)) {
164 debug_printf("blit unsupported %s -> %s\n",
165 util_format_short_name(info
->src
.resource
->format
),
166 util_format_short_name(info
->dst
.resource
->format
));
170 util_blitter_save_blend(ctx
->blitter
, ctx
->gfx_pipeline_state
.blend_state
);
171 util_blitter_save_depth_stencil_alpha(ctx
->blitter
, ctx
->gfx_pipeline_state
.depth_stencil_alpha_state
);
172 util_blitter_save_vertex_elements(ctx
->blitter
, ctx
->element_state
);
173 util_blitter_save_stencil_ref(ctx
->blitter
, &ctx
->stencil_ref
);
174 util_blitter_save_rasterizer(ctx
->blitter
, ctx
->rast_state
);
175 util_blitter_save_fragment_shader(ctx
->blitter
, ctx
->gfx_stages
[PIPE_SHADER_FRAGMENT
]);
176 util_blitter_save_vertex_shader(ctx
->blitter
, ctx
->gfx_stages
[PIPE_SHADER_VERTEX
]);
177 util_blitter_save_framebuffer(ctx
->blitter
, &ctx
->fb_state
);
178 util_blitter_save_viewport(ctx
->blitter
, ctx
->viewport_states
);
179 util_blitter_save_scissor(ctx
->blitter
, ctx
->scissor_states
);
180 util_blitter_save_fragment_sampler_states(ctx
->blitter
,
181 ctx
->num_samplers
[PIPE_SHADER_FRAGMENT
],
182 ctx
->sampler_states
[PIPE_SHADER_FRAGMENT
]);
183 util_blitter_save_fragment_sampler_views(ctx
->blitter
,
184 ctx
->num_image_views
[PIPE_SHADER_FRAGMENT
],
185 ctx
->image_views
[PIPE_SHADER_FRAGMENT
]);
186 util_blitter_save_fragment_constant_buffer_slot(ctx
->blitter
, ctx
->ubos
[PIPE_SHADER_FRAGMENT
]);
187 util_blitter_save_vertex_buffer_slot(ctx
->blitter
, ctx
->buffers
);
188 util_blitter_save_sample_mask(ctx
->blitter
, ctx
->gfx_pipeline_state
.sample_mask
);
190 util_blitter_blit(ctx
->blitter
, info
);