diff --git a/src/nouveau/vulkan/nvk_cmd_buffer.c b/src/nouveau/vulkan/nvk_cmd_buffer.c index 8e01d56ecaa..3fc6f9c606a 100644 --- a/src/nouveau/vulkan/nvk_cmd_buffer.c +++ b/src/nouveau/vulkan/nvk_cmd_buffer.c @@ -152,19 +152,15 @@ nvk_cmd_buffer_resize_upload_buf(struct nvk_cmd_buffer *cmd, } VkResult -nvk_cmd_buffer_upload_alloc(struct nvk_cmd_buffer *cmd, uint32_t size, +nvk_cmd_buffer_upload_alloc(struct nvk_cmd_buffer *cmd, + uint32_t size, uint32_t alignment, uint64_t *addr, void **ptr) { assert(size % 4 == 0); - /* Align to the scalar cache line size if it results in this allocation - * being placed in less of them. - */ uint32_t offset = cmd->upload.offset; - uint32_t line_size = 256;//for compute dispatches - uint32_t gap = align(offset, line_size) - offset; - if ((size & ~(line_size - 1)) > gap) - offset = align(offset, line_size); + if (align > 0) + offset = align(offset, alignment); if (offset + size > cmd->upload.size) { if (!nvk_cmd_buffer_resize_upload_buf(cmd, size)) @@ -180,6 +176,23 @@ nvk_cmd_buffer_upload_alloc(struct nvk_cmd_buffer *cmd, uint32_t size, return VK_SUCCESS; } +VkResult +nvk_cmd_buffer_upload_data(struct nvk_cmd_buffer *cmd, + const void *data, uint32_t size, + uint32_t alignment, uint64_t *addr) +{ + VkResult result; + void *map; + + result = nvk_cmd_buffer_upload_alloc(cmd, size, alignment, addr, &map); + if (unlikely(result != VK_SUCCESS)) + return result; + + memcpy(map, data, size); + + return VK_SUCCESS; +} + VKAPI_ATTR VkResult VKAPI_CALL nvk_BeginCommandBuffer(VkCommandBuffer commandBuffer, const VkCommandBufferBeginInfo *pBeginInfo) diff --git a/src/nouveau/vulkan/nvk_cmd_buffer.h b/src/nouveau/vulkan/nvk_cmd_buffer.h index 0ff48f2991d..e7d02be391b 100644 --- a/src/nouveau/vulkan/nvk_cmd_buffer.h +++ b/src/nouveau/vulkan/nvk_cmd_buffer.h @@ -144,7 +144,11 @@ nvk_get_descriptors_state(struct nvk_cmd_buffer *cmd, }; VkResult nvk_cmd_buffer_upload_alloc(struct nvk_cmd_buffer *cmd, - uint32_t size, + uint32_t size, uint32_t alignment, uint64_t *addr, void **ptr); +VkResult nvk_cmd_buffer_upload_data(struct nvk_cmd_buffer *cmd, + const void *data, uint32_t size, + uint32_t alignment, uint64_t *addr); + #endif diff --git a/src/nouveau/vulkan/nvk_cmd_dispatch.c b/src/nouveau/vulkan/nvk_cmd_dispatch.c index 1b7db5c270c..1c5c647e491 100644 --- a/src/nouveau/vulkan/nvk_cmd_dispatch.c +++ b/src/nouveau/vulkan/nvk_cmd_dispatch.c @@ -76,37 +76,31 @@ nvk_CmdDispatch(VkCommandBuffer commandBuffer, desc->root.cs.grid_size[1] = groupCountY; desc->root.cs.grid_size[2] = groupCountZ; - uint32_t root_table_size = sizeof(desc->root); - void *root_table_map; uint64_t root_table_addr; - result = nvk_cmd_buffer_upload_alloc(cmd, root_table_size, - &root_table_addr, &root_table_map); + result = nvk_cmd_buffer_upload_data(cmd, &desc->root, sizeof(desc->root), + NVK_MIN_UBO_ALIGNMENT, + &root_table_addr); if (unlikely(result != VK_SUCCESS)) { vk_command_buffer_set_error(&cmd->vk, result); return; } - memcpy(root_table_map, &desc->root, sizeof(desc->root)); - uint32_t qmd[128]; memset(qmd, 0, sizeof(qmd)); memcpy(qmd, pipeline->qmd_template, sizeof(pipeline->qmd_template)); gv100_compute_setup_launch_desc(qmd, groupCountX, groupCountY, groupCountZ); - gp100_cp_launch_desc_set_cb(qmd, 0, root_table_size, root_table_addr); - gp100_cp_launch_desc_set_cb(qmd, 1, root_table_size, root_table_addr); + gp100_cp_launch_desc_set_cb(qmd, 0, sizeof(desc->root), root_table_addr); + gp100_cp_launch_desc_set_cb(qmd, 1, sizeof(desc->root), root_table_addr); uint64_t qmd_addr; - void *qmd_map; - result = nvk_cmd_buffer_upload_alloc(cmd, sizeof(qmd), &qmd_addr,&qmd_map); + result = nvk_cmd_buffer_upload_data(cmd, qmd, sizeof(qmd), 256, &qmd_addr); if (unlikely(result != VK_SUCCESS)) { vk_command_buffer_set_error(&cmd->vk, result); return; } - memcpy(qmd_map, qmd, sizeof(qmd)); - struct nv_push *p = P_SPACE(cmd->push, 6); P_MTHD(p, NVA0C0, INVALIDATE_SHADER_CACHES_NO_WFI); diff --git a/src/nouveau/vulkan/nvk_cmd_draw.c b/src/nouveau/vulkan/nvk_cmd_draw.c index e644b1dfff0..86c4b303928 100644 --- a/src/nouveau/vulkan/nvk_cmd_draw.c +++ b/src/nouveau/vulkan/nvk_cmd_draw.c @@ -1037,22 +1037,19 @@ nvk_flush_descriptors(struct nvk_cmd_buffer *cmd) const struct nvk_descriptor_state *desc = &cmd->state.gfx.descriptors; VkResult result; - uint32_t root_table_size = sizeof(desc->root); - void *root_table_map; uint64_t root_table_addr; - result = nvk_cmd_buffer_upload_alloc(cmd, root_table_size, - &root_table_addr, &root_table_map); + result = nvk_cmd_buffer_upload_data(cmd, &desc->root, sizeof(desc->root), + NVK_MIN_UBO_ALIGNMENT, + &root_table_addr); if (unlikely(result != VK_SUCCESS)) { vk_command_buffer_set_error(&cmd->vk, result); return; } - memcpy(root_table_map, &desc->root, sizeof(desc->root)); - struct nv_push *p = P_SPACE(cmd->push, 26); P_MTHD(p, NV9097, SET_CONSTANT_BUFFER_SELECTOR_A); - P_NV9097_SET_CONSTANT_BUFFER_SELECTOR_A(p, root_table_size); + P_NV9097_SET_CONSTANT_BUFFER_SELECTOR_A(p, sizeof(desc->root)); P_NV9097_SET_CONSTANT_BUFFER_SELECTOR_B(p, root_table_addr >> 32); P_NV9097_SET_CONSTANT_BUFFER_SELECTOR_C(p, root_table_addr); diff --git a/src/nouveau/vulkan/nvk_cmd_meta.c b/src/nouveau/vulkan/nvk_cmd_meta.c index 8899fa6450a..b48d6bc1fbb 100644 --- a/src/nouveau/vulkan/nvk_cmd_meta.c +++ b/src/nouveau/vulkan/nvk_cmd_meta.c @@ -15,7 +15,8 @@ nvk_cmd_bind_map_buffer(struct vk_command_buffer *vk_cmd, uint64_t addr; assert(buffer->vk.size < UINT_MAX); - result = nvk_cmd_buffer_upload_alloc(cmd, buffer->vk.size, &addr, map_out); + result = nvk_cmd_buffer_upload_alloc(cmd, buffer->vk.size, 16, + &addr, map_out); if (unlikely(result != VK_SUCCESS)) return result;