diff --git a/src/freedreno/vulkan/tu_clear_blit.c b/src/freedreno/vulkan/tu_clear_blit.c index fe39d6a4099..1e9fe234107 100644 --- a/src/freedreno/vulkan/tu_clear_blit.c +++ b/src/freedreno/vulkan/tu_clear_blit.c @@ -1087,9 +1087,6 @@ tu_CmdBlitImage(VkCommandBuffer commandBuffer, TU_FROM_HANDLE(tu_image, src_image, srcImage); TU_FROM_HANDLE(tu_image, dst_image, dstImage); - tu_bo_list_add(&cmd->bo_list, src_image->bo, MSM_SUBMIT_BO_READ); - tu_bo_list_add(&cmd->bo_list, dst_image->bo, MSM_SUBMIT_BO_WRITE); - for (uint32_t i = 0; i < regionCount; ++i) { /* can't blit both depth and stencil at once with D32_S8 * TODO: more advanced 3D blit path to support it instead? @@ -1210,9 +1207,6 @@ tu_CmdCopyBufferToImage(VkCommandBuffer commandBuffer, TU_FROM_HANDLE(tu_image, dst_image, dstImage); TU_FROM_HANDLE(tu_buffer, src_buffer, srcBuffer); - tu_bo_list_add(&cmd->bo_list, src_buffer->bo, MSM_SUBMIT_BO_READ); - tu_bo_list_add(&cmd->bo_list, dst_image->bo, MSM_SUBMIT_BO_WRITE); - for (unsigned i = 0; i < regionCount; ++i) tu_copy_buffer_to_image(cmd, src_buffer, dst_image, pRegions + i); } @@ -1285,9 +1279,6 @@ tu_CmdCopyImageToBuffer(VkCommandBuffer commandBuffer, TU_FROM_HANDLE(tu_image, src_image, srcImage); TU_FROM_HANDLE(tu_buffer, dst_buffer, dstBuffer); - tu_bo_list_add(&cmd->bo_list, src_image->bo, MSM_SUBMIT_BO_READ); - tu_bo_list_add(&cmd->bo_list, dst_buffer->bo, MSM_SUBMIT_BO_WRITE); - for (unsigned i = 0; i < regionCount; ++i) tu_copy_image_to_buffer(cmd, src_image, dst_buffer, pRegions + i); } @@ -1444,9 +1435,6 @@ tu_copy_image_to_image(struct tu_cmd_buffer *cmd, return; } - tu_bo_list_add(&cmd->bo_list, staging_image.bo, - MSM_SUBMIT_BO_READ | MSM_SUBMIT_BO_WRITE); - struct tu_image_view staging; tu_image_view_copy(&staging, &staging_image, src_format, &staging_subresource, 0, false); @@ -1509,9 +1497,6 @@ tu_CmdCopyImage(VkCommandBuffer commandBuffer, TU_FROM_HANDLE(tu_image, src_image, srcImage); TU_FROM_HANDLE(tu_image, dst_image, destImage); - tu_bo_list_add(&cmd->bo_list, src_image->bo, MSM_SUBMIT_BO_READ); - tu_bo_list_add(&cmd->bo_list, dst_image->bo, MSM_SUBMIT_BO_WRITE); - for (uint32_t i = 0; i < regionCount; ++i) tu_copy_image_to_image(cmd, src_image, dst_image, pRegions + i); } @@ -1559,9 +1544,6 @@ tu_CmdCopyBuffer(VkCommandBuffer commandBuffer, TU_FROM_HANDLE(tu_buffer, src_buffer, srcBuffer); TU_FROM_HANDLE(tu_buffer, dst_buffer, dstBuffer); - tu_bo_list_add(&cmd->bo_list, src_buffer->bo, MSM_SUBMIT_BO_READ); - tu_bo_list_add(&cmd->bo_list, dst_buffer->bo, MSM_SUBMIT_BO_WRITE); - for (unsigned i = 0; i < regionCount; ++i) { copy_buffer(cmd, tu_buffer_iova(dst_buffer) + pRegions[i].dstOffset, @@ -1580,8 +1562,6 @@ tu_CmdUpdateBuffer(VkCommandBuffer commandBuffer, TU_FROM_HANDLE(tu_cmd_buffer, cmd, commandBuffer); TU_FROM_HANDLE(tu_buffer, buffer, dstBuffer); - tu_bo_list_add(&cmd->bo_list, buffer->bo, MSM_SUBMIT_BO_WRITE); - struct tu_cs_memory tmp; VkResult result = tu_cs_alloc(&cmd->sub_cs, DIV_ROUND_UP(dataSize, 64), 64, &tmp); if (result != VK_SUCCESS) { @@ -1605,8 +1585,6 @@ tu_CmdFillBuffer(VkCommandBuffer commandBuffer, const struct blit_ops *ops = &r2d_ops; struct tu_cs *cs = &cmd->cs; - tu_bo_list_add(&cmd->bo_list, buffer->bo, MSM_SUBMIT_BO_WRITE); - if (fillSize == VK_WHOLE_SIZE) fillSize = buffer->size - dstOffset; @@ -1646,9 +1624,6 @@ tu_CmdResolveImage(VkCommandBuffer commandBuffer, const struct blit_ops *ops = &r2d_ops; struct tu_cs *cs = &cmd->cs; - tu_bo_list_add(&cmd->bo_list, src_image->bo, MSM_SUBMIT_BO_READ); - tu_bo_list_add(&cmd->bo_list, dst_image->bo, MSM_SUBMIT_BO_WRITE); - ops->setup(cmd, cs, dst_image->vk_format, VK_IMAGE_ASPECT_COLOR_BIT, ROTATE_0, false, dst_image->layout[0].ubwc); @@ -1692,9 +1667,6 @@ tu_resolve_sysmem(struct tu_cmd_buffer *cmd, { const struct blit_ops *ops = &r2d_ops; - tu_bo_list_add(&cmd->bo_list, src->image->bo, MSM_SUBMIT_BO_READ); - tu_bo_list_add(&cmd->bo_list, dst->image->bo, MSM_SUBMIT_BO_WRITE); - assert(src->image->vk_format == dst->image->vk_format); ops->setup(cmd, cs, dst->image->vk_format, VK_IMAGE_ASPECT_COLOR_BIT, @@ -1774,8 +1746,6 @@ tu_CmdClearColorImage(VkCommandBuffer commandBuffer, TU_FROM_HANDLE(tu_cmd_buffer, cmd, commandBuffer); TU_FROM_HANDLE(tu_image, image, image_h); - tu_bo_list_add(&cmd->bo_list, image->bo, MSM_SUBMIT_BO_WRITE); - for (unsigned i = 0; i < rangeCount; i++) clear_image(cmd, image, (const VkClearValue*) pColor, pRanges + i, VK_IMAGE_ASPECT_COLOR_BIT); } @@ -1791,8 +1761,6 @@ tu_CmdClearDepthStencilImage(VkCommandBuffer commandBuffer, TU_FROM_HANDLE(tu_cmd_buffer, cmd, commandBuffer); TU_FROM_HANDLE(tu_image, image, image_h); - tu_bo_list_add(&cmd->bo_list, image->bo, MSM_SUBMIT_BO_WRITE); - for (unsigned i = 0; i < rangeCount; i++) { const VkImageSubresourceRange *range = &pRanges[i]; diff --git a/src/freedreno/vulkan/tu_cmd_buffer.c b/src/freedreno/vulkan/tu_cmd_buffer.c index 447a438af4d..f77f849f405 100644 --- a/src/freedreno/vulkan/tu_cmd_buffer.c +++ b/src/freedreno/vulkan/tu_cmd_buffer.c @@ -35,80 +35,6 @@ #include "tu_cs.h" -void -tu_bo_list_init(struct tu_bo_list *list) -{ - list->count = list->capacity = 0; - list->bo_infos = NULL; -} - -void -tu_bo_list_destroy(struct tu_bo_list *list) -{ - free(list->bo_infos); -} - -void -tu_bo_list_reset(struct tu_bo_list *list) -{ - list->count = 0; -} - -/** - * \a flags consists of MSM_SUBMIT_BO_FLAGS. - */ -static uint32_t -tu_bo_list_add_info(struct tu_bo_list *list, - const struct drm_msm_gem_submit_bo *bo_info) -{ - assert(bo_info->handle != 0); - - for (uint32_t i = 0; i < list->count; ++i) { - if (list->bo_infos[i].handle == bo_info->handle) { - assert(list->bo_infos[i].presumed == bo_info->presumed); - list->bo_infos[i].flags |= bo_info->flags; - return i; - } - } - - /* grow list->bo_infos if needed */ - if (list->count == list->capacity) { - uint32_t new_capacity = MAX2(2 * list->count, 16); - struct drm_msm_gem_submit_bo *new_bo_infos = realloc( - list->bo_infos, new_capacity * sizeof(struct drm_msm_gem_submit_bo)); - if (!new_bo_infos) - return TU_BO_LIST_FAILED; - list->bo_infos = new_bo_infos; - list->capacity = new_capacity; - } - - list->bo_infos[list->count] = *bo_info; - return list->count++; -} - -uint32_t -tu_bo_list_add(struct tu_bo_list *list, - const struct tu_bo *bo, - uint32_t flags) -{ - return tu_bo_list_add_info(list, &(struct drm_msm_gem_submit_bo) { - .flags = flags, - .handle = bo->gem_handle, - .presumed = bo->iova, - }); -} - -VkResult -tu_bo_list_merge(struct tu_bo_list *list, const struct tu_bo_list *other) -{ - for (uint32_t i = 0; i < other->count; i++) { - if (tu_bo_list_add_info(list, other->bo_infos + i) == TU_BO_LIST_FAILED) - return VK_ERROR_OUT_OF_HOST_MEMORY; - } - - return VK_SUCCESS; -} - void tu6_emit_event_write(struct tu_cmd_buffer *cmd, struct tu_cs *cs, @@ -932,8 +858,6 @@ tu6_init_hw(struct tu_cmd_buffer *cmd, struct tu_cs *cs) A6XX_VSC_DRAW_STRM_ADDRESS(.bo = vsc_bo, .bo_offset = cmd->vsc_prim_strm_pitch * MAX_VSC_PIPES)); - tu_bo_list_add(&cmd->bo_list, vsc_bo, MSM_SUBMIT_BO_READ | MSM_SUBMIT_BO_WRITE); - tu_cs_sanity_check(cs); } @@ -1436,7 +1360,6 @@ tu_create_cmd_buffer(struct tu_device *device, cmd_buffer->queue_family_index = TU_QUEUE_GENERAL; } - tu_bo_list_init(&cmd_buffer->bo_list); tu_cs_init(&cmd_buffer->cs, device, TU_CS_MODE_GROW, 4096); tu_cs_init(&cmd_buffer->draw_cs, device, TU_CS_MODE_GROW, 4096); tu_cs_init(&cmd_buffer->draw_epilogue_cs, device, TU_CS_MODE_GROW, 4096); @@ -1457,7 +1380,6 @@ tu_cmd_buffer_destroy(struct tu_cmd_buffer *cmd_buffer) tu_cs_finish(&cmd_buffer->draw_epilogue_cs); tu_cs_finish(&cmd_buffer->sub_cs); - tu_bo_list_destroy(&cmd_buffer->bo_list); vk_object_free(&cmd_buffer->device->vk, &cmd_buffer->pool->alloc, cmd_buffer); } @@ -1466,7 +1388,6 @@ tu_reset_cmd_buffer(struct tu_cmd_buffer *cmd_buffer) { cmd_buffer->record_result = VK_SUCCESS; - tu_bo_list_reset(&cmd_buffer->bo_list); tu_cs_reset(&cmd_buffer->cs); tu_cs_reset(&cmd_buffer->draw_cs); tu_cs_reset(&cmd_buffer->draw_epilogue_cs); @@ -1655,7 +1576,6 @@ tu_CmdBindVertexBuffers(VkCommandBuffer commandBuffer, cmd->state.vb[firstBinding + i].base = tu_buffer_iova(buf) + pOffsets[i]; cmd->state.vb[firstBinding + i].size = buf->size - pOffsets[i]; - tu_bo_list_add(&cmd->bo_list, buf->bo, MSM_SUBMIT_BO_READ); } for (uint32_t i = 0; i < MAX_VBS; i++) { @@ -1710,8 +1630,6 @@ tu_CmdBindIndexBuffer(VkCommandBuffer commandBuffer, cmd->state.index_va = buf->bo->iova + buf->bo_offset + offset; cmd->state.max_index_count = (buf->size - offset) >> index_shift; cmd->state.index_size = index_size; - - tu_bo_list_add(&cmd->bo_list, buf->bo, MSM_SUBMIT_BO_READ); } void @@ -1767,18 +1685,6 @@ tu_CmdBindDescriptorSets(VkCommandBuffer commandBuffer, dst[5] = va >> 32; } } - - for (unsigned j = 0; j < set->layout->buffer_count; ++j) { - if (set->buffers[j]) { - tu_bo_list_add(&cmd->bo_list, set->buffers[j], - MSM_SUBMIT_BO_READ | MSM_SUBMIT_BO_WRITE); - } - } - - if (set->size > 0) { - tu_bo_list_add(&cmd->bo_list, &set->pool->bo, - MSM_SUBMIT_BO_READ | MSM_SUBMIT_BO_DUMP); - } } assert(dyn_idx == dynamicOffsetCount); @@ -1872,8 +1778,6 @@ void tu_CmdBindTransformFeedbackBuffersEXT(VkCommandBuffer commandBuffer, tu_cs_emit(cs, size + offset); cmd->state.streamout_offset[idx] = offset; - - tu_bo_list_add(&cmd->bo_list, buf->bo, MSM_SUBMIT_BO_WRITE); } tu_cond_exec_end(cs); @@ -1906,8 +1810,6 @@ tu_CmdBeginTransformFeedbackEXT(VkCommandBuffer commandBuffer, TU_FROM_HANDLE(tu_buffer, buf, pCounterBuffers[i]); - tu_bo_list_add(&cmd->bo_list, buf->bo, MSM_SUBMIT_BO_READ); - tu_cs_emit_pkt7(cs, CP_MEM_TO_REG, 3); tu_cs_emit(cs, CP_MEM_TO_REG_0_REG(REG_A6XX_VPC_SO_BUFFER_OFFSET(idx)) | CP_MEM_TO_REG_0_UNK31 | @@ -1956,8 +1858,6 @@ void tu_CmdEndTransformFeedbackEXT(VkCommandBuffer commandBuffer, TU_FROM_HANDLE(tu_buffer, buf, pCounterBuffers[i]); - tu_bo_list_add(&cmd->bo_list, buf->bo, MSM_SUBMIT_BO_WRITE); - /* VPC_SO_FLUSH_BASE has dwords counter, but counter should be in bytes */ tu_cs_emit_pkt7(cs, CP_MEM_TO_REG, 3); tu_cs_emit(cs, CP_MEM_TO_REG_0_REG(REG_A6XX_CP_SCRATCH_REG(0)) | @@ -2037,24 +1937,6 @@ tu_EndCommandBuffer(VkCommandBuffer commandBuffer) tu_emit_cache_flush(cmd_buffer, &cmd_buffer->cs); } - tu_bo_list_add(&cmd_buffer->bo_list, &cmd_buffer->device->global_bo, - MSM_SUBMIT_BO_READ | MSM_SUBMIT_BO_WRITE); - - for (uint32_t i = 0; i < cmd_buffer->draw_cs.bo_count; i++) { - tu_bo_list_add(&cmd_buffer->bo_list, cmd_buffer->draw_cs.bos[i], - MSM_SUBMIT_BO_READ | MSM_SUBMIT_BO_DUMP); - } - - for (uint32_t i = 0; i < cmd_buffer->draw_epilogue_cs.bo_count; i++) { - tu_bo_list_add(&cmd_buffer->bo_list, cmd_buffer->draw_epilogue_cs.bos[i], - MSM_SUBMIT_BO_READ | MSM_SUBMIT_BO_DUMP); - } - - for (uint32_t i = 0; i < cmd_buffer->sub_cs.bo_count; i++) { - tu_bo_list_add(&cmd_buffer->bo_list, cmd_buffer->sub_cs.bos[i], - MSM_SUBMIT_BO_READ | MSM_SUBMIT_BO_DUMP); - } - tu_cs_end(&cmd_buffer->cs); tu_cs_end(&cmd_buffer->draw_cs); tu_cs_end(&cmd_buffer->draw_epilogue_cs); @@ -2086,11 +1968,6 @@ tu_CmdBindPipeline(VkCommandBuffer commandBuffer, TU_FROM_HANDLE(tu_cmd_buffer, cmd, commandBuffer); TU_FROM_HANDLE(tu_pipeline, pipeline, _pipeline); - for (uint32_t i = 0; i < pipeline->cs.bo_count; i++) { - tu_bo_list_add(&cmd->bo_list, pipeline->cs.bos[i], - MSM_SUBMIT_BO_READ | MSM_SUBMIT_BO_DUMP); - } - if (pipelineBindPoint == VK_PIPELINE_BIND_POINT_COMPUTE) { cmd->state.compute_pipeline = pipeline; tu_cs_emit_state_ib(&cmd->cs, pipeline->program.state); @@ -2551,12 +2428,6 @@ tu_CmdExecuteCommands(VkCommandBuffer commandBuffer, for (uint32_t i = 0; i < commandBufferCount; i++) { TU_FROM_HANDLE(tu_cmd_buffer, secondary, pCmdBuffers[i]); - result = tu_bo_list_merge(&cmd->bo_list, &secondary->bo_list); - if (result != VK_SUCCESS) { - cmd->record_result = result; - break; - } - if (secondary->usage_flags & VK_COMMAND_BUFFER_USAGE_RENDER_PASS_CONTINUE_BIT) { assert(tu_cs_is_empty(&secondary->cs)); @@ -2582,11 +2453,6 @@ tu_CmdExecuteCommands(VkCommandBuffer commandBuffer, assert(tu_cs_is_empty(&secondary->draw_cs)); assert(tu_cs_is_empty(&secondary->draw_epilogue_cs)); - for (uint32_t j = 0; j < secondary->cs.bo_count; j++) { - tu_bo_list_add(&cmd->bo_list, secondary->cs.bos[j], - MSM_SUBMIT_BO_READ | MSM_SUBMIT_BO_DUMP); - } - tu_cs_add_entries(&cmd->cs, &secondary->cs); } @@ -2754,12 +2620,6 @@ tu_CmdBeginRenderPass(VkCommandBuffer commandBuffer, tu_set_input_attachments(cmd, cmd->state.subpass); - for (uint32_t i = 0; i < fb->attachment_count; ++i) { - const struct tu_image_view *iview = fb->attachments[i].attachment; - tu_bo_list_add(&cmd->bo_list, iview->image->bo, - MSM_SUBMIT_BO_READ | MSM_SUBMIT_BO_WRITE); - } - cmd->state.dirty |= TU_CMD_DIRTY_DRAW_STATE; } @@ -2982,8 +2842,6 @@ tu6_emit_tess_consts(struct tu_cmd_buffer *cmd, if (result != VK_SUCCESS) return result; - tu_bo_list_add(&cmd->bo_list, tess_bo, - MSM_SUBMIT_BO_READ | MSM_SUBMIT_BO_WRITE); uint64_t tess_factor_iova = tess_bo->iova; uint64_t tess_param_iova = tess_factor_iova + tess_factor_size; @@ -3339,8 +3197,6 @@ tu_CmdDrawIndirect(VkCommandBuffer commandBuffer, tu_cs_emit(cs, drawCount); tu_cs_emit_qw(cs, buf->bo->iova + buf->bo_offset + offset); tu_cs_emit(cs, stride); - - tu_bo_list_add(&cmd->bo_list, buf->bo, MSM_SUBMIT_BO_READ | MSM_SUBMIT_BO_DUMP); } void @@ -3370,8 +3226,6 @@ tu_CmdDrawIndexedIndirect(VkCommandBuffer commandBuffer, tu_cs_emit(cs, cmd->state.max_index_count); tu_cs_emit_qw(cs, buf->bo->iova + buf->bo_offset + offset); tu_cs_emit(cs, stride); - - tu_bo_list_add(&cmd->bo_list, buf->bo, MSM_SUBMIT_BO_READ | MSM_SUBMIT_BO_DUMP); } void @@ -3407,9 +3261,6 @@ tu_CmdDrawIndirectCount(VkCommandBuffer commandBuffer, tu_cs_emit_qw(cs, buf->bo->iova + buf->bo_offset + offset); tu_cs_emit_qw(cs, count_buf->bo->iova + count_buf->bo_offset + countBufferOffset); tu_cs_emit(cs, stride); - - tu_bo_list_add(&cmd->bo_list, buf->bo, MSM_SUBMIT_BO_READ | MSM_SUBMIT_BO_DUMP); - tu_bo_list_add(&cmd->bo_list, count_buf->bo, MSM_SUBMIT_BO_READ | MSM_SUBMIT_BO_DUMP); } void @@ -3442,9 +3293,6 @@ tu_CmdDrawIndexedIndirectCount(VkCommandBuffer commandBuffer, tu_cs_emit_qw(cs, buf->bo->iova + buf->bo_offset + offset); tu_cs_emit_qw(cs, count_buf->bo->iova + count_buf->bo_offset + countBufferOffset); tu_cs_emit(cs, stride); - - tu_bo_list_add(&cmd->bo_list, buf->bo, MSM_SUBMIT_BO_READ | MSM_SUBMIT_BO_DUMP); - tu_bo_list_add(&cmd->bo_list, count_buf->bo, MSM_SUBMIT_BO_READ | MSM_SUBMIT_BO_DUMP); } void tu_CmdDrawIndirectByteCountEXT(VkCommandBuffer commandBuffer, @@ -3476,8 +3324,6 @@ void tu_CmdDrawIndirectByteCountEXT(VkCommandBuffer commandBuffer, tu_cs_emit_qw(cs, buf->bo->iova + buf->bo_offset + counterBufferOffset); tu_cs_emit(cs, counterOffset); tu_cs_emit(cs, vertexStride); - - tu_bo_list_add(&cmd->bo_list, buf->bo, MSM_SUBMIT_BO_READ); } struct tu_dispatch_info @@ -3596,9 +3442,6 @@ tu_dispatch(struct tu_cmd_buffer *cmd, if (info->indirect) { uint64_t iova = tu_buffer_iova(info->indirect) + info->indirect_offset; - tu_bo_list_add(&cmd->bo_list, info->indirect->bo, - MSM_SUBMIT_BO_READ | MSM_SUBMIT_BO_WRITE); - tu_cs_emit_pkt7(cs, CP_EXEC_CS_INDIRECT, 4); tu_cs_emit(cs, 0x00000000); tu_cs_emit_qw(cs, iova); @@ -3770,8 +3613,6 @@ tu_barrier(struct tu_cmd_buffer *cmd, for (uint32_t i = 0; i < info->eventCount; i++) { TU_FROM_HANDLE(tu_event, event, info->pEvents[i]); - tu_bo_list_add(&cmd->bo_list, &event->bo, MSM_SUBMIT_BO_READ); - tu_cs_emit_pkt7(cs, CP_WAIT_REG_MEM, 6); tu_cs_emit(cs, CP_WAIT_REG_MEM_0_FUNCTION(WRITE_EQ) | CP_WAIT_REG_MEM_0_POLL_MEMORY); @@ -3817,8 +3658,6 @@ write_event(struct tu_cmd_buffer *cmd, struct tu_event *event, tu_emit_cache_flush(cmd, cs); - tu_bo_list_add(&cmd->bo_list, &event->bo, MSM_SUBMIT_BO_WRITE); - /* Flags that only require a top-of-pipe event. DrawIndirect parameters are * read by the CP, so the draw indirect stage counts as top-of-pipe too. */ @@ -3935,8 +3774,6 @@ tu_CmdBeginConditionalRenderingEXT(VkCommandBuffer commandBuffer, tu_cs_emit(cs, CP_DRAW_PRED_SET_0_SRC(PRED_SRC_MEM) | CP_DRAW_PRED_SET_0_TEST(inv ? EQ_0_PASS : NE_0_PASS)); tu_cs_emit_qw(cs, global_iova(cmd, predicate)); - - tu_bo_list_add(&cmd->bo_list, buf->bo, MSM_SUBMIT_BO_READ); } void diff --git a/src/freedreno/vulkan/tu_cs.c b/src/freedreno/vulkan/tu_cs.c index 809d511fa2b..e356b35cb2c 100644 --- a/src/freedreno/vulkan/tu_cs.c +++ b/src/freedreno/vulkan/tu_cs.c @@ -110,7 +110,7 @@ tu_cs_add_bo(struct tu_cs *cs, uint32_t size) return VK_ERROR_OUT_OF_HOST_MEMORY; VkResult result = - tu_bo_init_new(cs->device, new_bo, size * sizeof(uint32_t)); + tu_bo_init_new(cs->device, new_bo, size * sizeof(uint32_t), true); if (result != VK_SUCCESS) { free(new_bo); return result; diff --git a/src/freedreno/vulkan/tu_descriptor_set.c b/src/freedreno/vulkan/tu_descriptor_set.c index 1d2059ddc8b..a9b63399f9a 100644 --- a/src/freedreno/vulkan/tu_descriptor_set.c +++ b/src/freedreno/vulkan/tu_descriptor_set.c @@ -174,7 +174,6 @@ tu_CreateDescriptorSetLayout( set_layout->dynamic_ubo = 0; uint32_t dynamic_offset_count = 0; - uint32_t buffer_count = 0; for (uint32_t j = 0; j < pCreateInfo->bindingCount; j++) { const VkDescriptorSetLayoutBinding *binding = bindings + j; @@ -183,7 +182,6 @@ tu_CreateDescriptorSetLayout( set_layout->binding[b].type = binding->descriptorType; set_layout->binding[b].array_size = binding->descriptorCount; set_layout->binding[b].offset = set_layout->size; - set_layout->binding[b].buffer_offset = buffer_count; set_layout->binding[b].dynamic_offset_offset = dynamic_offset_count; set_layout->binding[b].size = descriptor_size(binding->descriptorType); set_layout->binding[b].shader_stages = binding->stageFlags; @@ -234,9 +232,6 @@ tu_CreateDescriptorSetLayout( set_layout->size += binding->descriptorCount * set_layout->binding[b].size; - if (binding->descriptorType != VK_DESCRIPTOR_TYPE_SAMPLER && - binding->descriptorType != VK_DESCRIPTOR_TYPE_INLINE_UNIFORM_BLOCK_EXT) - buffer_count += binding->descriptorCount; if (binding->descriptorType == VK_DESCRIPTOR_TYPE_STORAGE_BUFFER_DYNAMIC || binding->descriptorType == VK_DESCRIPTOR_TYPE_UNIFORM_BUFFER_DYNAMIC) { if (binding->descriptorType == VK_DESCRIPTOR_TYPE_UNIFORM_BUFFER_DYNAMIC) { @@ -254,7 +249,6 @@ tu_CreateDescriptorSetLayout( free(bindings); set_layout->dynamic_offset_count = dynamic_offset_count; - set_layout->buffer_count = buffer_count; *pSetLayout = tu_descriptor_set_layout_to_handle(set_layout); @@ -425,17 +419,7 @@ tu_descriptor_set_create(struct tu_device *device, struct tu_descriptor_set **out_set) { struct tu_descriptor_set *set; - uint32_t buffer_count = layout->buffer_count; - if (variable_count) { - unsigned stride = 1; - if (layout->binding[layout->binding_count - 1].type == VK_DESCRIPTOR_TYPE_SAMPLER || - layout->binding[layout->binding_count - 1].type == VK_DESCRIPTOR_TYPE_INLINE_UNIFORM_BLOCK_EXT) - stride = 0; - buffer_count = layout->binding[layout->binding_count - 1].buffer_offset + - *variable_count * stride; - } - unsigned dynamic_offset = sizeof(struct tu_descriptor_set) + - sizeof(struct tu_bo *) * buffer_count; + unsigned dynamic_offset = sizeof(struct tu_descriptor_set); unsigned mem_size = dynamic_offset + A6XX_TEX_CONST_DWORDS * 4 * layout->dynamic_offset_count; @@ -615,7 +599,7 @@ tu_CreateDescriptorPool(VkDevice _device, if (bo_size) { VkResult ret; - ret = tu_bo_init_new(device, &pool->bo, bo_size); + ret = tu_bo_init_new(device, &pool->bo, bo_size, true); assert(ret == VK_SUCCESS); ret = tu_bo_map(device, &pool->bo); @@ -741,17 +725,11 @@ tu_FreeDescriptorSets(VkDevice _device, static void write_texel_buffer_descriptor(struct tu_device *device, struct tu_cmd_buffer *cmd_buffer, unsigned *dst, - struct tu_bo **buffer_list, const VkBufferView buffer_view) { TU_FROM_HANDLE(tu_buffer_view, view, buffer_view); memcpy(dst, view->descriptor, sizeof(view->descriptor)); - - if (cmd_buffer) - tu_bo_list_add(&cmd_buffer->bo_list, view->buffer->bo, MSM_SUBMIT_BO_READ); - else - *buffer_list = view->buffer->bo; } static uint32_t get_range(struct tu_buffer *buf, VkDeviceSize offset, @@ -767,7 +745,6 @@ static uint32_t get_range(struct tu_buffer *buf, VkDeviceSize offset, static void write_buffer_descriptor(struct tu_device *device, struct tu_cmd_buffer *cmd_buffer, unsigned *dst, - struct tu_bo **buffer_list, const VkDescriptorBufferInfo *buffer_info) { TU_FROM_HANDLE(tu_buffer, buffer, buffer_info->buffer); @@ -785,17 +762,11 @@ static void write_buffer_descriptor(struct tu_device *device, dst[5] = A6XX_IBO_5_BASE_HI(va >> 32); for (int i = 6; i < A6XX_TEX_CONST_DWORDS; i++) dst[i] = 0; - - if (cmd_buffer) - tu_bo_list_add(&cmd_buffer->bo_list, buffer->bo, MSM_SUBMIT_BO_READ); - else - *buffer_list = buffer->bo; } static void write_ubo_descriptor(struct tu_device *device, struct tu_cmd_buffer *cmd_buffer, unsigned *dst, - struct tu_bo **buffer_list, const VkDescriptorBufferInfo *buffer_info) { TU_FROM_HANDLE(tu_buffer, buffer, buffer_info->buffer); @@ -806,18 +777,12 @@ static void write_ubo_descriptor(struct tu_device *device, uint64_t va = tu_buffer_iova(buffer) + buffer_info->offset; dst[0] = A6XX_UBO_0_BASE_LO(va); dst[1] = A6XX_UBO_1_BASE_HI(va >> 32) | A6XX_UBO_1_SIZE(range); - - if (cmd_buffer) - tu_bo_list_add(&cmd_buffer->bo_list, buffer->bo, MSM_SUBMIT_BO_READ); - else - *buffer_list = buffer->bo; } static void write_image_descriptor(struct tu_device *device, struct tu_cmd_buffer *cmd_buffer, unsigned *dst, - struct tu_bo **buffer_list, VkDescriptorType descriptor_type, const VkDescriptorImageInfo *image_info) { @@ -828,11 +793,6 @@ write_image_descriptor(struct tu_device *device, } else { memcpy(dst, iview->descriptor, sizeof(iview->descriptor)); } - - if (cmd_buffer) - tu_bo_list_add(&cmd_buffer->bo_list, iview->image->bo, MSM_SUBMIT_BO_READ); - else - *buffer_list = iview->image->bo; } static void @@ -840,14 +800,13 @@ write_combined_image_sampler_descriptor(struct tu_device *device, struct tu_cmd_buffer *cmd_buffer, unsigned sampler_offset, unsigned *dst, - struct tu_bo **buffer_list, VkDescriptorType descriptor_type, const VkDescriptorImageInfo *image_info, bool has_sampler) { TU_FROM_HANDLE(tu_sampler, sampler, image_info->sampler); - write_image_descriptor(device, cmd_buffer, dst, buffer_list, + write_image_descriptor(device, cmd_buffer, dst, descriptor_type, image_info); /* copy over sampler state */ if (has_sampler) { @@ -882,13 +841,10 @@ tu_update_descriptor_sets(struct tu_device *device, const struct tu_descriptor_set_binding_layout *binding_layout = set->layout->binding + writeset->dstBinding; uint32_t *ptr = set->mapped_ptr; - struct tu_bo **buffer_list = set->buffers; ptr += binding_layout->offset / 4; ptr += (binding_layout->size / 4) * writeset->dstArrayElement; - buffer_list += binding_layout->buffer_offset; - buffer_list += writeset->dstArrayElement; for (j = 0; j < writeset->descriptorCount; ++j) { switch(writeset->descriptorType) { case VK_DESCRIPTOR_TYPE_UNIFORM_BUFFER_DYNAMIC: { @@ -897,12 +853,11 @@ tu_update_descriptor_sets(struct tu_device *device, idx += binding_layout->dynamic_offset_offset; write_ubo_descriptor(device, cmd_buffer, set->dynamic_descriptors + A6XX_TEX_CONST_DWORDS * idx, - buffer_list, writeset->pBufferInfo + j); + writeset->pBufferInfo + j); break; } case VK_DESCRIPTOR_TYPE_UNIFORM_BUFFER: - write_ubo_descriptor(device, cmd_buffer, ptr, buffer_list, - writeset->pBufferInfo + j); + write_ubo_descriptor(device, cmd_buffer, ptr, writeset->pBufferInfo + j); break; case VK_DESCRIPTOR_TYPE_STORAGE_BUFFER_DYNAMIC: { assert(!(set->layout->flags & VK_DESCRIPTOR_SET_LAYOUT_CREATE_PUSH_DESCRIPTOR_BIT_KHR)); @@ -910,28 +865,26 @@ tu_update_descriptor_sets(struct tu_device *device, idx += binding_layout->dynamic_offset_offset; write_buffer_descriptor(device, cmd_buffer, set->dynamic_descriptors + A6XX_TEX_CONST_DWORDS * idx, - buffer_list, writeset->pBufferInfo + j); + writeset->pBufferInfo + j); break; } case VK_DESCRIPTOR_TYPE_STORAGE_BUFFER: - write_buffer_descriptor(device, cmd_buffer, ptr, buffer_list, - writeset->pBufferInfo + j); + write_buffer_descriptor(device, cmd_buffer, ptr, writeset->pBufferInfo + j); break; case VK_DESCRIPTOR_TYPE_UNIFORM_TEXEL_BUFFER: case VK_DESCRIPTOR_TYPE_STORAGE_TEXEL_BUFFER: - write_texel_buffer_descriptor(device, cmd_buffer, ptr, buffer_list, - writeset->pTexelBufferView[j]); + write_texel_buffer_descriptor(device, cmd_buffer, ptr, writeset->pTexelBufferView[j]); break; case VK_DESCRIPTOR_TYPE_SAMPLED_IMAGE: case VK_DESCRIPTOR_TYPE_STORAGE_IMAGE: - write_image_descriptor(device, cmd_buffer, ptr, buffer_list, + write_image_descriptor(device, cmd_buffer, ptr, writeset->descriptorType, writeset->pImageInfo + j); break; case VK_DESCRIPTOR_TYPE_COMBINED_IMAGE_SAMPLER: write_combined_image_sampler_descriptor(device, cmd_buffer, A6XX_TEX_CONST_DWORDS * 4, - ptr, buffer_list, + ptr, writeset->descriptorType, writeset->pImageInfo + j, !binding_layout->immutable_samplers_offset); @@ -947,7 +900,6 @@ tu_update_descriptor_sets(struct tu_device *device, break; } ptr += binding_layout->size / 4; - ++buffer_list; } } @@ -963,8 +915,6 @@ tu_update_descriptor_sets(struct tu_device *device, dst_set->layout->binding + copyset->dstBinding; uint32_t *src_ptr = src_set->mapped_ptr; uint32_t *dst_ptr = dst_set->mapped_ptr; - struct tu_bo **src_buffer_list = src_set->buffers; - struct tu_bo **dst_buffer_list = dst_set->buffers; src_ptr += src_binding_layout->offset / 4; dst_ptr += dst_binding_layout->offset / 4; @@ -972,12 +922,6 @@ tu_update_descriptor_sets(struct tu_device *device, src_ptr += src_binding_layout->size * copyset->srcArrayElement / 4; dst_ptr += dst_binding_layout->size * copyset->dstArrayElement / 4; - src_buffer_list += src_binding_layout->buffer_offset; - src_buffer_list += copyset->srcArrayElement; - - dst_buffer_list += dst_binding_layout->buffer_offset; - dst_buffer_list += copyset->dstArrayElement; - for (j = 0; j < copyset->descriptorCount; ++j) { switch (src_binding_layout->type) { case VK_DESCRIPTOR_TYPE_UNIFORM_BUFFER_DYNAMIC: @@ -999,11 +943,6 @@ tu_update_descriptor_sets(struct tu_device *device, src_ptr += src_binding_layout->size / 4; dst_ptr += dst_binding_layout->size / 4; - - if (src_binding_layout->type != VK_DESCRIPTOR_TYPE_SAMPLER) { - /* Sampler descriptors don't have a buffer list. */ - dst_buffer_list[j] = src_buffer_list[j]; - } } } } @@ -1060,8 +999,6 @@ tu_CreateDescriptorUpdateTemplate( const struct tu_descriptor_set_binding_layout *binding_layout = set_layout->binding + entry->dstBinding; - const uint32_t buffer_offset = binding_layout->buffer_offset + - entry->dstArrayElement; uint32_t dst_offset, dst_stride; /* dst_offset is an offset into dynamic_descriptors when the descriptor @@ -1087,7 +1024,6 @@ tu_CreateDescriptorUpdateTemplate( .src_stride = entry->stride, .dst_offset = dst_offset, .dst_stride = dst_stride, - .buffer_offset = buffer_offset, .has_sampler = !binding_layout->immutable_samplers_offset, }; } @@ -1128,41 +1064,36 @@ tu_update_descriptor_set_with_template( for (uint32_t i = 0; i < templ->entry_count; i++) { uint32_t *ptr = set->mapped_ptr; const void *src = ((const char *) pData) + templ->entry[i].src_offset; - struct tu_bo **buffer_list = set->buffers; ptr += templ->entry[i].dst_offset; - buffer_list += templ->entry[i].buffer_offset; unsigned dst_offset = templ->entry[i].dst_offset; for (unsigned j = 0; j < templ->entry[i].descriptor_count; ++j) { switch(templ->entry[i].descriptor_type) { case VK_DESCRIPTOR_TYPE_UNIFORM_BUFFER_DYNAMIC: { assert(!(set->layout->flags & VK_DESCRIPTOR_SET_LAYOUT_CREATE_PUSH_DESCRIPTOR_BIT_KHR)); write_ubo_descriptor(device, cmd_buffer, - set->dynamic_descriptors + dst_offset, - buffer_list, src); + set->dynamic_descriptors + dst_offset, src); break; } case VK_DESCRIPTOR_TYPE_UNIFORM_BUFFER: - write_ubo_descriptor(device, cmd_buffer, ptr, buffer_list, src); + write_ubo_descriptor(device, cmd_buffer, ptr, src); break; case VK_DESCRIPTOR_TYPE_STORAGE_BUFFER_DYNAMIC: { assert(!(set->layout->flags & VK_DESCRIPTOR_SET_LAYOUT_CREATE_PUSH_DESCRIPTOR_BIT_KHR)); write_buffer_descriptor(device, cmd_buffer, - set->dynamic_descriptors + dst_offset, - buffer_list, src); + set->dynamic_descriptors + dst_offset, src); break; } case VK_DESCRIPTOR_TYPE_STORAGE_BUFFER: - write_buffer_descriptor(device, cmd_buffer, ptr, buffer_list, src); + write_buffer_descriptor(device, cmd_buffer, ptr, src); break; case VK_DESCRIPTOR_TYPE_UNIFORM_TEXEL_BUFFER: case VK_DESCRIPTOR_TYPE_STORAGE_TEXEL_BUFFER: - write_texel_buffer_descriptor(device, cmd_buffer, ptr, - buffer_list, *(VkBufferView *) src); + write_texel_buffer_descriptor(device, cmd_buffer, ptr, *(VkBufferView *) src); break; case VK_DESCRIPTOR_TYPE_SAMPLED_IMAGE: case VK_DESCRIPTOR_TYPE_STORAGE_IMAGE: { - write_image_descriptor(device, cmd_buffer, ptr, buffer_list, + write_image_descriptor(device, cmd_buffer, ptr, templ->entry[i].descriptor_type, src); break; @@ -1170,7 +1101,7 @@ tu_update_descriptor_set_with_template( case VK_DESCRIPTOR_TYPE_COMBINED_IMAGE_SAMPLER: write_combined_image_sampler_descriptor(device, cmd_buffer, A6XX_TEX_CONST_DWORDS * 4, - ptr, buffer_list, + ptr, templ->entry[i].descriptor_type, src, templ->entry[i].has_sampler); @@ -1188,7 +1119,6 @@ tu_update_descriptor_set_with_template( src = (char *) src + templ->entry[i].src_stride; ptr += templ->entry[i].dst_stride; dst_offset += templ->entry[i].dst_stride; - ++buffer_list; } } } diff --git a/src/freedreno/vulkan/tu_descriptor_set.h b/src/freedreno/vulkan/tu_descriptor_set.h index ba0e57d7faa..56d94566158 100644 --- a/src/freedreno/vulkan/tu_descriptor_set.h +++ b/src/freedreno/vulkan/tu_descriptor_set.h @@ -43,11 +43,6 @@ struct tu_descriptor_set_binding_layout uint32_t offset; - /* For descriptors that point to a buffer, index into the array of BO's to - * be added to the cmdbuffer's used BO list. - */ - uint32_t buffer_offset; - /* Index into the pDynamicOffsets array for dynamic descriptors, as well as * the array of dynamic descriptors (offsetted by * tu_pipeline_layout::set::dynamic_offset_start). @@ -90,8 +85,6 @@ struct tu_descriptor_set_layout */ uint32_t dynamic_ubo; - uint32_t buffer_count; - bool has_immutable_samplers; bool has_variable_descriptors; diff --git a/src/freedreno/vulkan/tu_device.c b/src/freedreno/vulkan/tu_device.c index 3a7b458ea4f..ac5c95cbd48 100644 --- a/src/freedreno/vulkan/tu_device.c +++ b/src/freedreno/vulkan/tu_device.c @@ -1046,6 +1046,8 @@ tu_CreateDevice(VkPhysicalDevice physicalDevice, device->physical_device = physical_device; device->_lost = false; + mtx_init(&device->bo_mutex, mtx_plain); + for (uint32_t i = 0; i < pCreateInfo->enabledExtensionCount; i++) { const char *ext_name = pCreateInfo->ppEnabledExtensionNames[i]; int index = tu_get_device_extension_index(ext_name); @@ -1096,7 +1098,7 @@ tu_CreateDevice(VkPhysicalDevice physicalDevice, if (custom_border_colors) global_size += TU_BORDER_COLOR_COUNT * sizeof(struct bcolor_entry); - result = tu_bo_init_new(device, &device->global_bo, global_size); + result = tu_bo_init_new(device, &device->global_bo, global_size, false); if (result != VK_SUCCESS) goto fail_global_bo; @@ -1189,6 +1191,8 @@ tu_DestroyDevice(VkDevice _device, const VkAllocationCallbacks *pAllocator) VkPipelineCache pc = tu_pipeline_cache_to_handle(device->mem_cache); tu_DestroyPipelineCache(tu_device_to_handle(device), pc, NULL); + vk_free(&device->vk.alloc, device->bo_list); + vk_free(&device->vk.alloc, device->bo_idx); vk_free(&device->vk.alloc, device); } @@ -1246,7 +1250,7 @@ tu_get_scratch_bo(struct tu_device *dev, uint64_t size, struct tu_bo **bo) } unsigned bo_size = 1ull << size_log2; - VkResult result = tu_bo_init_new(dev, &dev->scratch_bos[index].bo, bo_size); + VkResult result = tu_bo_init_new(dev, &dev->scratch_bos[index].bo, bo_size, false); if (result != VK_SUCCESS) { mtx_unlock(&dev->scratch_bos[index].construct_mtx); return result; @@ -1469,7 +1473,7 @@ tu_alloc_memory(struct tu_device *device, } } else { result = - tu_bo_init_new(device, &mem->bo, pAllocateInfo->allocationSize); + tu_bo_init_new(device, &mem->bo, pAllocateInfo->allocationSize, false); } if (result != VK_SUCCESS) { @@ -1738,7 +1742,7 @@ tu_CreateEvent(VkDevice _device, if (!event) return vk_error(device->instance, VK_ERROR_OUT_OF_HOST_MEMORY); - VkResult result = tu_bo_init_new(device, &event->bo, 0x1000); + VkResult result = tu_bo_init_new(device, &event->bo, 0x1000, false); if (result != VK_SUCCESS) goto fail_alloc; diff --git a/src/freedreno/vulkan/tu_drm.c b/src/freedreno/vulkan/tu_drm.c index 799421434c1..875b0809fad 100644 --- a/src/freedreno/vulkan/tu_drm.c +++ b/src/freedreno/vulkan/tu_drm.c @@ -145,7 +145,8 @@ static VkResult tu_bo_init(struct tu_device *dev, struct tu_bo *bo, uint32_t gem_handle, - uint64_t size) + uint64_t size, + bool dump) { uint64_t iova = tu_gem_info(dev, gem_handle, MSM_INFO_GET_IOVA); if (!iova) { @@ -159,11 +160,53 @@ tu_bo_init(struct tu_device *dev, .iova = iova, }; + mtx_lock(&dev->bo_mutex); + uint32_t idx = dev->bo_count++; + + /* grow the bo list if needed */ + if (idx >= dev->bo_list_size) { + uint32_t new_len = idx + 64; + struct drm_msm_gem_submit_bo *new_ptr = + vk_realloc(&dev->vk.alloc, dev->bo_list, new_len * sizeof(*dev->bo_list), + 8, VK_SYSTEM_ALLOCATION_SCOPE_DEVICE); + if (!new_ptr) { + tu_gem_close(dev, gem_handle); + return VK_ERROR_OUT_OF_HOST_MEMORY; + } + + dev->bo_list = new_ptr; + dev->bo_list_size = new_len; + } + + /* grow the "bo idx" list (maps gem handles to index in the bo list) */ + if (bo->gem_handle >= dev->bo_idx_size) { + uint32_t new_len = bo->gem_handle + 256; + uint32_t *new_ptr = + vk_realloc(&dev->vk.alloc, dev->bo_idx, new_len * sizeof(*dev->bo_idx), + 8, VK_SYSTEM_ALLOCATION_SCOPE_DEVICE); + if (!new_ptr) { + tu_gem_close(dev, gem_handle); + return VK_ERROR_OUT_OF_HOST_MEMORY; + } + + dev->bo_idx = new_ptr; + dev->bo_idx_size = new_len; + } + + dev->bo_idx[bo->gem_handle] = idx; + dev->bo_list[idx] = (struct drm_msm_gem_submit_bo) { + .flags = MSM_SUBMIT_BO_READ | MSM_SUBMIT_BO_WRITE | + COND(dump, MSM_SUBMIT_BO_DUMP), + .handle = gem_handle, + .presumed = iova, + }; + mtx_unlock(&dev->bo_mutex); + return VK_SUCCESS; } VkResult -tu_bo_init_new(struct tu_device *dev, struct tu_bo *bo, uint64_t size) +tu_bo_init_new(struct tu_device *dev, struct tu_bo *bo, uint64_t size, bool dump) { /* TODO: Choose better flags. As of 2018-11-12, freedreno/drm/msm_bo.c * always sets `flags = MSM_BO_WC`, and we copy that behavior here. @@ -178,7 +221,7 @@ tu_bo_init_new(struct tu_device *dev, struct tu_bo *bo, uint64_t size) if (ret) return vk_error(dev->instance, VK_ERROR_OUT_OF_DEVICE_MEMORY); - return tu_bo_init(dev, bo, req.handle, size); + return tu_bo_init(dev, bo, req.handle, size, dump); } VkResult @@ -199,7 +242,7 @@ tu_bo_init_dmabuf(struct tu_device *dev, if (ret) return vk_error(dev->instance, VK_ERROR_INVALID_EXTERNAL_HANDLE); - return tu_bo_init(dev, bo, gem_handle, size); + return tu_bo_init(dev, bo, gem_handle, size, false); } int @@ -240,6 +283,13 @@ tu_bo_finish(struct tu_device *dev, struct tu_bo *bo) if (bo->map) munmap(bo->map, bo->size); + mtx_lock(&dev->bo_mutex); + uint32_t idx = dev->bo_idx[bo->gem_handle]; + dev->bo_count--; + dev->bo_list[idx] = dev->bo_list[dev->bo_count]; + dev->bo_idx[dev->bo_list[idx].handle] = idx; + mtx_unlock(&dev->bo_mutex); + tu_gem_close(dev, bo->gem_handle); } @@ -659,8 +709,6 @@ tu_QueueSubmit(VkQueue _queue, const bool last_submit = (i == submitCount - 1); struct drm_msm_gem_submit_syncobj *in_syncobjs = NULL, *out_syncobjs = NULL; uint32_t nr_in_syncobjs, nr_out_syncobjs; - struct tu_bo_list bo_list; - tu_bo_list_init(&bo_list); result = tu_get_semaphore_syncobjs(pSubmits[i].pWaitSemaphores, pSubmits[i].waitSemaphoreCount, @@ -685,6 +733,8 @@ tu_QueueSubmit(VkQueue _queue, entry_count += cmdbuf->cs.entry_count; } + mtx_lock(&queue->device->bo_mutex); + struct drm_msm_gem_submit_cmd cmds[entry_count]; uint32_t entry_idx = 0; for (uint32_t j = 0; j < submit->commandBufferCount; ++j) { @@ -693,16 +743,13 @@ tu_QueueSubmit(VkQueue _queue, for (unsigned i = 0; i < cs->entry_count; ++i, ++entry_idx) { cmds[entry_idx].type = MSM_SUBMIT_CMD_BUF; cmds[entry_idx].submit_idx = - tu_bo_list_add(&bo_list, cs->entries[i].bo, - MSM_SUBMIT_BO_READ | MSM_SUBMIT_BO_DUMP); + queue->device->bo_idx[cs->entries[i].bo->gem_handle]; cmds[entry_idx].submit_offset = cs->entries[i].offset; cmds[entry_idx].size = cs->entries[i].size; cmds[entry_idx].pad = 0; cmds[entry_idx].nr_relocs = 0; cmds[entry_idx].relocs = 0; } - - tu_bo_list_merge(&bo_list, &cmdbuf->bo_list); } uint32_t flags = MSM_PIPE_3D0; @@ -720,8 +767,8 @@ tu_QueueSubmit(VkQueue _queue, struct drm_msm_gem_submit req = { .flags = flags, .queueid = queue->msm_queue_id, - .bos = (uint64_t)(uintptr_t) bo_list.bo_infos, - .nr_bos = bo_list.count, + .bos = (uint64_t)(uintptr_t) queue->device->bo_list, + .nr_bos = queue->device->bo_count, .cmds = (uint64_t)(uintptr_t)cmds, .nr_cmds = entry_count, .in_syncobjs = (uint64_t)(uintptr_t)in_syncobjs, @@ -741,7 +788,7 @@ tu_QueueSubmit(VkQueue _queue, strerror(errno)); } - tu_bo_list_destroy(&bo_list); + mtx_unlock(&queue->device->bo_mutex); free(in_syncobjs); free(out_syncobjs); diff --git a/src/freedreno/vulkan/tu_private.h b/src/freedreno/vulkan/tu_private.h index 0a70b58fbdc..2902050662a 100644 --- a/src/freedreno/vulkan/tu_private.h +++ b/src/freedreno/vulkan/tu_private.h @@ -407,6 +407,13 @@ struct tu_device uint32_t vsc_prim_strm_pitch; BITSET_DECLARE(custom_border_color, TU_BORDER_COLOR_COUNT); mtx_t mutex; + + /* bo list for submits: */ + struct drm_msm_gem_submit_bo *bo_list; + /* map bo handles to bo list index: */ + uint32_t *bo_idx; + uint32_t bo_count, bo_list_size, bo_idx_size; + mtx_t bo_mutex; }; VkResult _tu_device_set_lost(struct tu_device *device, @@ -422,7 +429,7 @@ tu_device_is_lost(struct tu_device *device) } VkResult -tu_bo_init_new(struct tu_device *dev, struct tu_bo *bo, uint64_t size); +tu_bo_init_new(struct tu_device *dev, struct tu_bo *bo, uint64_t size, bool dump); VkResult tu_bo_init_dmabuf(struct tu_device *dev, struct tu_bo *bo, @@ -588,8 +595,6 @@ struct tu_descriptor_set uint32_t *mapped_ptr; uint32_t *dynamic_descriptors; - - struct tu_bo *buffers[0]; }; struct tu_push_descriptor_set @@ -928,40 +933,6 @@ enum tu_cmd_buffer_status TU_CMD_BUFFER_STATUS_PENDING, }; -#ifndef MSM_SUBMIT_BO_READ -#define MSM_SUBMIT_BO_READ 0x0001 -#define MSM_SUBMIT_BO_WRITE 0x0002 -#define MSM_SUBMIT_BO_DUMP 0x0004 - -struct drm_msm_gem_submit_bo { - uint32_t flags; /* in, mask of MSM_SUBMIT_BO_x */ - uint32_t handle; /* in, GEM handle */ - uint64_t presumed; /* in/out, presumed buffer address */ -}; -#endif - -struct tu_bo_list -{ - uint32_t count; - uint32_t capacity; - struct drm_msm_gem_submit_bo *bo_infos; -}; - -#define TU_BO_LIST_FAILED (~0) - -void -tu_bo_list_init(struct tu_bo_list *list); -void -tu_bo_list_destroy(struct tu_bo_list *list); -void -tu_bo_list_reset(struct tu_bo_list *list); -uint32_t -tu_bo_list_add(struct tu_bo_list *list, - const struct tu_bo *bo, - uint32_t flags); -VkResult -tu_bo_list_merge(struct tu_bo_list *list, const struct tu_bo_list *other); - struct tu_cmd_buffer { struct vk_object_base base; @@ -986,7 +957,6 @@ struct tu_cmd_buffer VkResult record_result; - struct tu_bo_list bo_list; struct tu_cs cs; struct tu_cs draw_cs; struct tu_cs draw_epilogue_cs; diff --git a/src/freedreno/vulkan/tu_query.c b/src/freedreno/vulkan/tu_query.c index a19e7349384..083de39e574 100644 --- a/src/freedreno/vulkan/tu_query.c +++ b/src/freedreno/vulkan/tu_query.c @@ -168,7 +168,7 @@ tu_CreateQueryPool(VkDevice _device, return vk_error(device->instance, VK_ERROR_OUT_OF_HOST_MEMORY); VkResult result = tu_bo_init_new(device, &pool->bo, - pCreateInfo->queryCount * slot_size); + pCreateInfo->queryCount * slot_size, false); if (result != VK_SUCCESS) { vk_object_free(&device->vk, pAllocator, pool); return result; @@ -510,8 +510,6 @@ emit_copy_query_pool_results(struct tu_cmd_buffer *cmdbuf, result_count /* offset */, flags); } } - - tu_bo_list_add(&cmdbuf->bo_list, buffer->bo, MSM_SUBMIT_BO_WRITE); } void @@ -595,8 +593,6 @@ tu_CmdResetQueryPool(VkCommandBuffer commandBuffer, default: assert(!"Invalid query type"); } - - tu_bo_list_add(&cmdbuf->bo_list, &pool->bo, MSM_SUBMIT_BO_WRITE); } void @@ -713,8 +709,6 @@ tu_CmdBeginQuery(VkCommandBuffer commandBuffer, default: assert(!"Invalid query type"); } - - tu_bo_list_add(&cmdbuf->bo_list, &pool->bo, MSM_SUBMIT_BO_WRITE); } void @@ -735,8 +729,6 @@ tu_CmdBeginQueryIndexedEXT(VkCommandBuffer commandBuffer, default: assert(!"Invalid query type"); } - - tu_bo_list_add(&cmdbuf->bo_list, &pool->bo, MSM_SUBMIT_BO_WRITE); } static void @@ -976,8 +968,6 @@ tu_CmdEndQuery(VkCommandBuffer commandBuffer, } handle_multiview_queries(cmdbuf, pool, query); - - tu_bo_list_add(&cmdbuf->bo_list, &pool->bo, MSM_SUBMIT_BO_WRITE); } void @@ -998,8 +988,6 @@ tu_CmdEndQueryIndexedEXT(VkCommandBuffer commandBuffer, default: assert(!"Invalid query type"); } - - tu_bo_list_add(&cmdbuf->bo_list, &pool->bo, MSM_SUBMIT_BO_WRITE); } void @@ -1011,8 +999,6 @@ tu_CmdWriteTimestamp(VkCommandBuffer commandBuffer, TU_FROM_HANDLE(tu_cmd_buffer, cmd, commandBuffer); TU_FROM_HANDLE(tu_query_pool, pool, queryPool); - tu_bo_list_add(&cmd->bo_list, &pool->bo, MSM_SUBMIT_BO_WRITE); - /* Inside a render pass, just write the timestamp multiple times so that * the user gets the last one if we use GMEM. There isn't really much * better we can do, and this seems to be what the blob does too.