OSDN Git Service

anv/allocator: Convert the state stream to pull from a state pool
[android-x86/external-mesa.git] / src / intel / vulkan / anv_cmd_buffer.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 "anv_private.h"
31
32 #include "vk_format_info.h"
33
34 /** \file anv_cmd_buffer.c
35  *
36  * This file contains all of the stuff for emitting commands into a command
37  * buffer.  This includes implementations of most of the vkCmd*
38  * entrypoints.  This file is concerned entirely with state emission and
39  * not with the command buffer data structure itself.  As far as this file
40  * is concerned, most of anv_cmd_buffer is magic.
41  */
42
43 /* TODO: These are taken from GLES.  We should check the Vulkan spec */
44 const struct anv_dynamic_state default_dynamic_state = {
45    .viewport = {
46       .count = 0,
47    },
48    .scissor = {
49       .count = 0,
50    },
51    .line_width = 1.0f,
52    .depth_bias = {
53       .bias = 0.0f,
54       .clamp = 0.0f,
55       .slope = 0.0f,
56    },
57    .blend_constants = { 0.0f, 0.0f, 0.0f, 0.0f },
58    .depth_bounds = {
59       .min = 0.0f,
60       .max = 1.0f,
61    },
62    .stencil_compare_mask = {
63       .front = ~0u,
64       .back = ~0u,
65    },
66    .stencil_write_mask = {
67       .front = ~0u,
68       .back = ~0u,
69    },
70    .stencil_reference = {
71       .front = 0u,
72       .back = 0u,
73    },
74 };
75
76 void
77 anv_dynamic_state_copy(struct anv_dynamic_state *dest,
78                        const struct anv_dynamic_state *src,
79                        uint32_t copy_mask)
80 {
81    if (copy_mask & (1 << VK_DYNAMIC_STATE_VIEWPORT)) {
82       dest->viewport.count = src->viewport.count;
83       typed_memcpy(dest->viewport.viewports, src->viewport.viewports,
84                    src->viewport.count);
85    }
86
87    if (copy_mask & (1 << VK_DYNAMIC_STATE_SCISSOR)) {
88       dest->scissor.count = src->scissor.count;
89       typed_memcpy(dest->scissor.scissors, src->scissor.scissors,
90                    src->scissor.count);
91    }
92
93    if (copy_mask & (1 << VK_DYNAMIC_STATE_LINE_WIDTH))
94       dest->line_width = src->line_width;
95
96    if (copy_mask & (1 << VK_DYNAMIC_STATE_DEPTH_BIAS))
97       dest->depth_bias = src->depth_bias;
98
99    if (copy_mask & (1 << VK_DYNAMIC_STATE_BLEND_CONSTANTS))
100       typed_memcpy(dest->blend_constants, src->blend_constants, 4);
101
102    if (copy_mask & (1 << VK_DYNAMIC_STATE_DEPTH_BOUNDS))
103       dest->depth_bounds = src->depth_bounds;
104
105    if (copy_mask & (1 << VK_DYNAMIC_STATE_STENCIL_COMPARE_MASK))
106       dest->stencil_compare_mask = src->stencil_compare_mask;
107
108    if (copy_mask & (1 << VK_DYNAMIC_STATE_STENCIL_WRITE_MASK))
109       dest->stencil_write_mask = src->stencil_write_mask;
110
111    if (copy_mask & (1 << VK_DYNAMIC_STATE_STENCIL_REFERENCE))
112       dest->stencil_reference = src->stencil_reference;
113 }
114
115 static void
116 anv_cmd_state_reset(struct anv_cmd_buffer *cmd_buffer)
117 {
118    struct anv_cmd_state *state = &cmd_buffer->state;
119
120    cmd_buffer->batch.status = VK_SUCCESS;
121
122    memset(&state->descriptors, 0, sizeof(state->descriptors));
123    for (uint32_t i = 0; i < MESA_SHADER_STAGES; i++) {
124       if (state->push_constants[i] != NULL) {
125          vk_free(&cmd_buffer->pool->alloc, state->push_constants[i]);
126          state->push_constants[i] = NULL;
127       }
128    }
129    memset(state->binding_tables, 0, sizeof(state->binding_tables));
130    memset(state->samplers, 0, sizeof(state->samplers));
131
132    /* 0 isn't a valid config.  This ensures that we always configure L3$. */
133    cmd_buffer->state.current_l3_config = 0;
134
135    state->dirty = 0;
136    state->vb_dirty = 0;
137    state->pending_pipe_bits = 0;
138    state->descriptors_dirty = 0;
139    state->push_constants_dirty = 0;
140    state->pipeline = NULL;
141    state->framebuffer = NULL;
142    state->pass = NULL;
143    state->subpass = NULL;
144    state->push_constant_stages = 0;
145    state->restart_index = UINT32_MAX;
146    state->dynamic = default_dynamic_state;
147    state->need_query_wa = true;
148    state->pma_fix_enabled = false;
149    state->hiz_enabled = false;
150
151    if (state->attachments != NULL) {
152       vk_free(&cmd_buffer->pool->alloc, state->attachments);
153       state->attachments = NULL;
154    }
155
156    state->gen7.index_buffer = NULL;
157 }
158
159 VkResult
160 anv_cmd_buffer_ensure_push_constants_size(struct anv_cmd_buffer *cmd_buffer,
161                                           gl_shader_stage stage, uint32_t size)
162 {
163    struct anv_push_constants **ptr = &cmd_buffer->state.push_constants[stage];
164
165    if (*ptr == NULL) {
166       *ptr = vk_alloc(&cmd_buffer->pool->alloc, size, 8,
167                        VK_SYSTEM_ALLOCATION_SCOPE_OBJECT);
168       if (*ptr == NULL) {
169          anv_batch_set_error(&cmd_buffer->batch, VK_ERROR_OUT_OF_HOST_MEMORY);
170          return vk_error(VK_ERROR_OUT_OF_HOST_MEMORY);
171       }
172    } else if ((*ptr)->size < size) {
173       *ptr = vk_realloc(&cmd_buffer->pool->alloc, *ptr, size, 8,
174                          VK_SYSTEM_ALLOCATION_SCOPE_OBJECT);
175       if (*ptr == NULL) {
176          anv_batch_set_error(&cmd_buffer->batch, VK_ERROR_OUT_OF_HOST_MEMORY);
177          return vk_error(VK_ERROR_OUT_OF_HOST_MEMORY);
178       }
179    }
180    (*ptr)->size = size;
181
182    return VK_SUCCESS;
183 }
184
185 static VkResult anv_create_cmd_buffer(
186     struct anv_device *                         device,
187     struct anv_cmd_pool *                       pool,
188     VkCommandBufferLevel                        level,
189     VkCommandBuffer*                            pCommandBuffer)
190 {
191    struct anv_cmd_buffer *cmd_buffer;
192    VkResult result;
193
194    cmd_buffer = vk_alloc(&pool->alloc, sizeof(*cmd_buffer), 8,
195                           VK_SYSTEM_ALLOCATION_SCOPE_OBJECT);
196    if (cmd_buffer == NULL)
197       return vk_error(VK_ERROR_OUT_OF_HOST_MEMORY);
198
199    cmd_buffer->batch.status = VK_SUCCESS;
200
201    for (uint32_t i = 0; i < MESA_SHADER_STAGES; i++) {
202       cmd_buffer->state.push_constants[i] = NULL;
203    }
204    cmd_buffer->_loader_data.loaderMagic = ICD_LOADER_MAGIC;
205    cmd_buffer->device = device;
206    cmd_buffer->pool = pool;
207    cmd_buffer->level = level;
208    cmd_buffer->state.attachments = NULL;
209
210    result = anv_cmd_buffer_init_batch_bo_chain(cmd_buffer);
211    if (result != VK_SUCCESS)
212       goto fail;
213
214    anv_state_stream_init(&cmd_buffer->surface_state_stream,
215                          &device->surface_state_pool, 4096);
216    anv_state_stream_init(&cmd_buffer->dynamic_state_stream,
217                          &device->dynamic_state_pool, 16384);
218
219    memset(&cmd_buffer->state.push_descriptor, 0,
220           sizeof(cmd_buffer->state.push_descriptor));
221
222    if (pool) {
223       list_addtail(&cmd_buffer->pool_link, &pool->cmd_buffers);
224    } else {
225       /* Init the pool_link so we can safefly call list_del when we destroy
226        * the command buffer
227        */
228       list_inithead(&cmd_buffer->pool_link);
229    }
230
231    *pCommandBuffer = anv_cmd_buffer_to_handle(cmd_buffer);
232
233    return VK_SUCCESS;
234
235  fail:
236    vk_free(&cmd_buffer->pool->alloc, cmd_buffer);
237
238    return result;
239 }
240
241 VkResult anv_AllocateCommandBuffers(
242     VkDevice                                    _device,
243     const VkCommandBufferAllocateInfo*          pAllocateInfo,
244     VkCommandBuffer*                            pCommandBuffers)
245 {
246    ANV_FROM_HANDLE(anv_device, device, _device);
247    ANV_FROM_HANDLE(anv_cmd_pool, pool, pAllocateInfo->commandPool);
248
249    VkResult result = VK_SUCCESS;
250    uint32_t i;
251
252    for (i = 0; i < pAllocateInfo->commandBufferCount; i++) {
253       result = anv_create_cmd_buffer(device, pool, pAllocateInfo->level,
254                                      &pCommandBuffers[i]);
255       if (result != VK_SUCCESS)
256          break;
257    }
258
259    if (result != VK_SUCCESS) {
260       anv_FreeCommandBuffers(_device, pAllocateInfo->commandPool,
261                              i, pCommandBuffers);
262       for (i = 0; i < pAllocateInfo->commandBufferCount; i++)
263          pCommandBuffers[i] = VK_NULL_HANDLE;
264    }
265
266    return result;
267 }
268
269 static void
270 anv_cmd_buffer_destroy(struct anv_cmd_buffer *cmd_buffer)
271 {
272    list_del(&cmd_buffer->pool_link);
273
274    anv_cmd_buffer_fini_batch_bo_chain(cmd_buffer);
275
276    anv_state_stream_finish(&cmd_buffer->surface_state_stream);
277    anv_state_stream_finish(&cmd_buffer->dynamic_state_stream);
278
279    vk_free(&cmd_buffer->pool->alloc, cmd_buffer->state.attachments);
280    vk_free(&cmd_buffer->pool->alloc, cmd_buffer);
281 }
282
283 void anv_FreeCommandBuffers(
284     VkDevice                                    device,
285     VkCommandPool                               commandPool,
286     uint32_t                                    commandBufferCount,
287     const VkCommandBuffer*                      pCommandBuffers)
288 {
289    for (uint32_t i = 0; i < commandBufferCount; i++) {
290       ANV_FROM_HANDLE(anv_cmd_buffer, cmd_buffer, pCommandBuffers[i]);
291
292       if (!cmd_buffer)
293          continue;
294
295       anv_cmd_buffer_destroy(cmd_buffer);
296    }
297 }
298
299 VkResult
300 anv_cmd_buffer_reset(struct anv_cmd_buffer *cmd_buffer)
301 {
302    cmd_buffer->usage_flags = 0;
303    cmd_buffer->state.current_pipeline = UINT32_MAX;
304    anv_cmd_buffer_reset_batch_bo_chain(cmd_buffer);
305    anv_cmd_state_reset(cmd_buffer);
306
307    anv_state_stream_finish(&cmd_buffer->surface_state_stream);
308    anv_state_stream_init(&cmd_buffer->surface_state_stream,
309                          &cmd_buffer->device->surface_state_pool, 4096);
310
311    anv_state_stream_finish(&cmd_buffer->dynamic_state_stream);
312    anv_state_stream_init(&cmd_buffer->dynamic_state_stream,
313                          &cmd_buffer->device->dynamic_state_pool, 16384);
314    return VK_SUCCESS;
315 }
316
317 VkResult anv_ResetCommandBuffer(
318     VkCommandBuffer                             commandBuffer,
319     VkCommandBufferResetFlags                   flags)
320 {
321    ANV_FROM_HANDLE(anv_cmd_buffer, cmd_buffer, commandBuffer);
322    return anv_cmd_buffer_reset(cmd_buffer);
323 }
324
325 void
326 anv_cmd_buffer_emit_state_base_address(struct anv_cmd_buffer *cmd_buffer)
327 {
328    switch (cmd_buffer->device->info.gen) {
329    case 7:
330       if (cmd_buffer->device->info.is_haswell)
331          return gen75_cmd_buffer_emit_state_base_address(cmd_buffer);
332       else
333          return gen7_cmd_buffer_emit_state_base_address(cmd_buffer);
334    case 8:
335       return gen8_cmd_buffer_emit_state_base_address(cmd_buffer);
336    case 9:
337       return gen9_cmd_buffer_emit_state_base_address(cmd_buffer);
338    default:
339       unreachable("unsupported gen\n");
340    }
341 }
342
343 void anv_CmdBindPipeline(
344     VkCommandBuffer                             commandBuffer,
345     VkPipelineBindPoint                         pipelineBindPoint,
346     VkPipeline                                  _pipeline)
347 {
348    ANV_FROM_HANDLE(anv_cmd_buffer, cmd_buffer, commandBuffer);
349    ANV_FROM_HANDLE(anv_pipeline, pipeline, _pipeline);
350
351    switch (pipelineBindPoint) {
352    case VK_PIPELINE_BIND_POINT_COMPUTE:
353       cmd_buffer->state.compute_pipeline = pipeline;
354       cmd_buffer->state.compute_dirty |= ANV_CMD_DIRTY_PIPELINE;
355       cmd_buffer->state.push_constants_dirty |= VK_SHADER_STAGE_COMPUTE_BIT;
356       cmd_buffer->state.descriptors_dirty |= VK_SHADER_STAGE_COMPUTE_BIT;
357       break;
358
359    case VK_PIPELINE_BIND_POINT_GRAPHICS:
360       cmd_buffer->state.pipeline = pipeline;
361       cmd_buffer->state.vb_dirty |= pipeline->vb_used;
362       cmd_buffer->state.dirty |= ANV_CMD_DIRTY_PIPELINE;
363       cmd_buffer->state.push_constants_dirty |= pipeline->active_stages;
364       cmd_buffer->state.descriptors_dirty |= pipeline->active_stages;
365
366       /* Apply the dynamic state from the pipeline */
367       cmd_buffer->state.dirty |= pipeline->dynamic_state_mask;
368       anv_dynamic_state_copy(&cmd_buffer->state.dynamic,
369                              &pipeline->dynamic_state,
370                              pipeline->dynamic_state_mask);
371       break;
372
373    default:
374       assert(!"invalid bind point");
375       break;
376    }
377 }
378
379 void anv_CmdSetViewport(
380     VkCommandBuffer                             commandBuffer,
381     uint32_t                                    firstViewport,
382     uint32_t                                    viewportCount,
383     const VkViewport*                           pViewports)
384 {
385    ANV_FROM_HANDLE(anv_cmd_buffer, cmd_buffer, commandBuffer);
386
387    const uint32_t total_count = firstViewport + viewportCount;
388    if (cmd_buffer->state.dynamic.viewport.count < total_count)
389       cmd_buffer->state.dynamic.viewport.count = total_count;
390
391    memcpy(cmd_buffer->state.dynamic.viewport.viewports + firstViewport,
392           pViewports, viewportCount * sizeof(*pViewports));
393
394    cmd_buffer->state.dirty |= ANV_CMD_DIRTY_DYNAMIC_VIEWPORT;
395 }
396
397 void anv_CmdSetScissor(
398     VkCommandBuffer                             commandBuffer,
399     uint32_t                                    firstScissor,
400     uint32_t                                    scissorCount,
401     const VkRect2D*                             pScissors)
402 {
403    ANV_FROM_HANDLE(anv_cmd_buffer, cmd_buffer, commandBuffer);
404
405    const uint32_t total_count = firstScissor + scissorCount;
406    if (cmd_buffer->state.dynamic.scissor.count < total_count)
407       cmd_buffer->state.dynamic.scissor.count = total_count;
408
409    memcpy(cmd_buffer->state.dynamic.scissor.scissors + firstScissor,
410           pScissors, scissorCount * sizeof(*pScissors));
411
412    cmd_buffer->state.dirty |= ANV_CMD_DIRTY_DYNAMIC_SCISSOR;
413 }
414
415 void anv_CmdSetLineWidth(
416     VkCommandBuffer                             commandBuffer,
417     float                                       lineWidth)
418 {
419    ANV_FROM_HANDLE(anv_cmd_buffer, cmd_buffer, commandBuffer);
420
421    cmd_buffer->state.dynamic.line_width = lineWidth;
422    cmd_buffer->state.dirty |= ANV_CMD_DIRTY_DYNAMIC_LINE_WIDTH;
423 }
424
425 void anv_CmdSetDepthBias(
426     VkCommandBuffer                             commandBuffer,
427     float                                       depthBiasConstantFactor,
428     float                                       depthBiasClamp,
429     float                                       depthBiasSlopeFactor)
430 {
431    ANV_FROM_HANDLE(anv_cmd_buffer, cmd_buffer, commandBuffer);
432
433    cmd_buffer->state.dynamic.depth_bias.bias = depthBiasConstantFactor;
434    cmd_buffer->state.dynamic.depth_bias.clamp = depthBiasClamp;
435    cmd_buffer->state.dynamic.depth_bias.slope = depthBiasSlopeFactor;
436
437    cmd_buffer->state.dirty |= ANV_CMD_DIRTY_DYNAMIC_DEPTH_BIAS;
438 }
439
440 void anv_CmdSetBlendConstants(
441     VkCommandBuffer                             commandBuffer,
442     const float                                 blendConstants[4])
443 {
444    ANV_FROM_HANDLE(anv_cmd_buffer, cmd_buffer, commandBuffer);
445
446    memcpy(cmd_buffer->state.dynamic.blend_constants,
447           blendConstants, sizeof(float) * 4);
448
449    cmd_buffer->state.dirty |= ANV_CMD_DIRTY_DYNAMIC_BLEND_CONSTANTS;
450 }
451
452 void anv_CmdSetDepthBounds(
453     VkCommandBuffer                             commandBuffer,
454     float                                       minDepthBounds,
455     float                                       maxDepthBounds)
456 {
457    ANV_FROM_HANDLE(anv_cmd_buffer, cmd_buffer, commandBuffer);
458
459    cmd_buffer->state.dynamic.depth_bounds.min = minDepthBounds;
460    cmd_buffer->state.dynamic.depth_bounds.max = maxDepthBounds;
461
462    cmd_buffer->state.dirty |= ANV_CMD_DIRTY_DYNAMIC_DEPTH_BOUNDS;
463 }
464
465 void anv_CmdSetStencilCompareMask(
466     VkCommandBuffer                             commandBuffer,
467     VkStencilFaceFlags                          faceMask,
468     uint32_t                                    compareMask)
469 {
470    ANV_FROM_HANDLE(anv_cmd_buffer, cmd_buffer, commandBuffer);
471
472    if (faceMask & VK_STENCIL_FACE_FRONT_BIT)
473       cmd_buffer->state.dynamic.stencil_compare_mask.front = compareMask;
474    if (faceMask & VK_STENCIL_FACE_BACK_BIT)
475       cmd_buffer->state.dynamic.stencil_compare_mask.back = compareMask;
476
477    cmd_buffer->state.dirty |= ANV_CMD_DIRTY_DYNAMIC_STENCIL_COMPARE_MASK;
478 }
479
480 void anv_CmdSetStencilWriteMask(
481     VkCommandBuffer                             commandBuffer,
482     VkStencilFaceFlags                          faceMask,
483     uint32_t                                    writeMask)
484 {
485    ANV_FROM_HANDLE(anv_cmd_buffer, cmd_buffer, commandBuffer);
486
487    if (faceMask & VK_STENCIL_FACE_FRONT_BIT)
488       cmd_buffer->state.dynamic.stencil_write_mask.front = writeMask;
489    if (faceMask & VK_STENCIL_FACE_BACK_BIT)
490       cmd_buffer->state.dynamic.stencil_write_mask.back = writeMask;
491
492    cmd_buffer->state.dirty |= ANV_CMD_DIRTY_DYNAMIC_STENCIL_WRITE_MASK;
493 }
494
495 void anv_CmdSetStencilReference(
496     VkCommandBuffer                             commandBuffer,
497     VkStencilFaceFlags                          faceMask,
498     uint32_t                                    reference)
499 {
500    ANV_FROM_HANDLE(anv_cmd_buffer, cmd_buffer, commandBuffer);
501
502    if (faceMask & VK_STENCIL_FACE_FRONT_BIT)
503       cmd_buffer->state.dynamic.stencil_reference.front = reference;
504    if (faceMask & VK_STENCIL_FACE_BACK_BIT)
505       cmd_buffer->state.dynamic.stencil_reference.back = reference;
506
507    cmd_buffer->state.dirty |= ANV_CMD_DIRTY_DYNAMIC_STENCIL_REFERENCE;
508 }
509
510 void anv_CmdBindDescriptorSets(
511     VkCommandBuffer                             commandBuffer,
512     VkPipelineBindPoint                         pipelineBindPoint,
513     VkPipelineLayout                            _layout,
514     uint32_t                                    firstSet,
515     uint32_t                                    descriptorSetCount,
516     const VkDescriptorSet*                      pDescriptorSets,
517     uint32_t                                    dynamicOffsetCount,
518     const uint32_t*                             pDynamicOffsets)
519 {
520    ANV_FROM_HANDLE(anv_cmd_buffer, cmd_buffer, commandBuffer);
521    ANV_FROM_HANDLE(anv_pipeline_layout, layout, _layout);
522    struct anv_descriptor_set_layout *set_layout;
523
524    assert(firstSet + descriptorSetCount < MAX_SETS);
525
526    uint32_t dynamic_slot = 0;
527    for (uint32_t i = 0; i < descriptorSetCount; i++) {
528       ANV_FROM_HANDLE(anv_descriptor_set, set, pDescriptorSets[i]);
529       set_layout = layout->set[firstSet + i].layout;
530
531       cmd_buffer->state.descriptors[firstSet + i] = set;
532
533       if (set_layout->dynamic_offset_count > 0) {
534          uint32_t dynamic_offset_start =
535             layout->set[firstSet + i].dynamic_offset_start;
536
537          /* Assert that everything is in range */
538          assert(dynamic_offset_start + set_layout->dynamic_offset_count <=
539                 ARRAY_SIZE(cmd_buffer->state.dynamic_offsets));
540          assert(dynamic_slot + set_layout->dynamic_offset_count <=
541                 dynamicOffsetCount);
542
543          typed_memcpy(&cmd_buffer->state.dynamic_offsets[dynamic_offset_start],
544                       &pDynamicOffsets[dynamic_slot],
545                       set_layout->dynamic_offset_count);
546
547          dynamic_slot += set_layout->dynamic_offset_count;
548       }
549
550       cmd_buffer->state.descriptors_dirty |= set_layout->shader_stages;
551    }
552 }
553
554 void anv_CmdBindVertexBuffers(
555     VkCommandBuffer                             commandBuffer,
556     uint32_t                                    firstBinding,
557     uint32_t                                    bindingCount,
558     const VkBuffer*                             pBuffers,
559     const VkDeviceSize*                         pOffsets)
560 {
561    ANV_FROM_HANDLE(anv_cmd_buffer, cmd_buffer, commandBuffer);
562    struct anv_vertex_binding *vb = cmd_buffer->state.vertex_bindings;
563
564    /* We have to defer setting up vertex buffer since we need the buffer
565     * stride from the pipeline. */
566
567    assert(firstBinding + bindingCount < MAX_VBS);
568    for (uint32_t i = 0; i < bindingCount; i++) {
569       vb[firstBinding + i].buffer = anv_buffer_from_handle(pBuffers[i]);
570       vb[firstBinding + i].offset = pOffsets[i];
571       cmd_buffer->state.vb_dirty |= 1 << (firstBinding + i);
572    }
573 }
574
575 enum isl_format
576 anv_isl_format_for_descriptor_type(VkDescriptorType type)
577 {
578    switch (type) {
579    case VK_DESCRIPTOR_TYPE_UNIFORM_BUFFER:
580    case VK_DESCRIPTOR_TYPE_UNIFORM_BUFFER_DYNAMIC:
581       return ISL_FORMAT_R32G32B32A32_FLOAT;
582
583    case VK_DESCRIPTOR_TYPE_STORAGE_BUFFER:
584    case VK_DESCRIPTOR_TYPE_STORAGE_BUFFER_DYNAMIC:
585       return ISL_FORMAT_RAW;
586
587    default:
588       unreachable("Invalid descriptor type");
589    }
590 }
591
592 struct anv_state
593 anv_cmd_buffer_emit_dynamic(struct anv_cmd_buffer *cmd_buffer,
594                             const void *data, uint32_t size, uint32_t alignment)
595 {
596    struct anv_state state;
597
598    state = anv_cmd_buffer_alloc_dynamic_state(cmd_buffer, size, alignment);
599    memcpy(state.map, data, size);
600
601    anv_state_flush(cmd_buffer->device, state);
602
603    VG(VALGRIND_CHECK_MEM_IS_DEFINED(state.map, size));
604
605    return state;
606 }
607
608 struct anv_state
609 anv_cmd_buffer_merge_dynamic(struct anv_cmd_buffer *cmd_buffer,
610                              uint32_t *a, uint32_t *b,
611                              uint32_t dwords, uint32_t alignment)
612 {
613    struct anv_state state;
614    uint32_t *p;
615
616    state = anv_cmd_buffer_alloc_dynamic_state(cmd_buffer,
617                                               dwords * 4, alignment);
618    p = state.map;
619    for (uint32_t i = 0; i < dwords; i++)
620       p[i] = a[i] | b[i];
621
622    anv_state_flush(cmd_buffer->device, state);
623
624    VG(VALGRIND_CHECK_MEM_IS_DEFINED(p, dwords * 4));
625
626    return state;
627 }
628
629 struct anv_state
630 anv_cmd_buffer_push_constants(struct anv_cmd_buffer *cmd_buffer,
631                               gl_shader_stage stage)
632 {
633    /* If we don't have this stage, bail. */
634    if (!anv_pipeline_has_stage(cmd_buffer->state.pipeline, stage))
635       return (struct anv_state) { .offset = 0 };
636
637    struct anv_push_constants *data =
638       cmd_buffer->state.push_constants[stage];
639    const struct brw_stage_prog_data *prog_data =
640       cmd_buffer->state.pipeline->shaders[stage]->prog_data;
641
642    /* If we don't actually have any push constants, bail. */
643    if (data == NULL || prog_data == NULL || prog_data->nr_params == 0)
644       return (struct anv_state) { .offset = 0 };
645
646    struct anv_state state =
647       anv_cmd_buffer_alloc_dynamic_state(cmd_buffer,
648                                          prog_data->nr_params * sizeof(float),
649                                          32 /* bottom 5 bits MBZ */);
650
651    /* Walk through the param array and fill the buffer with data */
652    uint32_t *u32_map = state.map;
653    for (unsigned i = 0; i < prog_data->nr_params; i++) {
654       uint32_t offset = (uintptr_t)prog_data->param[i];
655       u32_map[i] = *(uint32_t *)((uint8_t *)data + offset);
656    }
657
658    anv_state_flush(cmd_buffer->device, state);
659
660    return state;
661 }
662
663 struct anv_state
664 anv_cmd_buffer_cs_push_constants(struct anv_cmd_buffer *cmd_buffer)
665 {
666    struct anv_push_constants *data =
667       cmd_buffer->state.push_constants[MESA_SHADER_COMPUTE];
668    struct anv_pipeline *pipeline = cmd_buffer->state.compute_pipeline;
669    const struct brw_cs_prog_data *cs_prog_data = get_cs_prog_data(pipeline);
670    const struct brw_stage_prog_data *prog_data = &cs_prog_data->base;
671
672    /* If we don't actually have any push constants, bail. */
673    if (cs_prog_data->push.total.size == 0)
674       return (struct anv_state) { .offset = 0 };
675
676    const unsigned push_constant_alignment =
677       cmd_buffer->device->info.gen < 8 ? 32 : 64;
678    const unsigned aligned_total_push_constants_size =
679       ALIGN(cs_prog_data->push.total.size, push_constant_alignment);
680    struct anv_state state =
681       anv_cmd_buffer_alloc_dynamic_state(cmd_buffer,
682                                          aligned_total_push_constants_size,
683                                          push_constant_alignment);
684
685    /* Walk through the param array and fill the buffer with data */
686    uint32_t *u32_map = state.map;
687
688    if (cs_prog_data->push.cross_thread.size > 0) {
689       assert(cs_prog_data->thread_local_id_index < 0 ||
690              cs_prog_data->thread_local_id_index >=
691                 cs_prog_data->push.cross_thread.dwords);
692       for (unsigned i = 0;
693            i < cs_prog_data->push.cross_thread.dwords;
694            i++) {
695          uint32_t offset = (uintptr_t)prog_data->param[i];
696          u32_map[i] = *(uint32_t *)((uint8_t *)data + offset);
697       }
698    }
699
700    if (cs_prog_data->push.per_thread.size > 0) {
701       for (unsigned t = 0; t < cs_prog_data->threads; t++) {
702          unsigned dst =
703             8 * (cs_prog_data->push.per_thread.regs * t +
704                  cs_prog_data->push.cross_thread.regs);
705          unsigned src = cs_prog_data->push.cross_thread.dwords;
706          for ( ; src < prog_data->nr_params; src++, dst++) {
707             if (src != cs_prog_data->thread_local_id_index) {
708                uint32_t offset = (uintptr_t)prog_data->param[src];
709                u32_map[dst] = *(uint32_t *)((uint8_t *)data + offset);
710             } else {
711                u32_map[dst] = t * cs_prog_data->simd_size;
712             }
713          }
714       }
715    }
716
717    anv_state_flush(cmd_buffer->device, state);
718
719    return state;
720 }
721
722 void anv_CmdPushConstants(
723     VkCommandBuffer                             commandBuffer,
724     VkPipelineLayout                            layout,
725     VkShaderStageFlags                          stageFlags,
726     uint32_t                                    offset,
727     uint32_t                                    size,
728     const void*                                 pValues)
729 {
730    ANV_FROM_HANDLE(anv_cmd_buffer, cmd_buffer, commandBuffer);
731
732    anv_foreach_stage(stage, stageFlags) {
733       VkResult result =
734          anv_cmd_buffer_ensure_push_constant_field(cmd_buffer,
735                                                    stage, client_data);
736       if (result != VK_SUCCESS)
737          return;
738
739       memcpy(cmd_buffer->state.push_constants[stage]->client_data + offset,
740              pValues, size);
741    }
742
743    cmd_buffer->state.push_constants_dirty |= stageFlags;
744 }
745
746 VkResult anv_CreateCommandPool(
747     VkDevice                                    _device,
748     const VkCommandPoolCreateInfo*              pCreateInfo,
749     const VkAllocationCallbacks*                pAllocator,
750     VkCommandPool*                              pCmdPool)
751 {
752    ANV_FROM_HANDLE(anv_device, device, _device);
753    struct anv_cmd_pool *pool;
754
755    pool = vk_alloc2(&device->alloc, pAllocator, sizeof(*pool), 8,
756                      VK_SYSTEM_ALLOCATION_SCOPE_OBJECT);
757    if (pool == NULL)
758       return vk_error(VK_ERROR_OUT_OF_HOST_MEMORY);
759
760    if (pAllocator)
761       pool->alloc = *pAllocator;
762    else
763       pool->alloc = device->alloc;
764
765    list_inithead(&pool->cmd_buffers);
766
767    *pCmdPool = anv_cmd_pool_to_handle(pool);
768
769    return VK_SUCCESS;
770 }
771
772 void anv_DestroyCommandPool(
773     VkDevice                                    _device,
774     VkCommandPool                               commandPool,
775     const VkAllocationCallbacks*                pAllocator)
776 {
777    ANV_FROM_HANDLE(anv_device, device, _device);
778    ANV_FROM_HANDLE(anv_cmd_pool, pool, commandPool);
779
780    if (!pool)
781       return;
782
783    list_for_each_entry_safe(struct anv_cmd_buffer, cmd_buffer,
784                             &pool->cmd_buffers, pool_link) {
785       anv_cmd_buffer_destroy(cmd_buffer);
786    }
787
788    vk_free2(&device->alloc, pAllocator, pool);
789 }
790
791 VkResult anv_ResetCommandPool(
792     VkDevice                                    device,
793     VkCommandPool                               commandPool,
794     VkCommandPoolResetFlags                     flags)
795 {
796    ANV_FROM_HANDLE(anv_cmd_pool, pool, commandPool);
797
798    list_for_each_entry(struct anv_cmd_buffer, cmd_buffer,
799                        &pool->cmd_buffers, pool_link) {
800       anv_cmd_buffer_reset(cmd_buffer);
801    }
802
803    return VK_SUCCESS;
804 }
805
806 void anv_TrimCommandPoolKHR(
807     VkDevice                                    device,
808     VkCommandPool                               commandPool,
809     VkCommandPoolTrimFlagsKHR                   flags)
810 {
811    /* Nothing for us to do here.  Our pools stay pretty tidy. */
812 }
813
814 /**
815  * Return NULL if the current subpass has no depthstencil attachment.
816  */
817 const struct anv_image_view *
818 anv_cmd_buffer_get_depth_stencil_view(const struct anv_cmd_buffer *cmd_buffer)
819 {
820    const struct anv_subpass *subpass = cmd_buffer->state.subpass;
821    const struct anv_framebuffer *fb = cmd_buffer->state.framebuffer;
822
823    if (subpass->depth_stencil_attachment.attachment == VK_ATTACHMENT_UNUSED)
824       return NULL;
825
826    const struct anv_image_view *iview =
827       fb->attachments[subpass->depth_stencil_attachment.attachment];
828
829    assert(iview->aspect_mask & (VK_IMAGE_ASPECT_DEPTH_BIT |
830                                 VK_IMAGE_ASPECT_STENCIL_BIT));
831
832    return iview;
833 }
834
835 void anv_CmdPushDescriptorSetKHR(
836     VkCommandBuffer commandBuffer,
837     VkPipelineBindPoint pipelineBindPoint,
838     VkPipelineLayout _layout,
839     uint32_t _set,
840     uint32_t descriptorWriteCount,
841     const VkWriteDescriptorSet* pDescriptorWrites)
842 {
843    ANV_FROM_HANDLE(anv_cmd_buffer, cmd_buffer, commandBuffer);
844    ANV_FROM_HANDLE(anv_pipeline_layout, layout, _layout);
845
846    assert(pipelineBindPoint == VK_PIPELINE_BIND_POINT_GRAPHICS ||
847           pipelineBindPoint == VK_PIPELINE_BIND_POINT_COMPUTE);
848    assert(_set < MAX_SETS);
849
850    const struct anv_descriptor_set_layout *set_layout =
851       layout->set[_set].layout;
852    struct anv_descriptor_set *set = &cmd_buffer->state.push_descriptor.set;
853
854    set->layout = set_layout;
855    set->size = anv_descriptor_set_layout_size(set_layout);
856    set->buffer_count = set_layout->buffer_count;
857    set->buffer_views = cmd_buffer->state.push_descriptor.buffer_views;
858
859    /* Go through the user supplied descriptors. */
860    for (uint32_t i = 0; i < descriptorWriteCount; i++) {
861       const VkWriteDescriptorSet *write = &pDescriptorWrites[i];
862
863       switch (write->descriptorType) {
864       case VK_DESCRIPTOR_TYPE_SAMPLER:
865       case VK_DESCRIPTOR_TYPE_COMBINED_IMAGE_SAMPLER:
866       case VK_DESCRIPTOR_TYPE_SAMPLED_IMAGE:
867       case VK_DESCRIPTOR_TYPE_STORAGE_IMAGE:
868       case VK_DESCRIPTOR_TYPE_INPUT_ATTACHMENT:
869          for (uint32_t j = 0; j < write->descriptorCount; j++) {
870             anv_descriptor_set_write_image_view(set, &cmd_buffer->device->info,
871                                                 write->pImageInfo + j,
872                                                 write->descriptorType,
873                                                 write->dstBinding,
874                                                 write->dstArrayElement + j);
875          }
876          break;
877
878       case VK_DESCRIPTOR_TYPE_UNIFORM_TEXEL_BUFFER:
879       case VK_DESCRIPTOR_TYPE_STORAGE_TEXEL_BUFFER:
880          for (uint32_t j = 0; j < write->descriptorCount; j++) {
881             ANV_FROM_HANDLE(anv_buffer_view, bview,
882                             write->pTexelBufferView[j]);
883
884             anv_descriptor_set_write_buffer_view(set,
885                                                  write->descriptorType,
886                                                  bview,
887                                                  write->dstBinding,
888                                                  write->dstArrayElement + j);
889          }
890          break;
891
892       case VK_DESCRIPTOR_TYPE_UNIFORM_BUFFER:
893       case VK_DESCRIPTOR_TYPE_STORAGE_BUFFER:
894       case VK_DESCRIPTOR_TYPE_UNIFORM_BUFFER_DYNAMIC:
895       case VK_DESCRIPTOR_TYPE_STORAGE_BUFFER_DYNAMIC:
896          for (uint32_t j = 0; j < write->descriptorCount; j++) {
897             assert(write->pBufferInfo[j].buffer);
898             ANV_FROM_HANDLE(anv_buffer, buffer, write->pBufferInfo[j].buffer);
899             assert(buffer);
900
901             anv_descriptor_set_write_buffer(set,
902                                             cmd_buffer->device,
903                                             &cmd_buffer->surface_state_stream,
904                                             write->descriptorType,
905                                             buffer,
906                                             write->dstBinding,
907                                             write->dstArrayElement + j,
908                                             write->pBufferInfo[j].offset,
909                                             write->pBufferInfo[j].range);
910          }
911          break;
912
913       default:
914          break;
915       }
916    }
917
918    cmd_buffer->state.descriptors[_set] = set;
919    cmd_buffer->state.descriptors_dirty |= set_layout->shader_stages;
920 }
921
922 void anv_CmdPushDescriptorSetWithTemplateKHR(
923     VkCommandBuffer                             commandBuffer,
924     VkDescriptorUpdateTemplateKHR               descriptorUpdateTemplate,
925     VkPipelineLayout                            _layout,
926     uint32_t                                    _set,
927     const void*                                 pData)
928 {
929    ANV_FROM_HANDLE(anv_cmd_buffer, cmd_buffer, commandBuffer);
930    ANV_FROM_HANDLE(anv_descriptor_update_template, template,
931                    descriptorUpdateTemplate);
932    ANV_FROM_HANDLE(anv_pipeline_layout, layout, _layout);
933
934    assert(_set < MAX_PUSH_DESCRIPTORS);
935
936    const struct anv_descriptor_set_layout *set_layout =
937       layout->set[_set].layout;
938    struct anv_descriptor_set *set = &cmd_buffer->state.push_descriptor.set;
939
940    set->layout = set_layout;
941    set->size = anv_descriptor_set_layout_size(set_layout);
942    set->buffer_count = set_layout->buffer_count;
943    set->buffer_views = cmd_buffer->state.push_descriptor.buffer_views;
944
945    anv_descriptor_set_write_template(set,
946                                      cmd_buffer->device,
947                                      &cmd_buffer->surface_state_stream,
948                                      template,
949                                      pData);
950
951    cmd_buffer->state.descriptors[_set] = set;
952    cmd_buffer->state.descriptors_dirty |= set_layout->shader_stages;
953 }