vk: Set color/blend state in meta clear if not set yet
[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 VkPipelineLayoutCreateInfo pipeline_layout_info = {
415 .sType = VK_STRUCTURE_TYPE_PIPELINE_LAYOUT_CREATE_INFO,
416 .descriptorSetCount = 1,
417 .pSetLayouts = &device->meta_state.blit.ds_layout,
418 };
419
420 VkPipelineLayout pipeline_layout;
421 anv_CreatePipelineLayout((VkDevice) device, &pipeline_layout_info,
422 &pipeline_layout);
423
424 VkPipelineRsStateCreateInfo rs_create_info = {
425 .sType = VK_STRUCTURE_TYPE_PIPELINE_RS_STATE_CREATE_INFO,
426 .pNext = &vi_create_info,
427 .depthClipEnable = true,
428 .rasterizerDiscardEnable = false,
429 .fillMode = VK_FILL_MODE_SOLID,
430 .cullMode = VK_CULL_MODE_NONE,
431 .frontFace = VK_FRONT_FACE_CCW
432 };
433
434 VkPipelineCbStateCreateInfo cb_create_info = {
435 .sType = VK_STRUCTURE_TYPE_PIPELINE_CB_STATE_CREATE_INFO,
436 .pNext = &rs_create_info,
437 .attachmentCount = 1,
438 .pAttachments = (VkPipelineCbAttachmentState []) {
439 { .channelWriteMask = VK_CHANNEL_A_BIT |
440 VK_CHANNEL_R_BIT | VK_CHANNEL_G_BIT | VK_CHANNEL_B_BIT },
441 }
442 };
443
444 VkGraphicsPipelineCreateInfo pipeline_info = {
445 .sType = VK_STRUCTURE_TYPE_GRAPHICS_PIPELINE_CREATE_INFO,
446 .pNext = &cb_create_info,
447 .flags = 0,
448 .layout = pipeline_layout,
449 };
450
451 anv_pipeline_create((VkDevice) device, &pipeline_info,
452 &(struct anv_pipeline_create_info) {
453 .use_repclear = false,
454 .disable_viewport = true,
455 .disable_scissor = true,
456 .disable_vs = true,
457 .use_rectlist = true
458 },
459 &device->meta_state.blit.pipeline);
460
461 anv_DestroyObject((VkDevice) device, VK_OBJECT_TYPE_SHADER, vs);
462 anv_DestroyObject((VkDevice) device, VK_OBJECT_TYPE_SHADER, fs);
463 }
464
465 static void
466 meta_prepare_blit(struct anv_cmd_buffer *cmd_buffer,
467 struct anv_saved_state *saved_state)
468 {
469 struct anv_device *device = cmd_buffer->device;
470
471 anv_cmd_buffer_save(cmd_buffer, saved_state);
472
473 if ((VkPipeline) cmd_buffer->pipeline != device->meta_state.blit.pipeline)
474 anv_CmdBindPipeline((VkCmdBuffer) cmd_buffer,
475 VK_PIPELINE_BIND_POINT_GRAPHICS,
476 device->meta_state.blit.pipeline);
477
478 /* We don't need anything here, only set if not already set. */
479 if (cmd_buffer->rs_state == NULL)
480 anv_CmdBindDynamicStateObject((VkCmdBuffer) cmd_buffer,
481 VK_STATE_BIND_POINT_RASTER,
482 device->meta_state.shared.rs_state);
483 if (cmd_buffer->ds_state == NULL)
484 anv_CmdBindDynamicStateObject((VkCmdBuffer) cmd_buffer,
485 VK_STATE_BIND_POINT_DEPTH_STENCIL,
486 device->meta_state.shared.ds_state);
487
488 saved_state->cb_state = (VkDynamicCbState) cmd_buffer->cb_state;
489 anv_CmdBindDynamicStateObject((VkCmdBuffer) cmd_buffer,
490 VK_STATE_BIND_POINT_COLOR_BLEND,
491 device->meta_state.shared.cb_state);
492 }
493
494 struct blit_region {
495 VkOffset3D src_offset;
496 VkExtent3D src_extent;
497 VkOffset3D dest_offset;
498 VkExtent3D dest_extent;
499 };
500
501 static void
502 meta_emit_blit(struct anv_cmd_buffer *cmd_buffer,
503 struct anv_surface_view *src,
504 VkOffset3D src_offset,
505 VkExtent3D src_extent,
506 struct anv_surface_view *dest,
507 VkOffset3D dest_offset,
508 VkExtent3D dest_extent)
509 {
510 struct anv_device *device = cmd_buffer->device;
511
512 struct blit_vb_data {
513 float pos[2];
514 float tex_coord[2];
515 } *vb_data;
516
517 unsigned vb_size = sizeof(struct vue_header) + 3 * sizeof(*vb_data);
518
519 struct anv_state vb_state =
520 anv_state_stream_alloc(&cmd_buffer->surface_state_stream, vb_size, 16);
521 memset(vb_state.map, 0, sizeof(struct vue_header));
522 vb_data = vb_state.map + sizeof(struct vue_header);
523
524 vb_data[0] = (struct blit_vb_data) {
525 .pos = {
526 dest_offset.x + dest_extent.width,
527 dest_offset.y + dest_extent.height,
528 },
529 .tex_coord = {
530 (float)(src_offset.x + src_extent.width) / (float)src->extent.width,
531 (float)(src_offset.y + src_extent.height) / (float)src->extent.height,
532 },
533 };
534
535 vb_data[1] = (struct blit_vb_data) {
536 .pos = {
537 dest_offset.x,
538 dest_offset.y + dest_extent.height,
539 },
540 .tex_coord = {
541 (float)src_offset.x / (float)src->extent.width,
542 (float)(src_offset.y + src_extent.height) / (float)src->extent.height,
543 },
544 };
545
546 vb_data[2] = (struct blit_vb_data) {
547 .pos = {
548 dest_offset.x,
549 dest_offset.y,
550 },
551 .tex_coord = {
552 (float)src_offset.x / (float)src->extent.width,
553 (float)src_offset.y / (float)src->extent.height,
554 },
555 };
556
557 struct anv_buffer vertex_buffer = {
558 .device = device,
559 .size = vb_size,
560 .bo = &device->surface_state_block_pool.bo,
561 .offset = vb_state.offset,
562 };
563
564 anv_CmdBindVertexBuffers((VkCmdBuffer) cmd_buffer, 0, 2,
565 (VkBuffer[]) {
566 (VkBuffer) &vertex_buffer,
567 (VkBuffer) &vertex_buffer
568 },
569 (VkDeviceSize[]) {
570 0,
571 sizeof(struct vue_header),
572 });
573
574 uint32_t count;
575 VkDescriptorSet set;
576 anv_AllocDescriptorSets((VkDevice) device, 0 /* pool */,
577 VK_DESCRIPTOR_SET_USAGE_ONE_SHOT,
578 1, &device->meta_state.blit.ds_layout, &set, &count);
579 anv_UpdateDescriptors((VkDevice) device, set, 1,
580 (const void * []) {
581 &(VkUpdateImages) {
582 .sType = VK_STRUCTURE_TYPE_UPDATE_IMAGES,
583 .descriptorType = VK_DESCRIPTOR_TYPE_SAMPLED_IMAGE,
584 .binding = 0,
585 .count = 1,
586 .pImageViews = (VkImageViewAttachInfo[]) {
587 {
588 .sType = VK_STRUCTURE_TYPE_IMAGE_VIEW_ATTACH_INFO,
589 .view = (VkImageView) src,
590 .layout = VK_IMAGE_LAYOUT_GENERAL,
591 }
592 }
593 }
594 });
595
596 struct anv_framebuffer *fb;
597 anv_CreateFramebuffer((VkDevice) device,
598 &(VkFramebufferCreateInfo) {
599 .sType = VK_STRUCTURE_TYPE_FRAMEBUFFER_CREATE_INFO,
600 .colorAttachmentCount = 1,
601 .pColorAttachments = (VkColorAttachmentBindInfo[]) {
602 {
603 .view = (VkColorAttachmentView) dest,
604 .layout = VK_IMAGE_LAYOUT_GENERAL
605 }
606 },
607 .pDepthStencilAttachment = NULL,
608 .sampleCount = 1,
609 .width = dest->extent.width,
610 .height = dest->extent.height,
611 .layers = 1
612 }, (VkFramebuffer *)&fb);
613
614
615 VkRenderPass pass;
616 anv_CreateRenderPass((VkDevice )device,
617 &(VkRenderPassCreateInfo) {
618 .sType = VK_STRUCTURE_TYPE_RENDER_PASS_CREATE_INFO,
619 .renderArea = { { 0, 0 }, { dest->extent.width, dest->extent.height } },
620 .colorAttachmentCount = 1,
621 .extent = { 0, },
622 .sampleCount = 1,
623 .layers = 1,
624 .pColorFormats = (VkFormat[]) { dest->format },
625 .pColorLayouts = (VkImageLayout[]) { VK_IMAGE_LAYOUT_GENERAL },
626 .pColorLoadOps = (VkAttachmentLoadOp[]) { VK_ATTACHMENT_LOAD_OP_LOAD },
627 .pColorStoreOps = (VkAttachmentStoreOp[]) { VK_ATTACHMENT_STORE_OP_STORE },
628 .pColorLoadClearValues = (VkClearColor[]) {
629 { .color = { .floatColor = { 1.0, 0.0, 0.0, 1.0 } }, .useRawValue = false }
630 },
631 .depthStencilFormat = VK_FORMAT_UNDEFINED,
632 }, &pass);
633
634 anv_CmdBeginRenderPass((VkCmdBuffer) cmd_buffer,
635 &(VkRenderPassBegin) {
636 .renderPass = pass,
637 .framebuffer = (VkFramebuffer) fb,
638 });
639
640 anv_CmdBindDynamicStateObject((VkCmdBuffer) cmd_buffer,
641 VK_STATE_BIND_POINT_VIEWPORT, fb->vp_state);
642
643 anv_CmdBindDescriptorSets((VkCmdBuffer) cmd_buffer,
644 VK_PIPELINE_BIND_POINT_GRAPHICS, 0, 1,
645 &set, 0, NULL);
646
647 anv_CmdDraw((VkCmdBuffer) cmd_buffer, 0, 3, 0, 1);
648
649 anv_CmdEndRenderPass((VkCmdBuffer) cmd_buffer, pass);
650 }
651
652 static void
653 meta_finish_blit(struct anv_cmd_buffer *cmd_buffer,
654 const struct anv_saved_state *saved_state)
655 {
656 anv_cmd_buffer_restore(cmd_buffer, saved_state);
657 anv_CmdBindDynamicStateObject((VkCmdBuffer) cmd_buffer,
658 VK_STATE_BIND_POINT_COLOR_BLEND,
659 saved_state->cb_state);
660 }
661
662 static VkFormat
663 vk_format_for_cpp(int cpp)
664 {
665 switch (cpp) {
666 case 1: return VK_FORMAT_R8_UINT;
667 case 2: return VK_FORMAT_R8G8_UINT;
668 case 3: return VK_FORMAT_R8G8B8_UINT;
669 case 4: return VK_FORMAT_R8G8B8A8_UINT;
670 case 6: return VK_FORMAT_R16G16B16_UINT;
671 case 8: return VK_FORMAT_R16G16B16A16_UINT;
672 case 12: return VK_FORMAT_R32G32B32_UINT;
673 case 16: return VK_FORMAT_R32G32B32A32_UINT;
674 default:
675 unreachable("Invalid format cpp");
676 }
677 }
678
679 static void
680 do_buffer_copy(struct anv_cmd_buffer *cmd_buffer,
681 struct anv_bo *src, uint64_t src_offset,
682 struct anv_bo *dest, uint64_t dest_offset,
683 int width, int height, VkFormat copy_format)
684 {
685 VkDevice vk_device = (VkDevice)cmd_buffer->device;
686
687 VkImageCreateInfo image_info = {
688 .sType = VK_STRUCTURE_TYPE_IMAGE_CREATE_INFO,
689 .imageType = VK_IMAGE_TYPE_2D,
690 .format = copy_format,
691 .extent = {
692 .width = width,
693 .height = height,
694 .depth = 1,
695 },
696 .mipLevels = 1,
697 .arraySize = 1,
698 .samples = 1,
699 .tiling = VK_IMAGE_TILING_LINEAR,
700 .usage = VK_IMAGE_USAGE_SAMPLED_BIT,
701 .flags = 0,
702 };
703
704 struct anv_image *src_image, *dest_image;
705 anv_CreateImage(vk_device, &image_info, (VkImage *)&src_image);
706 anv_CreateImage(vk_device, &image_info, (VkImage *)&dest_image);
707
708 /* We could use a vk call to bind memory, but that would require
709 * creating a dummy memory object etc. so there's really no point.
710 */
711 src_image->bo = src;
712 src_image->offset = src_offset;
713 dest_image->bo = dest;
714 dest_image->offset = dest_offset;
715
716 struct anv_surface_view src_view;
717 anv_image_view_init(&src_view, cmd_buffer->device,
718 &(VkImageViewCreateInfo) {
719 .sType = VK_STRUCTURE_TYPE_IMAGE_VIEW_CREATE_INFO,
720 .image = (VkImage)src_image,
721 .viewType = VK_IMAGE_VIEW_TYPE_2D,
722 .format = copy_format,
723 .channels = {
724 VK_CHANNEL_SWIZZLE_R,
725 VK_CHANNEL_SWIZZLE_G,
726 VK_CHANNEL_SWIZZLE_B,
727 VK_CHANNEL_SWIZZLE_A
728 },
729 .subresourceRange = {
730 .aspect = VK_IMAGE_ASPECT_COLOR,
731 .baseMipLevel = 0,
732 .mipLevels = 1,
733 .baseArraySlice = 0,
734 .arraySize = 1
735 },
736 .minLod = 0
737 },
738 cmd_buffer);
739
740 struct anv_surface_view dest_view;
741 anv_color_attachment_view_init(&dest_view, cmd_buffer->device,
742 &(VkColorAttachmentViewCreateInfo) {
743 .sType = VK_STRUCTURE_TYPE_COLOR_ATTACHMENT_VIEW_CREATE_INFO,
744 .image = (VkImage)dest_image,
745 .format = copy_format,
746 .mipLevel = 0,
747 .baseArraySlice = 0,
748 .arraySize = 1,
749 },
750 cmd_buffer);
751
752 meta_emit_blit(cmd_buffer,
753 &src_view,
754 (VkOffset3D) { 0, 0, 0 },
755 (VkExtent3D) { width, height, 1 },
756 &dest_view,
757 (VkOffset3D) { 0, 0, 0 },
758 (VkExtent3D) { width, height, 1 });
759 }
760
761 void anv_CmdCopyBuffer(
762 VkCmdBuffer cmdBuffer,
763 VkBuffer srcBuffer,
764 VkBuffer destBuffer,
765 uint32_t regionCount,
766 const VkBufferCopy* pRegions)
767 {
768 struct anv_cmd_buffer *cmd_buffer = (struct anv_cmd_buffer *)cmdBuffer;
769 struct anv_buffer *src_buffer = (struct anv_buffer *)srcBuffer;
770 struct anv_buffer *dest_buffer = (struct anv_buffer *)destBuffer;
771 struct anv_saved_state saved_state;
772
773 meta_prepare_blit(cmd_buffer, &saved_state);
774
775 for (unsigned r = 0; r < regionCount; r++) {
776 uint64_t src_offset = src_buffer->offset + pRegions[r].srcOffset;
777 uint64_t dest_offset = dest_buffer->offset + pRegions[r].destOffset;
778 uint64_t copy_size = pRegions[r].copySize;
779
780 /* First, we compute the biggest format that can be used with the
781 * given offsets and size.
782 */
783 int cpp = 16;
784
785 int fs = ffs(src_offset) - 1;
786 if (fs != -1)
787 cpp = MIN2(cpp, 1 << fs);
788 assert(src_offset % cpp == 0);
789
790 fs = ffs(dest_offset) - 1;
791 if (fs != -1)
792 cpp = MIN2(cpp, 1 << fs);
793 assert(dest_offset % cpp == 0);
794
795 fs = ffs(pRegions[r].copySize) - 1;
796 if (fs != -1)
797 cpp = MIN2(cpp, 1 << fs);
798 assert(pRegions[r].copySize % cpp == 0);
799
800 VkFormat copy_format = vk_format_for_cpp(cpp);
801
802 /* This is maximum possible width/height our HW can handle */
803 uint64_t max_surface_dim = 1 << 14;
804
805 /* First, we make a bunch of max-sized copies */
806 uint64_t max_copy_size = max_surface_dim * max_surface_dim * cpp;
807 while (copy_size > max_copy_size) {
808 do_buffer_copy(cmd_buffer, src_buffer->bo, src_offset,
809 dest_buffer->bo, dest_offset,
810 max_surface_dim, max_surface_dim, copy_format);
811 copy_size -= max_copy_size;
812 src_offset += max_copy_size;
813 dest_offset += max_copy_size;
814 }
815
816 uint64_t height = copy_size / (max_surface_dim * cpp);
817 assert(height < max_surface_dim);
818 if (height != 0) {
819 uint64_t rect_copy_size = height * max_surface_dim * cpp;
820 do_buffer_copy(cmd_buffer, src_buffer->bo, src_offset,
821 dest_buffer->bo, dest_offset,
822 max_surface_dim, height, copy_format);
823 copy_size -= rect_copy_size;
824 src_offset += rect_copy_size;
825 dest_offset += rect_copy_size;
826 }
827
828 if (copy_size != 0) {
829 do_buffer_copy(cmd_buffer, src_buffer->bo, src_offset,
830 dest_buffer->bo, dest_offset,
831 copy_size / cpp, 1, copy_format);
832 }
833 }
834
835 meta_finish_blit(cmd_buffer, &saved_state);
836 }
837
838 void anv_CmdCopyImage(
839 VkCmdBuffer cmdBuffer,
840 VkImage srcImage,
841 VkImageLayout srcImageLayout,
842 VkImage destImage,
843 VkImageLayout destImageLayout,
844 uint32_t regionCount,
845 const VkImageCopy* pRegions)
846 {
847 struct anv_cmd_buffer *cmd_buffer = (struct anv_cmd_buffer *)cmdBuffer;
848 struct anv_image *src_image = (struct anv_image *)srcImage;
849 struct anv_saved_state saved_state;
850
851 meta_prepare_blit(cmd_buffer, &saved_state);
852
853 for (unsigned r = 0; r < regionCount; r++) {
854 struct anv_surface_view src_view;
855 anv_image_view_init(&src_view, cmd_buffer->device,
856 &(VkImageViewCreateInfo) {
857 .sType = VK_STRUCTURE_TYPE_IMAGE_VIEW_CREATE_INFO,
858 .image = srcImage,
859 .viewType = VK_IMAGE_VIEW_TYPE_2D,
860 .format = src_image->format,
861 .channels = {
862 VK_CHANNEL_SWIZZLE_R,
863 VK_CHANNEL_SWIZZLE_G,
864 VK_CHANNEL_SWIZZLE_B,
865 VK_CHANNEL_SWIZZLE_A
866 },
867 .subresourceRange = {
868 .aspect = pRegions[r].srcSubresource.aspect,
869 .baseMipLevel = pRegions[r].srcSubresource.mipLevel,
870 .mipLevels = 1,
871 .baseArraySlice = pRegions[r].srcSubresource.arraySlice,
872 .arraySize = 1
873 },
874 .minLod = 0
875 },
876 cmd_buffer);
877
878 struct anv_surface_view dest_view;
879 anv_color_attachment_view_init(&dest_view, cmd_buffer->device,
880 &(VkColorAttachmentViewCreateInfo) {
881 .sType = VK_STRUCTURE_TYPE_COLOR_ATTACHMENT_VIEW_CREATE_INFO,
882 .image = destImage,
883 .format = src_image->format,
884 .mipLevel = pRegions[r].destSubresource.mipLevel,
885 .baseArraySlice = pRegions[r].destSubresource.arraySlice,
886 .arraySize = 1,
887 },
888 cmd_buffer);
889
890 meta_emit_blit(cmd_buffer,
891 &src_view,
892 pRegions[r].srcOffset,
893 pRegions[r].extent,
894 &dest_view,
895 pRegions[r].destOffset,
896 pRegions[r].extent);
897 }
898
899 meta_finish_blit(cmd_buffer, &saved_state);
900 }
901
902 void anv_CmdBlitImage(
903 VkCmdBuffer cmdBuffer,
904 VkImage srcImage,
905 VkImageLayout srcImageLayout,
906 VkImage destImage,
907 VkImageLayout destImageLayout,
908 uint32_t regionCount,
909 const VkImageBlit* pRegions)
910 {
911 struct anv_cmd_buffer *cmd_buffer = (struct anv_cmd_buffer *)cmdBuffer;
912 struct anv_image *src_image = (struct anv_image *)srcImage;
913 struct anv_image *dest_image = (struct anv_image *)destImage;
914 struct anv_saved_state saved_state;
915
916 meta_prepare_blit(cmd_buffer, &saved_state);
917
918 for (unsigned r = 0; r < regionCount; r++) {
919 struct anv_surface_view src_view;
920 anv_image_view_init(&src_view, cmd_buffer->device,
921 &(VkImageViewCreateInfo) {
922 .sType = VK_STRUCTURE_TYPE_IMAGE_VIEW_CREATE_INFO,
923 .image = srcImage,
924 .viewType = VK_IMAGE_VIEW_TYPE_2D,
925 .format = src_image->format,
926 .channels = {
927 VK_CHANNEL_SWIZZLE_R,
928 VK_CHANNEL_SWIZZLE_G,
929 VK_CHANNEL_SWIZZLE_B,
930 VK_CHANNEL_SWIZZLE_A
931 },
932 .subresourceRange = {
933 .aspect = pRegions[r].srcSubresource.aspect,
934 .baseMipLevel = pRegions[r].srcSubresource.mipLevel,
935 .mipLevels = 1,
936 .baseArraySlice = pRegions[r].srcSubresource.arraySlice,
937 .arraySize = 1
938 },
939 .minLod = 0
940 },
941 cmd_buffer);
942
943 struct anv_surface_view dest_view;
944 anv_color_attachment_view_init(&dest_view, cmd_buffer->device,
945 &(VkColorAttachmentViewCreateInfo) {
946 .sType = VK_STRUCTURE_TYPE_COLOR_ATTACHMENT_VIEW_CREATE_INFO,
947 .image = destImage,
948 .format = dest_image->format,
949 .mipLevel = pRegions[r].destSubresource.mipLevel,
950 .baseArraySlice = pRegions[r].destSubresource.arraySlice,
951 .arraySize = 1,
952 },
953 cmd_buffer);
954
955 meta_emit_blit(cmd_buffer,
956 &src_view,
957 pRegions[r].srcOffset,
958 pRegions[r].srcExtent,
959 &dest_view,
960 pRegions[r].destOffset,
961 pRegions[r].destExtent);
962 }
963
964 meta_finish_blit(cmd_buffer, &saved_state);
965 }
966
967 void anv_CmdCopyBufferToImage(
968 VkCmdBuffer cmdBuffer,
969 VkBuffer srcBuffer,
970 VkImage destImage,
971 VkImageLayout destImageLayout,
972 uint32_t regionCount,
973 const VkBufferImageCopy* pRegions)
974 {
975 struct anv_cmd_buffer *cmd_buffer = (struct anv_cmd_buffer *)cmdBuffer;
976 VkDevice vk_device = (VkDevice) cmd_buffer->device;
977 struct anv_buffer *src_buffer = (struct anv_buffer *)srcBuffer;
978 struct anv_image *dest_image = (struct anv_image *)destImage;
979 struct anv_saved_state saved_state;
980
981 meta_prepare_blit(cmd_buffer, &saved_state);
982
983 for (unsigned r = 0; r < regionCount; r++) {
984 struct anv_image *src_image;
985 anv_CreateImage(vk_device,
986 &(VkImageCreateInfo) {
987 .sType = VK_STRUCTURE_TYPE_IMAGE_CREATE_INFO,
988 .imageType = VK_IMAGE_TYPE_2D,
989 .format = dest_image->format,
990 .extent = {
991 .width = pRegions[r].imageExtent.width,
992 .height = pRegions[r].imageExtent.height,
993 .depth = 1,
994 },
995 .mipLevels = 1,
996 .arraySize = 1,
997 .samples = 1,
998 .tiling = VK_IMAGE_TILING_LINEAR,
999 .usage = VK_IMAGE_USAGE_SAMPLED_BIT,
1000 .flags = 0,
1001 }, (VkImage *)&src_image);
1002
1003 /* We could use a vk call to bind memory, but that would require
1004 * creating a dummy memory object etc. so there's really no point.
1005 */
1006 src_image->bo = src_buffer->bo;
1007 src_image->offset = src_buffer->offset + pRegions[r].bufferOffset;
1008
1009 struct anv_surface_view src_view;
1010 anv_image_view_init(&src_view, cmd_buffer->device,
1011 &(VkImageViewCreateInfo) {
1012 .sType = VK_STRUCTURE_TYPE_IMAGE_VIEW_CREATE_INFO,
1013 .image = (VkImage)src_image,
1014 .viewType = VK_IMAGE_VIEW_TYPE_2D,
1015 .format = dest_image->format,
1016 .channels = {
1017 VK_CHANNEL_SWIZZLE_R,
1018 VK_CHANNEL_SWIZZLE_G,
1019 VK_CHANNEL_SWIZZLE_B,
1020 VK_CHANNEL_SWIZZLE_A
1021 },
1022 .subresourceRange = {
1023 .aspect = pRegions[r].imageSubresource.aspect,
1024 .baseMipLevel = 0,
1025 .mipLevels = 1,
1026 .baseArraySlice = 0,
1027 .arraySize = 1
1028 },
1029 .minLod = 0
1030 },
1031 cmd_buffer);
1032
1033 struct anv_surface_view dest_view;
1034 anv_color_attachment_view_init(&dest_view, cmd_buffer->device,
1035 &(VkColorAttachmentViewCreateInfo) {
1036 .sType = VK_STRUCTURE_TYPE_COLOR_ATTACHMENT_VIEW_CREATE_INFO,
1037 .image = (VkImage)dest_image,
1038 .format = dest_image->format,
1039 .mipLevel = pRegions[r].imageSubresource.mipLevel,
1040 .baseArraySlice = pRegions[r].imageSubresource.arraySlice,
1041 .arraySize = 1,
1042 },
1043 cmd_buffer);
1044
1045 meta_emit_blit(cmd_buffer,
1046 &src_view,
1047 (VkOffset3D) { 0, 0, 0 },
1048 pRegions[r].imageExtent,
1049 &dest_view,
1050 pRegions[r].imageOffset,
1051 pRegions[r].imageExtent);
1052 }
1053
1054 meta_finish_blit(cmd_buffer, &saved_state);
1055 }
1056
1057 void anv_CmdCopyImageToBuffer(
1058 VkCmdBuffer cmdBuffer,
1059 VkImage srcImage,
1060 VkImageLayout srcImageLayout,
1061 VkBuffer destBuffer,
1062 uint32_t regionCount,
1063 const VkBufferImageCopy* pRegions)
1064 {
1065 struct anv_cmd_buffer *cmd_buffer = (struct anv_cmd_buffer *)cmdBuffer;
1066 VkDevice vk_device = (VkDevice) cmd_buffer->device;
1067 struct anv_image *src_image = (struct anv_image *)srcImage;
1068 struct anv_buffer *dest_buffer = (struct anv_buffer *)destBuffer;
1069 struct anv_saved_state saved_state;
1070
1071 meta_prepare_blit(cmd_buffer, &saved_state);
1072
1073 for (unsigned r = 0; r < regionCount; r++) {
1074 struct anv_surface_view src_view;
1075 anv_image_view_init(&src_view, cmd_buffer->device,
1076 &(VkImageViewCreateInfo) {
1077 .sType = VK_STRUCTURE_TYPE_IMAGE_VIEW_CREATE_INFO,
1078 .image = srcImage,
1079 .viewType = VK_IMAGE_VIEW_TYPE_2D,
1080 .format = src_image->format,
1081 .channels = {
1082 VK_CHANNEL_SWIZZLE_R,
1083 VK_CHANNEL_SWIZZLE_G,
1084 VK_CHANNEL_SWIZZLE_B,
1085 VK_CHANNEL_SWIZZLE_A
1086 },
1087 .subresourceRange = {
1088 .aspect = pRegions[r].imageSubresource.aspect,
1089 .baseMipLevel = pRegions[r].imageSubresource.mipLevel,
1090 .mipLevels = 1,
1091 .baseArraySlice = pRegions[r].imageSubresource.arraySlice,
1092 .arraySize = 1
1093 },
1094 .minLod = 0
1095 },
1096 cmd_buffer);
1097
1098 struct anv_image *dest_image;
1099 anv_CreateImage(vk_device,
1100 &(VkImageCreateInfo) {
1101 .sType = VK_STRUCTURE_TYPE_IMAGE_CREATE_INFO,
1102 .imageType = VK_IMAGE_TYPE_2D,
1103 .format = src_image->format,
1104 .extent = {
1105 .width = pRegions[r].imageExtent.width,
1106 .height = pRegions[r].imageExtent.height,
1107 .depth = 1,
1108 },
1109 .mipLevels = 1,
1110 .arraySize = 1,
1111 .samples = 1,
1112 .tiling = VK_IMAGE_TILING_LINEAR,
1113 .usage = VK_IMAGE_USAGE_SAMPLED_BIT,
1114 .flags = 0,
1115 }, (VkImage *)&dest_image);
1116
1117 /* We could use a vk call to bind memory, but that would require
1118 * creating a dummy memory object etc. so there's really no point.
1119 */
1120 dest_image->bo = dest_buffer->bo;
1121 dest_image->offset = dest_buffer->offset + pRegions[r].bufferOffset;
1122
1123 struct anv_surface_view dest_view;
1124 anv_color_attachment_view_init(&dest_view, cmd_buffer->device,
1125 &(VkColorAttachmentViewCreateInfo) {
1126 .sType = VK_STRUCTURE_TYPE_COLOR_ATTACHMENT_VIEW_CREATE_INFO,
1127 .image = (VkImage)dest_image,
1128 .format = src_image->format,
1129 .mipLevel = 0,
1130 .baseArraySlice = 0,
1131 .arraySize = 1,
1132 },
1133 cmd_buffer);
1134
1135 meta_emit_blit(cmd_buffer,
1136 &src_view,
1137 pRegions[r].imageOffset,
1138 pRegions[r].imageExtent,
1139 &dest_view,
1140 (VkOffset3D) { 0, 0, 0 },
1141 pRegions[r].imageExtent);
1142 }
1143
1144 meta_finish_blit(cmd_buffer, &saved_state);
1145 }
1146
1147 void anv_CmdCloneImageData(
1148 VkCmdBuffer cmdBuffer,
1149 VkImage srcImage,
1150 VkImageLayout srcImageLayout,
1151 VkImage destImage,
1152 VkImageLayout destImageLayout)
1153 {
1154 stub();
1155 }
1156
1157 void anv_CmdUpdateBuffer(
1158 VkCmdBuffer cmdBuffer,
1159 VkBuffer destBuffer,
1160 VkDeviceSize destOffset,
1161 VkDeviceSize dataSize,
1162 const uint32_t* pData)
1163 {
1164 stub();
1165 }
1166
1167 void anv_CmdFillBuffer(
1168 VkCmdBuffer cmdBuffer,
1169 VkBuffer destBuffer,
1170 VkDeviceSize destOffset,
1171 VkDeviceSize fillSize,
1172 uint32_t data)
1173 {
1174 stub();
1175 }
1176
1177 void anv_CmdClearColorImage(
1178 VkCmdBuffer cmdBuffer,
1179 VkImage image,
1180 VkImageLayout imageLayout,
1181 const VkClearColor* color,
1182 uint32_t rangeCount,
1183 const VkImageSubresourceRange* pRanges)
1184 {
1185 stub();
1186 }
1187
1188 void anv_CmdClearDepthStencil(
1189 VkCmdBuffer cmdBuffer,
1190 VkImage image,
1191 VkImageLayout imageLayout,
1192 float depth,
1193 uint32_t stencil,
1194 uint32_t rangeCount,
1195 const VkImageSubresourceRange* pRanges)
1196 {
1197 stub();
1198 }
1199
1200 void anv_CmdResolveImage(
1201 VkCmdBuffer cmdBuffer,
1202 VkImage srcImage,
1203 VkImageLayout srcImageLayout,
1204 VkImage destImage,
1205 VkImageLayout destImageLayout,
1206 uint32_t regionCount,
1207 const VkImageResolve* pRegions)
1208 {
1209 stub();
1210 }
1211
1212 void
1213 anv_device_init_meta(struct anv_device *device)
1214 {
1215 anv_device_init_meta_clear_state(device);
1216 anv_device_init_meta_blit_state(device);
1217
1218 anv_CreateDynamicRasterState((VkDevice) device,
1219 &(VkDynamicRsStateCreateInfo) {
1220 .sType = VK_STRUCTURE_TYPE_DYNAMIC_RS_STATE_CREATE_INFO,
1221 },
1222 &device->meta_state.shared.rs_state);
1223
1224 anv_CreateDynamicColorBlendState((VkDevice) device,
1225 &(VkDynamicCbStateCreateInfo) {
1226 .sType = VK_STRUCTURE_TYPE_DYNAMIC_CB_STATE_CREATE_INFO
1227 },
1228 &device->meta_state.shared.cb_state);
1229
1230 anv_CreateDynamicDepthStencilState((VkDevice) device,
1231 &(VkDynamicDsStateCreateInfo) {
1232 .sType = VK_STRUCTURE_TYPE_DYNAMIC_DS_STATE_CREATE_INFO
1233 },
1234 &device->meta_state.shared.ds_state);
1235 }