vk/image: Refactor anv_image_create()
[mesa.git] / src / vulkan / meta.c
1 /*
2 * Copyright © 2015 Intel Corporation
3 *
4 * Permission is hereby granted, free of charge, to any person obtaining a
5 * copy of this software and associated documentation files (the "Software"),
6 * to deal in the Software without restriction, including without limitation
7 * the rights to use, copy, modify, merge, publish, distribute, sublicense,
8 * and/or sell copies of the Software, and to permit persons to whom the
9 * Software is furnished to do so, subject to the following conditions:
10 *
11 * The above copyright notice and this permission notice (including the next
12 * paragraph) shall be included in all copies or substantial portions of the
13 * Software.
14 *
15 * THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR
16 * IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,
17 * FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL
18 * THE AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER
19 * LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING
20 * FROM, OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS
21 * IN THE SOFTWARE.
22 */
23
24 #include <assert.h>
25 #include <stdbool.h>
26 #include <string.h>
27 #include <unistd.h>
28 #include <fcntl.h>
29
30 #include "private.h"
31 #include "meta-spirv.h"
32
33 static void
34 anv_device_init_meta_clear_state(struct anv_device *device)
35 {
36 VkPipelineIaStateCreateInfo ia_create_info = {
37 .sType = VK_STRUCTURE_TYPE_PIPELINE_IA_STATE_CREATE_INFO,
38 .topology = VK_PRIMITIVE_TOPOLOGY_TRIANGLE_STRIP,
39 .disableVertexReuse = false,
40 .primitiveRestartEnable = false,
41 .primitiveRestartIndex = 0
42 };
43
44 /* We don't use a vertex shader for clearing, but instead build and pass
45 * the VUEs directly to the rasterization backend.
46 */
47 VkShader fs = GLSL_VK_SHADER(device, FRAGMENT,
48 out vec4 f_color;
49 flat in vec4 v_color;
50 void main()
51 {
52 f_color = v_color;
53 }
54 );
55
56 VkPipelineShaderStageCreateInfo fs_create_info = {
57 .sType = VK_STRUCTURE_TYPE_PIPELINE_SHADER_STAGE_CREATE_INFO,
58 .pNext = &ia_create_info,
59 .shader = {
60 .stage = VK_SHADER_STAGE_FRAGMENT,
61 .shader = fs,
62 .linkConstBufferCount = 0,
63 .pLinkConstBufferInfo = NULL,
64 .pSpecializationInfo = NULL
65 }
66 };
67
68 /* We use instanced rendering to clear multiple render targets. We have two
69 * vertex buffers: the first vertex buffer holds per-vertex data and
70 * provides the vertices for the clear rectangle. The second one holds
71 * per-instance data, which consists of the VUE header (which selects the
72 * layer) and the color (Vulkan supports per-RT clear colors).
73 */
74 VkPipelineVertexInputCreateInfo vi_create_info = {
75 .sType = VK_STRUCTURE_TYPE_PIPELINE_VERTEX_INPUT_CREATE_INFO,
76 .pNext = &fs_create_info,
77 .bindingCount = 2,
78 .pVertexBindingDescriptions = (VkVertexInputBindingDescription[]) {
79 {
80 .binding = 0,
81 .strideInBytes = 8,
82 .stepRate = VK_VERTEX_INPUT_STEP_RATE_VERTEX
83 },
84 {
85 .binding = 1,
86 .strideInBytes = 32,
87 .stepRate = VK_VERTEX_INPUT_STEP_RATE_INSTANCE
88 },
89 },
90 .attributeCount = 3,
91 .pVertexAttributeDescriptions = (VkVertexInputAttributeDescription[]) {
92 {
93 /* VUE Header */
94 .location = 0,
95 .binding = 1,
96 .format = VK_FORMAT_R32G32B32A32_UINT,
97 .offsetInBytes = 0
98 },
99 {
100 /* Position */
101 .location = 1,
102 .binding = 0,
103 .format = VK_FORMAT_R32G32_SFLOAT,
104 .offsetInBytes = 0
105 },
106 {
107 /* Color */
108 .location = 2,
109 .binding = 1,
110 .format = VK_FORMAT_R32G32B32A32_SFLOAT,
111 .offsetInBytes = 16
112 }
113 }
114 };
115
116 VkPipelineRsStateCreateInfo rs_create_info = {
117 .sType = VK_STRUCTURE_TYPE_PIPELINE_RS_STATE_CREATE_INFO,
118 .pNext = &vi_create_info,
119 .depthClipEnable = true,
120 .rasterizerDiscardEnable = false,
121 .fillMode = VK_FILL_MODE_SOLID,
122 .cullMode = VK_CULL_MODE_NONE,
123 .frontFace = VK_FRONT_FACE_CCW
124 };
125
126 VkPipelineCbStateCreateInfo cb_create_info = {
127 .sType = VK_STRUCTURE_TYPE_PIPELINE_CB_STATE_CREATE_INFO,
128 .pNext = &rs_create_info,
129 .attachmentCount = 1,
130 .pAttachments = (VkPipelineCbAttachmentState []) {
131 { .channelWriteMask = VK_CHANNEL_A_BIT |
132 VK_CHANNEL_R_BIT | VK_CHANNEL_G_BIT | VK_CHANNEL_B_BIT },
133 }
134 };
135
136 anv_pipeline_create((VkDevice) device,
137 &(VkGraphicsPipelineCreateInfo) {
138 .sType = VK_STRUCTURE_TYPE_GRAPHICS_PIPELINE_CREATE_INFO,
139 .pNext = &cb_create_info,
140 .flags = 0,
141 .layout = 0
142 },
143 &(struct anv_pipeline_create_info) {
144 .use_repclear = true,
145 .disable_viewport = true,
146 .use_rectlist = true
147 },
148 &device->meta_state.clear.pipeline);
149
150 anv_DestroyObject((VkDevice) device, VK_OBJECT_TYPE_SHADER, fs);
151 }
152
153 #define NUM_VB_USED 2
154 struct anv_saved_state {
155 struct anv_vertex_binding old_vertex_bindings[NUM_VB_USED];
156 struct anv_descriptor_set *old_descriptor_set0;
157 struct anv_pipeline *old_pipeline;
158 VkDynamicCbState cb_state;
159 };
160
161 static void
162 anv_cmd_buffer_save(struct anv_cmd_buffer *cmd_buffer,
163 struct anv_saved_state *state)
164 {
165 state->old_pipeline = cmd_buffer->pipeline;
166 state->old_descriptor_set0 = cmd_buffer->descriptors[0].set;
167 memcpy(state->old_vertex_bindings, cmd_buffer->vertex_bindings,
168 sizeof(state->old_vertex_bindings));
169 }
170
171 static void
172 anv_cmd_buffer_restore(struct anv_cmd_buffer *cmd_buffer,
173 const struct anv_saved_state *state)
174 {
175 cmd_buffer->pipeline = state->old_pipeline;
176 cmd_buffer->descriptors[0].set = state->old_descriptor_set0;
177 memcpy(cmd_buffer->vertex_bindings, state->old_vertex_bindings,
178 sizeof(state->old_vertex_bindings));
179
180 cmd_buffer->vb_dirty |= (1 << NUM_VB_USED) - 1;
181 cmd_buffer->dirty |= ANV_CMD_BUFFER_PIPELINE_DIRTY;
182 cmd_buffer->descriptors_dirty |= VK_SHADER_STAGE_VERTEX_BIT;
183 }
184
185 struct vue_header {
186 uint32_t Reserved;
187 uint32_t RTAIndex;
188 uint32_t ViewportIndex;
189 float PointWidth;
190 };
191
192 void
193 anv_cmd_buffer_clear(struct anv_cmd_buffer *cmd_buffer,
194 struct anv_render_pass *pass)
195 {
196 struct anv_device *device = cmd_buffer->device;
197 struct anv_framebuffer *fb = cmd_buffer->framebuffer;
198 struct anv_saved_state saved_state;
199 struct anv_state state;
200 uint32_t size;
201
202 struct instance_data {
203 struct vue_header vue_header;
204 float color[4];
205 } *instance_data;
206
207 if (pass->num_clear_layers == 0)
208 return;
209
210 const float vertex_data[] = {
211 /* Rect-list coordinates */
212 0.0, 0.0,
213 fb->width, 0.0,
214 fb->width, fb->height,
215
216 /* Align to 16 bytes */
217 0.0, 0.0,
218 };
219
220 size = sizeof(vertex_data) + pass->num_clear_layers * sizeof(instance_data[0]);
221 state = anv_state_stream_alloc(&cmd_buffer->surface_state_stream, size, 16);
222
223 memcpy(state.map, vertex_data, sizeof(vertex_data));
224 instance_data = state.map + sizeof(vertex_data);
225
226 for (uint32_t i = 0; i < pass->num_layers; i++) {
227 if (pass->layers[i].color_load_op == VK_ATTACHMENT_LOAD_OP_CLEAR) {
228 *instance_data++ = (struct instance_data) {
229 .vue_header = {
230 .RTAIndex = i,
231 .ViewportIndex = 0,
232 .PointWidth = 0.0
233 },
234 .color = {
235 pass->layers[i].clear_color.color.floatColor[0],
236 pass->layers[i].clear_color.color.floatColor[1],
237 pass->layers[i].clear_color.color.floatColor[2],
238 pass->layers[i].clear_color.color.floatColor[3],
239 }
240 };
241 }
242 }
243
244 struct anv_buffer vertex_buffer = {
245 .device = cmd_buffer->device,
246 .size = size,
247 .bo = &device->surface_state_block_pool.bo,
248 .offset = state.offset
249 };
250
251 anv_cmd_buffer_save(cmd_buffer, &saved_state);
252
253 anv_CmdBindVertexBuffers((VkCmdBuffer) cmd_buffer, 0, 2,
254 (VkBuffer[]) {
255 (VkBuffer) &vertex_buffer,
256 (VkBuffer) &vertex_buffer
257 },
258 (VkDeviceSize[]) {
259 0,
260 sizeof(vertex_data)
261 });
262
263 if ((VkPipeline) cmd_buffer->pipeline != device->meta_state.clear.pipeline)
264 anv_CmdBindPipeline((VkCmdBuffer) cmd_buffer,
265 VK_PIPELINE_BIND_POINT_GRAPHICS,
266 device->meta_state.clear.pipeline);
267
268 /* We don't need anything here, only set if not already set. */
269 if (cmd_buffer->rs_state == NULL)
270 anv_CmdBindDynamicStateObject((VkCmdBuffer) cmd_buffer,
271 VK_STATE_BIND_POINT_RASTER,
272 device->meta_state.shared.rs_state);
273
274 if (cmd_buffer->vp_state == NULL)
275 anv_CmdBindDynamicStateObject((VkCmdBuffer) cmd_buffer,
276 VK_STATE_BIND_POINT_VIEWPORT,
277 cmd_buffer->framebuffer->vp_state);
278
279 if (cmd_buffer->ds_state == NULL)
280 anv_CmdBindDynamicStateObject((VkCmdBuffer) cmd_buffer,
281 VK_STATE_BIND_POINT_DEPTH_STENCIL,
282 device->meta_state.shared.ds_state);
283
284 if (cmd_buffer->cb_state == NULL)
285 anv_CmdBindDynamicStateObject((VkCmdBuffer) cmd_buffer,
286 VK_STATE_BIND_POINT_COLOR_BLEND,
287 device->meta_state.shared.cb_state);
288
289 anv_CmdDraw((VkCmdBuffer) cmd_buffer, 0, 3, 0, pass->num_clear_layers);
290
291 /* Restore API state */
292 anv_cmd_buffer_restore(cmd_buffer, &saved_state);
293
294 }
295
296 static void
297 anv_device_init_meta_blit_state(struct anv_device *device)
298 {
299 VkPipelineIaStateCreateInfo ia_create_info = {
300 .sType = VK_STRUCTURE_TYPE_PIPELINE_IA_STATE_CREATE_INFO,
301 .topology = VK_PRIMITIVE_TOPOLOGY_TRIANGLE_STRIP,
302 .disableVertexReuse = false,
303 .primitiveRestartEnable = false,
304 .primitiveRestartIndex = 0
305 };
306
307 /* We don't use a vertex shader for clearing, but instead build and pass
308 * the VUEs directly to the rasterization backend. However, we do need
309 * to provide GLSL source for the vertex shader so that the compiler
310 * does not dead-code our inputs.
311 */
312 VkShader vs = GLSL_VK_SHADER(device, VERTEX,
313 in vec2 a_pos;
314 in vec2 a_tex_coord;
315 out vec4 v_tex_coord;
316 void main()
317 {
318 v_tex_coord = vec4(a_tex_coord, 0, 1);
319 gl_Position = vec4(a_pos, 0, 1);
320 }
321 );
322
323 VkShader fs = GLSL_VK_SHADER(device, FRAGMENT,
324 out vec4 f_color;
325 in vec4 v_tex_coord;
326 layout(set = 0, binding = 0) uniform sampler2D u_tex;
327 void main()
328 {
329 f_color = texture(u_tex, v_tex_coord.xy);
330 }
331 );
332
333 VkPipelineShaderStageCreateInfo vs_create_info = {
334 .sType = VK_STRUCTURE_TYPE_PIPELINE_SHADER_STAGE_CREATE_INFO,
335 .pNext = &ia_create_info,
336 .shader = {
337 .stage = VK_SHADER_STAGE_VERTEX,
338 .shader = vs,
339 .linkConstBufferCount = 0,
340 .pLinkConstBufferInfo = NULL,
341 .pSpecializationInfo = NULL
342 }
343 };
344
345 VkPipelineShaderStageCreateInfo fs_create_info = {
346 .sType = VK_STRUCTURE_TYPE_PIPELINE_SHADER_STAGE_CREATE_INFO,
347 .pNext = &vs_create_info,
348 .shader = {
349 .stage = VK_SHADER_STAGE_FRAGMENT,
350 .shader = fs,
351 .linkConstBufferCount = 0,
352 .pLinkConstBufferInfo = NULL,
353 .pSpecializationInfo = NULL
354 }
355 };
356
357 VkPipelineVertexInputCreateInfo vi_create_info = {
358 .sType = VK_STRUCTURE_TYPE_PIPELINE_VERTEX_INPUT_CREATE_INFO,
359 .pNext = &fs_create_info,
360 .bindingCount = 2,
361 .pVertexBindingDescriptions = (VkVertexInputBindingDescription[]) {
362 {
363 .binding = 0,
364 .strideInBytes = 0,
365 .stepRate = VK_VERTEX_INPUT_STEP_RATE_VERTEX
366 },
367 {
368 .binding = 1,
369 .strideInBytes = 16,
370 .stepRate = VK_VERTEX_INPUT_STEP_RATE_VERTEX
371 },
372 },
373 .attributeCount = 3,
374 .pVertexAttributeDescriptions = (VkVertexInputAttributeDescription[]) {
375 {
376 /* VUE Header */
377 .location = 0,
378 .binding = 0,
379 .format = VK_FORMAT_R32G32B32A32_UINT,
380 .offsetInBytes = 0
381 },
382 {
383 /* Position */
384 .location = 1,
385 .binding = 1,
386 .format = VK_FORMAT_R32G32_SFLOAT,
387 .offsetInBytes = 0
388 },
389 {
390 /* Texture Coordinate */
391 .location = 2,
392 .binding = 1,
393 .format = VK_FORMAT_R32G32_SFLOAT,
394 .offsetInBytes = 8
395 }
396 }
397 };
398
399 VkDescriptorSetLayoutCreateInfo ds_layout_info = {
400 .sType = VK_STRUCTURE_TYPE_DESCRIPTOR_SET_LAYOUT_CREATE_INFO,
401 .count = 1,
402 .pBinding = (VkDescriptorSetLayoutBinding[]) {
403 {
404 .descriptorType = VK_DESCRIPTOR_TYPE_SAMPLED_IMAGE,
405 .count = 1,
406 .stageFlags = VK_SHADER_STAGE_FRAGMENT_BIT,
407 .pImmutableSamplers = NULL
408 },
409 }
410 };
411 anv_CreateDescriptorSetLayout((VkDevice) device, &ds_layout_info,
412 &device->meta_state.blit.ds_layout);
413
414 anv_CreatePipelineLayout((VkDevice) device,
415 &(VkPipelineLayoutCreateInfo) {
416 .sType = VK_STRUCTURE_TYPE_PIPELINE_LAYOUT_CREATE_INFO,
417 .descriptorSetCount = 1,
418 .pSetLayouts = &device->meta_state.blit.ds_layout,
419 },
420 &device->meta_state.blit.pipeline_layout);
421
422 VkPipelineRsStateCreateInfo rs_create_info = {
423 .sType = VK_STRUCTURE_TYPE_PIPELINE_RS_STATE_CREATE_INFO,
424 .pNext = &vi_create_info,
425 .depthClipEnable = true,
426 .rasterizerDiscardEnable = false,
427 .fillMode = VK_FILL_MODE_SOLID,
428 .cullMode = VK_CULL_MODE_NONE,
429 .frontFace = VK_FRONT_FACE_CCW
430 };
431
432 VkPipelineCbStateCreateInfo cb_create_info = {
433 .sType = VK_STRUCTURE_TYPE_PIPELINE_CB_STATE_CREATE_INFO,
434 .pNext = &rs_create_info,
435 .attachmentCount = 1,
436 .pAttachments = (VkPipelineCbAttachmentState []) {
437 { .channelWriteMask = VK_CHANNEL_A_BIT |
438 VK_CHANNEL_R_BIT | VK_CHANNEL_G_BIT | VK_CHANNEL_B_BIT },
439 }
440 };
441
442 VkGraphicsPipelineCreateInfo pipeline_info = {
443 .sType = VK_STRUCTURE_TYPE_GRAPHICS_PIPELINE_CREATE_INFO,
444 .pNext = &cb_create_info,
445 .flags = 0,
446 .layout = device->meta_state.blit.pipeline_layout,
447 };
448
449 anv_pipeline_create((VkDevice) device, &pipeline_info,
450 &(struct anv_pipeline_create_info) {
451 .use_repclear = false,
452 .disable_viewport = true,
453 .disable_scissor = true,
454 .disable_vs = true,
455 .use_rectlist = true
456 },
457 &device->meta_state.blit.pipeline);
458
459 anv_DestroyObject((VkDevice) device, VK_OBJECT_TYPE_SHADER, vs);
460 anv_DestroyObject((VkDevice) device, VK_OBJECT_TYPE_SHADER, fs);
461 }
462
463 static void
464 meta_prepare_blit(struct anv_cmd_buffer *cmd_buffer,
465 struct anv_saved_state *saved_state)
466 {
467 struct anv_device *device = cmd_buffer->device;
468
469 anv_cmd_buffer_save(cmd_buffer, saved_state);
470
471 if ((VkPipeline) cmd_buffer->pipeline != device->meta_state.blit.pipeline)
472 anv_CmdBindPipeline((VkCmdBuffer) cmd_buffer,
473 VK_PIPELINE_BIND_POINT_GRAPHICS,
474 device->meta_state.blit.pipeline);
475
476 /* We don't need anything here, only set if not already set. */
477 if (cmd_buffer->rs_state == NULL)
478 anv_CmdBindDynamicStateObject((VkCmdBuffer) cmd_buffer,
479 VK_STATE_BIND_POINT_RASTER,
480 device->meta_state.shared.rs_state);
481 if (cmd_buffer->ds_state == NULL)
482 anv_CmdBindDynamicStateObject((VkCmdBuffer) cmd_buffer,
483 VK_STATE_BIND_POINT_DEPTH_STENCIL,
484 device->meta_state.shared.ds_state);
485
486 saved_state->cb_state = (VkDynamicCbState) cmd_buffer->cb_state;
487 anv_CmdBindDynamicStateObject((VkCmdBuffer) cmd_buffer,
488 VK_STATE_BIND_POINT_COLOR_BLEND,
489 device->meta_state.shared.cb_state);
490 }
491
492 struct blit_region {
493 VkOffset3D src_offset;
494 VkExtent3D src_extent;
495 VkOffset3D dest_offset;
496 VkExtent3D dest_extent;
497 };
498
499 static void
500 meta_emit_blit(struct anv_cmd_buffer *cmd_buffer,
501 struct anv_surface_view *src,
502 VkOffset3D src_offset,
503 VkExtent3D src_extent,
504 struct anv_surface_view *dest,
505 VkOffset3D dest_offset,
506 VkExtent3D dest_extent)
507 {
508 struct anv_device *device = cmd_buffer->device;
509
510 struct blit_vb_data {
511 float pos[2];
512 float tex_coord[2];
513 } *vb_data;
514
515 unsigned vb_size = sizeof(struct vue_header) + 3 * sizeof(*vb_data);
516
517 struct anv_state vb_state =
518 anv_state_stream_alloc(&cmd_buffer->surface_state_stream, vb_size, 16);
519 memset(vb_state.map, 0, sizeof(struct vue_header));
520 vb_data = vb_state.map + sizeof(struct vue_header);
521
522 vb_data[0] = (struct blit_vb_data) {
523 .pos = {
524 dest_offset.x + dest_extent.width,
525 dest_offset.y + dest_extent.height,
526 },
527 .tex_coord = {
528 (float)(src_offset.x + src_extent.width) / (float)src->extent.width,
529 (float)(src_offset.y + src_extent.height) / (float)src->extent.height,
530 },
531 };
532
533 vb_data[1] = (struct blit_vb_data) {
534 .pos = {
535 dest_offset.x,
536 dest_offset.y + dest_extent.height,
537 },
538 .tex_coord = {
539 (float)src_offset.x / (float)src->extent.width,
540 (float)(src_offset.y + src_extent.height) / (float)src->extent.height,
541 },
542 };
543
544 vb_data[2] = (struct blit_vb_data) {
545 .pos = {
546 dest_offset.x,
547 dest_offset.y,
548 },
549 .tex_coord = {
550 (float)src_offset.x / (float)src->extent.width,
551 (float)src_offset.y / (float)src->extent.height,
552 },
553 };
554
555 struct anv_buffer vertex_buffer = {
556 .device = device,
557 .size = vb_size,
558 .bo = &device->surface_state_block_pool.bo,
559 .offset = vb_state.offset,
560 };
561
562 anv_CmdBindVertexBuffers((VkCmdBuffer) cmd_buffer, 0, 2,
563 (VkBuffer[]) {
564 (VkBuffer) &vertex_buffer,
565 (VkBuffer) &vertex_buffer
566 },
567 (VkDeviceSize[]) {
568 0,
569 sizeof(struct vue_header),
570 });
571
572 uint32_t count;
573 VkDescriptorSet set;
574 anv_AllocDescriptorSets((VkDevice) device, 0 /* pool */,
575 VK_DESCRIPTOR_SET_USAGE_ONE_SHOT,
576 1, &device->meta_state.blit.ds_layout, &set, &count);
577 anv_UpdateDescriptors((VkDevice) device, set, 1,
578 (const void * []) {
579 &(VkUpdateImages) {
580 .sType = VK_STRUCTURE_TYPE_UPDATE_IMAGES,
581 .descriptorType = VK_DESCRIPTOR_TYPE_SAMPLED_IMAGE,
582 .binding = 0,
583 .count = 1,
584 .pImageViews = (VkImageViewAttachInfo[]) {
585 {
586 .sType = VK_STRUCTURE_TYPE_IMAGE_VIEW_ATTACH_INFO,
587 .view = (VkImageView) src,
588 .layout = VK_IMAGE_LAYOUT_GENERAL,
589 }
590 }
591 }
592 });
593
594 struct anv_framebuffer *fb;
595 anv_CreateFramebuffer((VkDevice) device,
596 &(VkFramebufferCreateInfo) {
597 .sType = VK_STRUCTURE_TYPE_FRAMEBUFFER_CREATE_INFO,
598 .colorAttachmentCount = 1,
599 .pColorAttachments = (VkColorAttachmentBindInfo[]) {
600 {
601 .view = (VkColorAttachmentView) dest,
602 .layout = VK_IMAGE_LAYOUT_GENERAL
603 }
604 },
605 .pDepthStencilAttachment = NULL,
606 .sampleCount = 1,
607 .width = dest->extent.width,
608 .height = dest->extent.height,
609 .layers = 1
610 }, (VkFramebuffer *)&fb);
611
612
613 VkRenderPass pass;
614 anv_CreateRenderPass((VkDevice )device,
615 &(VkRenderPassCreateInfo) {
616 .sType = VK_STRUCTURE_TYPE_RENDER_PASS_CREATE_INFO,
617 .renderArea = { { 0, 0 }, { dest->extent.width, dest->extent.height } },
618 .colorAttachmentCount = 1,
619 .extent = { 0, },
620 .sampleCount = 1,
621 .layers = 1,
622 .pColorFormats = (VkFormat[]) { dest->format },
623 .pColorLayouts = (VkImageLayout[]) { VK_IMAGE_LAYOUT_GENERAL },
624 .pColorLoadOps = (VkAttachmentLoadOp[]) { VK_ATTACHMENT_LOAD_OP_LOAD },
625 .pColorStoreOps = (VkAttachmentStoreOp[]) { VK_ATTACHMENT_STORE_OP_STORE },
626 .pColorLoadClearValues = (VkClearColor[]) {
627 { .color = { .floatColor = { 1.0, 0.0, 0.0, 1.0 } }, .useRawValue = false }
628 },
629 .depthStencilFormat = VK_FORMAT_UNDEFINED,
630 }, &pass);
631
632 anv_CmdBeginRenderPass((VkCmdBuffer) cmd_buffer,
633 &(VkRenderPassBegin) {
634 .renderPass = pass,
635 .framebuffer = (VkFramebuffer) fb,
636 });
637
638 anv_CmdBindDynamicStateObject((VkCmdBuffer) cmd_buffer,
639 VK_STATE_BIND_POINT_VIEWPORT, fb->vp_state);
640
641 anv_CmdBindDescriptorSets((VkCmdBuffer) cmd_buffer,
642 VK_PIPELINE_BIND_POINT_GRAPHICS, 0, 1,
643 &set, 0, NULL);
644
645 anv_CmdDraw((VkCmdBuffer) cmd_buffer, 0, 3, 0, 1);
646
647 anv_CmdEndRenderPass((VkCmdBuffer) cmd_buffer, pass);
648
649 /* At the point where we emit the draw call, all data from the
650 * descriptor sets, etc. has been used. We are free to delete it.
651 */
652 anv_DestroyObject((VkDevice) device, VK_OBJECT_TYPE_DESCRIPTOR_SET, set);
653 anv_DestroyObject((VkDevice) device, VK_OBJECT_TYPE_FRAMEBUFFER,
654 (VkFramebuffer) fb);
655 anv_DestroyObject((VkDevice) device, VK_OBJECT_TYPE_RENDER_PASS, pass);
656 }
657
658 static void
659 meta_finish_blit(struct anv_cmd_buffer *cmd_buffer,
660 const struct anv_saved_state *saved_state)
661 {
662 anv_cmd_buffer_restore(cmd_buffer, saved_state);
663 anv_CmdBindDynamicStateObject((VkCmdBuffer) cmd_buffer,
664 VK_STATE_BIND_POINT_COLOR_BLEND,
665 saved_state->cb_state);
666 }
667
668 static VkFormat
669 vk_format_for_cpp(int cpp)
670 {
671 switch (cpp) {
672 case 1: return VK_FORMAT_R8_UINT;
673 case 2: return VK_FORMAT_R8G8_UINT;
674 case 3: return VK_FORMAT_R8G8B8_UINT;
675 case 4: return VK_FORMAT_R8G8B8A8_UINT;
676 case 6: return VK_FORMAT_R16G16B16_UINT;
677 case 8: return VK_FORMAT_R16G16B16A16_UINT;
678 case 12: return VK_FORMAT_R32G32B32_UINT;
679 case 16: return VK_FORMAT_R32G32B32A32_UINT;
680 default:
681 unreachable("Invalid format cpp");
682 }
683 }
684
685 static void
686 do_buffer_copy(struct anv_cmd_buffer *cmd_buffer,
687 struct anv_bo *src, uint64_t src_offset,
688 struct anv_bo *dest, uint64_t dest_offset,
689 int width, int height, VkFormat copy_format)
690 {
691 VkDevice vk_device = (VkDevice)cmd_buffer->device;
692
693 VkImageCreateInfo image_info = {
694 .sType = VK_STRUCTURE_TYPE_IMAGE_CREATE_INFO,
695 .imageType = VK_IMAGE_TYPE_2D,
696 .format = copy_format,
697 .extent = {
698 .width = width,
699 .height = height,
700 .depth = 1,
701 },
702 .mipLevels = 1,
703 .arraySize = 1,
704 .samples = 1,
705 .tiling = VK_IMAGE_TILING_LINEAR,
706 .usage = VK_IMAGE_USAGE_SAMPLED_BIT,
707 .flags = 0,
708 };
709
710 struct anv_image *src_image, *dest_image;
711 anv_CreateImage(vk_device, &image_info, (VkImage *)&src_image);
712 anv_CreateImage(vk_device, &image_info, (VkImage *)&dest_image);
713
714 /* We could use a vk call to bind memory, but that would require
715 * creating a dummy memory object etc. so there's really no point.
716 */
717 src_image->bo = src;
718 src_image->offset = src_offset;
719 dest_image->bo = dest;
720 dest_image->offset = dest_offset;
721
722 struct anv_surface_view src_view;
723 anv_image_view_init(&src_view, cmd_buffer->device,
724 &(VkImageViewCreateInfo) {
725 .sType = VK_STRUCTURE_TYPE_IMAGE_VIEW_CREATE_INFO,
726 .image = (VkImage)src_image,
727 .viewType = VK_IMAGE_VIEW_TYPE_2D,
728 .format = copy_format,
729 .channels = {
730 VK_CHANNEL_SWIZZLE_R,
731 VK_CHANNEL_SWIZZLE_G,
732 VK_CHANNEL_SWIZZLE_B,
733 VK_CHANNEL_SWIZZLE_A
734 },
735 .subresourceRange = {
736 .aspect = VK_IMAGE_ASPECT_COLOR,
737 .baseMipLevel = 0,
738 .mipLevels = 1,
739 .baseArraySlice = 0,
740 .arraySize = 1
741 },
742 .minLod = 0
743 },
744 cmd_buffer);
745
746 struct anv_surface_view dest_view;
747 anv_color_attachment_view_init(&dest_view, cmd_buffer->device,
748 &(VkColorAttachmentViewCreateInfo) {
749 .sType = VK_STRUCTURE_TYPE_COLOR_ATTACHMENT_VIEW_CREATE_INFO,
750 .image = (VkImage)dest_image,
751 .format = copy_format,
752 .mipLevel = 0,
753 .baseArraySlice = 0,
754 .arraySize = 1,
755 },
756 cmd_buffer);
757
758 meta_emit_blit(cmd_buffer,
759 &src_view,
760 (VkOffset3D) { 0, 0, 0 },
761 (VkExtent3D) { width, height, 1 },
762 &dest_view,
763 (VkOffset3D) { 0, 0, 0 },
764 (VkExtent3D) { width, height, 1 });
765
766 anv_DestroyObject(vk_device, VK_OBJECT_TYPE_IMAGE, (VkImage) src_image);
767 anv_DestroyObject(vk_device, VK_OBJECT_TYPE_IMAGE, (VkImage) dest_image);
768 }
769
770 void anv_CmdCopyBuffer(
771 VkCmdBuffer cmdBuffer,
772 VkBuffer srcBuffer,
773 VkBuffer destBuffer,
774 uint32_t regionCount,
775 const VkBufferCopy* pRegions)
776 {
777 struct anv_cmd_buffer *cmd_buffer = (struct anv_cmd_buffer *)cmdBuffer;
778 struct anv_buffer *src_buffer = (struct anv_buffer *)srcBuffer;
779 struct anv_buffer *dest_buffer = (struct anv_buffer *)destBuffer;
780 struct anv_saved_state saved_state;
781
782 meta_prepare_blit(cmd_buffer, &saved_state);
783
784 for (unsigned r = 0; r < regionCount; r++) {
785 uint64_t src_offset = src_buffer->offset + pRegions[r].srcOffset;
786 uint64_t dest_offset = dest_buffer->offset + pRegions[r].destOffset;
787 uint64_t copy_size = pRegions[r].copySize;
788
789 /* First, we compute the biggest format that can be used with the
790 * given offsets and size.
791 */
792 int cpp = 16;
793
794 int fs = ffs(src_offset) - 1;
795 if (fs != -1)
796 cpp = MIN2(cpp, 1 << fs);
797 assert(src_offset % cpp == 0);
798
799 fs = ffs(dest_offset) - 1;
800 if (fs != -1)
801 cpp = MIN2(cpp, 1 << fs);
802 assert(dest_offset % cpp == 0);
803
804 fs = ffs(pRegions[r].copySize) - 1;
805 if (fs != -1)
806 cpp = MIN2(cpp, 1 << fs);
807 assert(pRegions[r].copySize % cpp == 0);
808
809 VkFormat copy_format = vk_format_for_cpp(cpp);
810
811 /* This is maximum possible width/height our HW can handle */
812 uint64_t max_surface_dim = 1 << 14;
813
814 /* First, we make a bunch of max-sized copies */
815 uint64_t max_copy_size = max_surface_dim * max_surface_dim * cpp;
816 while (copy_size > max_copy_size) {
817 do_buffer_copy(cmd_buffer, src_buffer->bo, src_offset,
818 dest_buffer->bo, dest_offset,
819 max_surface_dim, max_surface_dim, copy_format);
820 copy_size -= max_copy_size;
821 src_offset += max_copy_size;
822 dest_offset += max_copy_size;
823 }
824
825 uint64_t height = copy_size / (max_surface_dim * cpp);
826 assert(height < max_surface_dim);
827 if (height != 0) {
828 uint64_t rect_copy_size = height * max_surface_dim * cpp;
829 do_buffer_copy(cmd_buffer, src_buffer->bo, src_offset,
830 dest_buffer->bo, dest_offset,
831 max_surface_dim, height, copy_format);
832 copy_size -= rect_copy_size;
833 src_offset += rect_copy_size;
834 dest_offset += rect_copy_size;
835 }
836
837 if (copy_size != 0) {
838 do_buffer_copy(cmd_buffer, src_buffer->bo, src_offset,
839 dest_buffer->bo, dest_offset,
840 copy_size / cpp, 1, copy_format);
841 }
842 }
843
844 meta_finish_blit(cmd_buffer, &saved_state);
845 }
846
847 void anv_CmdCopyImage(
848 VkCmdBuffer cmdBuffer,
849 VkImage srcImage,
850 VkImageLayout srcImageLayout,
851 VkImage destImage,
852 VkImageLayout destImageLayout,
853 uint32_t regionCount,
854 const VkImageCopy* pRegions)
855 {
856 struct anv_cmd_buffer *cmd_buffer = (struct anv_cmd_buffer *)cmdBuffer;
857 struct anv_image *src_image = (struct anv_image *)srcImage;
858 struct anv_saved_state saved_state;
859
860 meta_prepare_blit(cmd_buffer, &saved_state);
861
862 for (unsigned r = 0; r < regionCount; r++) {
863 struct anv_surface_view src_view;
864 anv_image_view_init(&src_view, cmd_buffer->device,
865 &(VkImageViewCreateInfo) {
866 .sType = VK_STRUCTURE_TYPE_IMAGE_VIEW_CREATE_INFO,
867 .image = srcImage,
868 .viewType = VK_IMAGE_VIEW_TYPE_2D,
869 .format = src_image->format,
870 .channels = {
871 VK_CHANNEL_SWIZZLE_R,
872 VK_CHANNEL_SWIZZLE_G,
873 VK_CHANNEL_SWIZZLE_B,
874 VK_CHANNEL_SWIZZLE_A
875 },
876 .subresourceRange = {
877 .aspect = pRegions[r].srcSubresource.aspect,
878 .baseMipLevel = pRegions[r].srcSubresource.mipLevel,
879 .mipLevels = 1,
880 .baseArraySlice = pRegions[r].srcSubresource.arraySlice,
881 .arraySize = 1
882 },
883 .minLod = 0
884 },
885 cmd_buffer);
886
887 struct anv_surface_view dest_view;
888 anv_color_attachment_view_init(&dest_view, cmd_buffer->device,
889 &(VkColorAttachmentViewCreateInfo) {
890 .sType = VK_STRUCTURE_TYPE_COLOR_ATTACHMENT_VIEW_CREATE_INFO,
891 .image = destImage,
892 .format = src_image->format,
893 .mipLevel = pRegions[r].destSubresource.mipLevel,
894 .baseArraySlice = pRegions[r].destSubresource.arraySlice,
895 .arraySize = 1,
896 },
897 cmd_buffer);
898
899 meta_emit_blit(cmd_buffer,
900 &src_view,
901 pRegions[r].srcOffset,
902 pRegions[r].extent,
903 &dest_view,
904 pRegions[r].destOffset,
905 pRegions[r].extent);
906 }
907
908 meta_finish_blit(cmd_buffer, &saved_state);
909 }
910
911 void anv_CmdBlitImage(
912 VkCmdBuffer cmdBuffer,
913 VkImage srcImage,
914 VkImageLayout srcImageLayout,
915 VkImage destImage,
916 VkImageLayout destImageLayout,
917 uint32_t regionCount,
918 const VkImageBlit* pRegions)
919 {
920 struct anv_cmd_buffer *cmd_buffer = (struct anv_cmd_buffer *)cmdBuffer;
921 struct anv_image *src_image = (struct anv_image *)srcImage;
922 struct anv_image *dest_image = (struct anv_image *)destImage;
923 struct anv_saved_state saved_state;
924
925 meta_prepare_blit(cmd_buffer, &saved_state);
926
927 for (unsigned r = 0; r < regionCount; r++) {
928 struct anv_surface_view src_view;
929 anv_image_view_init(&src_view, cmd_buffer->device,
930 &(VkImageViewCreateInfo) {
931 .sType = VK_STRUCTURE_TYPE_IMAGE_VIEW_CREATE_INFO,
932 .image = srcImage,
933 .viewType = VK_IMAGE_VIEW_TYPE_2D,
934 .format = src_image->format,
935 .channels = {
936 VK_CHANNEL_SWIZZLE_R,
937 VK_CHANNEL_SWIZZLE_G,
938 VK_CHANNEL_SWIZZLE_B,
939 VK_CHANNEL_SWIZZLE_A
940 },
941 .subresourceRange = {
942 .aspect = pRegions[r].srcSubresource.aspect,
943 .baseMipLevel = pRegions[r].srcSubresource.mipLevel,
944 .mipLevels = 1,
945 .baseArraySlice = pRegions[r].srcSubresource.arraySlice,
946 .arraySize = 1
947 },
948 .minLod = 0
949 },
950 cmd_buffer);
951
952 struct anv_surface_view dest_view;
953 anv_color_attachment_view_init(&dest_view, cmd_buffer->device,
954 &(VkColorAttachmentViewCreateInfo) {
955 .sType = VK_STRUCTURE_TYPE_COLOR_ATTACHMENT_VIEW_CREATE_INFO,
956 .image = destImage,
957 .format = dest_image->format,
958 .mipLevel = pRegions[r].destSubresource.mipLevel,
959 .baseArraySlice = pRegions[r].destSubresource.arraySlice,
960 .arraySize = 1,
961 },
962 cmd_buffer);
963
964 meta_emit_blit(cmd_buffer,
965 &src_view,
966 pRegions[r].srcOffset,
967 pRegions[r].srcExtent,
968 &dest_view,
969 pRegions[r].destOffset,
970 pRegions[r].destExtent);
971 }
972
973 meta_finish_blit(cmd_buffer, &saved_state);
974 }
975
976 void anv_CmdCopyBufferToImage(
977 VkCmdBuffer cmdBuffer,
978 VkBuffer srcBuffer,
979 VkImage destImage,
980 VkImageLayout destImageLayout,
981 uint32_t regionCount,
982 const VkBufferImageCopy* pRegions)
983 {
984 struct anv_cmd_buffer *cmd_buffer = (struct anv_cmd_buffer *)cmdBuffer;
985 VkDevice vk_device = (VkDevice) cmd_buffer->device;
986 struct anv_buffer *src_buffer = (struct anv_buffer *)srcBuffer;
987 struct anv_image *dest_image = (struct anv_image *)destImage;
988 struct anv_saved_state saved_state;
989
990 meta_prepare_blit(cmd_buffer, &saved_state);
991
992 for (unsigned r = 0; r < regionCount; r++) {
993 struct anv_image *src_image;
994 anv_CreateImage(vk_device,
995 &(VkImageCreateInfo) {
996 .sType = VK_STRUCTURE_TYPE_IMAGE_CREATE_INFO,
997 .imageType = VK_IMAGE_TYPE_2D,
998 .format = dest_image->format,
999 .extent = {
1000 .width = pRegions[r].imageExtent.width,
1001 .height = pRegions[r].imageExtent.height,
1002 .depth = 1,
1003 },
1004 .mipLevels = 1,
1005 .arraySize = 1,
1006 .samples = 1,
1007 .tiling = VK_IMAGE_TILING_LINEAR,
1008 .usage = VK_IMAGE_USAGE_SAMPLED_BIT,
1009 .flags = 0,
1010 }, (VkImage *)&src_image);
1011
1012 /* We could use a vk call to bind memory, but that would require
1013 * creating a dummy memory object etc. so there's really no point.
1014 */
1015 src_image->bo = src_buffer->bo;
1016 src_image->offset = src_buffer->offset + pRegions[r].bufferOffset;
1017
1018 struct anv_surface_view src_view;
1019 anv_image_view_init(&src_view, cmd_buffer->device,
1020 &(VkImageViewCreateInfo) {
1021 .sType = VK_STRUCTURE_TYPE_IMAGE_VIEW_CREATE_INFO,
1022 .image = (VkImage)src_image,
1023 .viewType = VK_IMAGE_VIEW_TYPE_2D,
1024 .format = dest_image->format,
1025 .channels = {
1026 VK_CHANNEL_SWIZZLE_R,
1027 VK_CHANNEL_SWIZZLE_G,
1028 VK_CHANNEL_SWIZZLE_B,
1029 VK_CHANNEL_SWIZZLE_A
1030 },
1031 .subresourceRange = {
1032 .aspect = pRegions[r].imageSubresource.aspect,
1033 .baseMipLevel = 0,
1034 .mipLevels = 1,
1035 .baseArraySlice = 0,
1036 .arraySize = 1
1037 },
1038 .minLod = 0
1039 },
1040 cmd_buffer);
1041
1042 struct anv_surface_view dest_view;
1043 anv_color_attachment_view_init(&dest_view, cmd_buffer->device,
1044 &(VkColorAttachmentViewCreateInfo) {
1045 .sType = VK_STRUCTURE_TYPE_COLOR_ATTACHMENT_VIEW_CREATE_INFO,
1046 .image = (VkImage)dest_image,
1047 .format = dest_image->format,
1048 .mipLevel = pRegions[r].imageSubresource.mipLevel,
1049 .baseArraySlice = pRegions[r].imageSubresource.arraySlice,
1050 .arraySize = 1,
1051 },
1052 cmd_buffer);
1053
1054 meta_emit_blit(cmd_buffer,
1055 &src_view,
1056 (VkOffset3D) { 0, 0, 0 },
1057 pRegions[r].imageExtent,
1058 &dest_view,
1059 pRegions[r].imageOffset,
1060 pRegions[r].imageExtent);
1061
1062 anv_DestroyObject(vk_device, VK_OBJECT_TYPE_IMAGE, (VkImage) src_image);
1063 }
1064
1065 meta_finish_blit(cmd_buffer, &saved_state);
1066 }
1067
1068 void anv_CmdCopyImageToBuffer(
1069 VkCmdBuffer cmdBuffer,
1070 VkImage srcImage,
1071 VkImageLayout srcImageLayout,
1072 VkBuffer destBuffer,
1073 uint32_t regionCount,
1074 const VkBufferImageCopy* pRegions)
1075 {
1076 struct anv_cmd_buffer *cmd_buffer = (struct anv_cmd_buffer *)cmdBuffer;
1077 VkDevice vk_device = (VkDevice) cmd_buffer->device;
1078 struct anv_image *src_image = (struct anv_image *)srcImage;
1079 struct anv_buffer *dest_buffer = (struct anv_buffer *)destBuffer;
1080 struct anv_saved_state saved_state;
1081
1082 meta_prepare_blit(cmd_buffer, &saved_state);
1083
1084 for (unsigned r = 0; r < regionCount; r++) {
1085 struct anv_surface_view src_view;
1086 anv_image_view_init(&src_view, cmd_buffer->device,
1087 &(VkImageViewCreateInfo) {
1088 .sType = VK_STRUCTURE_TYPE_IMAGE_VIEW_CREATE_INFO,
1089 .image = srcImage,
1090 .viewType = VK_IMAGE_VIEW_TYPE_2D,
1091 .format = src_image->format,
1092 .channels = {
1093 VK_CHANNEL_SWIZZLE_R,
1094 VK_CHANNEL_SWIZZLE_G,
1095 VK_CHANNEL_SWIZZLE_B,
1096 VK_CHANNEL_SWIZZLE_A
1097 },
1098 .subresourceRange = {
1099 .aspect = pRegions[r].imageSubresource.aspect,
1100 .baseMipLevel = pRegions[r].imageSubresource.mipLevel,
1101 .mipLevels = 1,
1102 .baseArraySlice = pRegions[r].imageSubresource.arraySlice,
1103 .arraySize = 1
1104 },
1105 .minLod = 0
1106 },
1107 cmd_buffer);
1108
1109 struct anv_image *dest_image;
1110 anv_CreateImage(vk_device,
1111 &(VkImageCreateInfo) {
1112 .sType = VK_STRUCTURE_TYPE_IMAGE_CREATE_INFO,
1113 .imageType = VK_IMAGE_TYPE_2D,
1114 .format = src_image->format,
1115 .extent = {
1116 .width = pRegions[r].imageExtent.width,
1117 .height = pRegions[r].imageExtent.height,
1118 .depth = 1,
1119 },
1120 .mipLevels = 1,
1121 .arraySize = 1,
1122 .samples = 1,
1123 .tiling = VK_IMAGE_TILING_LINEAR,
1124 .usage = VK_IMAGE_USAGE_SAMPLED_BIT,
1125 .flags = 0,
1126 }, (VkImage *)&dest_image);
1127
1128 /* We could use a vk call to bind memory, but that would require
1129 * creating a dummy memory object etc. so there's really no point.
1130 */
1131 dest_image->bo = dest_buffer->bo;
1132 dest_image->offset = dest_buffer->offset + pRegions[r].bufferOffset;
1133
1134 struct anv_surface_view dest_view;
1135 anv_color_attachment_view_init(&dest_view, cmd_buffer->device,
1136 &(VkColorAttachmentViewCreateInfo) {
1137 .sType = VK_STRUCTURE_TYPE_COLOR_ATTACHMENT_VIEW_CREATE_INFO,
1138 .image = (VkImage)dest_image,
1139 .format = src_image->format,
1140 .mipLevel = 0,
1141 .baseArraySlice = 0,
1142 .arraySize = 1,
1143 },
1144 cmd_buffer);
1145
1146 meta_emit_blit(cmd_buffer,
1147 &src_view,
1148 pRegions[r].imageOffset,
1149 pRegions[r].imageExtent,
1150 &dest_view,
1151 (VkOffset3D) { 0, 0, 0 },
1152 pRegions[r].imageExtent);
1153
1154 anv_DestroyObject(vk_device, VK_OBJECT_TYPE_IMAGE, (VkImage) dest_image);
1155 }
1156
1157 meta_finish_blit(cmd_buffer, &saved_state);
1158 }
1159
1160 void anv_CmdCloneImageData(
1161 VkCmdBuffer cmdBuffer,
1162 VkImage srcImage,
1163 VkImageLayout srcImageLayout,
1164 VkImage destImage,
1165 VkImageLayout destImageLayout)
1166 {
1167 stub();
1168 }
1169
1170 void anv_CmdUpdateBuffer(
1171 VkCmdBuffer cmdBuffer,
1172 VkBuffer destBuffer,
1173 VkDeviceSize destOffset,
1174 VkDeviceSize dataSize,
1175 const uint32_t* pData)
1176 {
1177 stub();
1178 }
1179
1180 void anv_CmdFillBuffer(
1181 VkCmdBuffer cmdBuffer,
1182 VkBuffer destBuffer,
1183 VkDeviceSize destOffset,
1184 VkDeviceSize fillSize,
1185 uint32_t data)
1186 {
1187 stub();
1188 }
1189
1190 void anv_CmdClearColorImage(
1191 VkCmdBuffer cmdBuffer,
1192 VkImage image,
1193 VkImageLayout imageLayout,
1194 const VkClearColor* color,
1195 uint32_t rangeCount,
1196 const VkImageSubresourceRange* pRanges)
1197 {
1198 stub();
1199 }
1200
1201 void anv_CmdClearDepthStencil(
1202 VkCmdBuffer cmdBuffer,
1203 VkImage image,
1204 VkImageLayout imageLayout,
1205 float depth,
1206 uint32_t stencil,
1207 uint32_t rangeCount,
1208 const VkImageSubresourceRange* pRanges)
1209 {
1210 stub();
1211 }
1212
1213 void anv_CmdResolveImage(
1214 VkCmdBuffer cmdBuffer,
1215 VkImage srcImage,
1216 VkImageLayout srcImageLayout,
1217 VkImage destImage,
1218 VkImageLayout destImageLayout,
1219 uint32_t regionCount,
1220 const VkImageResolve* pRegions)
1221 {
1222 stub();
1223 }
1224
1225 void
1226 anv_device_init_meta(struct anv_device *device)
1227 {
1228 anv_device_init_meta_clear_state(device);
1229 anv_device_init_meta_blit_state(device);
1230
1231 anv_CreateDynamicRasterState((VkDevice) device,
1232 &(VkDynamicRsStateCreateInfo) {
1233 .sType = VK_STRUCTURE_TYPE_DYNAMIC_RS_STATE_CREATE_INFO,
1234 },
1235 &device->meta_state.shared.rs_state);
1236
1237 anv_CreateDynamicColorBlendState((VkDevice) device,
1238 &(VkDynamicCbStateCreateInfo) {
1239 .sType = VK_STRUCTURE_TYPE_DYNAMIC_CB_STATE_CREATE_INFO
1240 },
1241 &device->meta_state.shared.cb_state);
1242
1243 anv_CreateDynamicDepthStencilState((VkDevice) device,
1244 &(VkDynamicDsStateCreateInfo) {
1245 .sType = VK_STRUCTURE_TYPE_DYNAMIC_DS_STATE_CREATE_INFO
1246 },
1247 &device->meta_state.shared.ds_state);
1248 }
1249
1250 void
1251 anv_device_finish_meta(struct anv_device *device)
1252 {
1253 /* Clear */
1254 anv_DestroyObject((VkDevice) device, VK_OBJECT_TYPE_PIPELINE,
1255 device->meta_state.clear.pipeline);
1256
1257 /* Blit */
1258 anv_DestroyObject((VkDevice) device, VK_OBJECT_TYPE_PIPELINE,
1259 device->meta_state.blit.pipeline);
1260 anv_DestroyObject((VkDevice) device, VK_OBJECT_TYPE_PIPELINE_LAYOUT,
1261 device->meta_state.blit.pipeline_layout);
1262 anv_DestroyObject((VkDevice) device, VK_OBJECT_TYPE_DESCRIPTOR_SET_LAYOUT,
1263 device->meta_state.blit.ds_layout);
1264
1265 /* Shared */
1266 anv_DestroyObject((VkDevice) device, VK_OBJECT_TYPE_DYNAMIC_RS_STATE,
1267 device->meta_state.shared.rs_state);
1268 anv_DestroyObject((VkDevice) device, VK_OBJECT_TYPE_DYNAMIC_CB_STATE,
1269 device->meta_state.shared.cb_state);
1270 anv_DestroyObject((VkDevice) device, VK_OBJECT_TYPE_DYNAMIC_DS_STATE,
1271 device->meta_state.shared.ds_state);
1272 }