This patch adds initial support for compute shaders to the vulkan backend. As the development is oriented to the test- cases we have the implementation is limited to what is used there. It has been validated that with this patch that the following test cases are running as expected - `GPUVulkanTest.gpu_shader_compute_vbo` - `GPUVulkanTest.gpu_shader_compute_ibo` - `GPUVulkanTest.gpu_shader_compute_ssbo` - `GPUVulkanTest.gpu_storage_buffer_create_update_read` - `GPUVulkanTest.gpu_shader_compute_2d` This patch includes: - Allocating VkBuffer on device. - Uploading data from CPU to VkBuffer. - Binding VkBuffer as SSBO to a compute shader. - Execute compute shader and altering VkBuffer. - Download the VkBuffer to CPU ram. - Validate that it worked. - Use device only vertex buffer as SSBO - Use device only index buffer as SSBO - Use device only image buffers GHOST API has been changed as the original design was created before we even had support for compute shaders in blender. The function `GHOST_getVulkanBackbuffer` has been separated to retrieve the command buffer without a backbuffer (`GHOST_getVulkanCommandBuffer`). In order to do correct command buffer processing we needed access to the queue owned by GHOST. This is returned as part of the `GHOST_getVulkanHandles` function. Open topics (not considered part of this patch) - Memory barriers & command buffer encoding - Indirect compute dispatching - Rest of the test cases - Data conversions when requested data format is different than on device. - GPUVulkanTest.gpu_shader_compute_1d is supported on AMD devices. NVIDIA doesn't seem to support 1d textures. Pull-request: #104518
55 lines
1.8 KiB
C++
55 lines
1.8 KiB
C++
/* SPDX-License-Identifier: GPL-2.0-or-later
|
|
* Copyright 2023 Blender Foundation. All rights reserved. */
|
|
|
|
/** \file
|
|
* \ingroup gpu
|
|
*/
|
|
|
|
#pragma once
|
|
|
|
#include "vk_common.hh"
|
|
#include "vk_pipeline.hh"
|
|
|
|
namespace blender::gpu {
|
|
class VKBuffer;
|
|
class VKTexture;
|
|
|
|
/** Command buffer to keep track of the life-time of a command buffer.*/
|
|
class VKCommandBuffer : NonCopyable, NonMovable {
|
|
/** None owning handle to the command buffer and device. Handle is owned by `GHOST_ContextVK`.*/
|
|
VkDevice vk_device_ = VK_NULL_HANDLE;
|
|
VkCommandBuffer vk_command_buffer_ = VK_NULL_HANDLE;
|
|
VkQueue vk_queue_ = VK_NULL_HANDLE;
|
|
|
|
/** Owning handles */
|
|
VkFence vk_fence_ = VK_NULL_HANDLE;
|
|
|
|
public:
|
|
virtual ~VKCommandBuffer();
|
|
void init(const VkDevice vk_device, const VkQueue vk_queue, VkCommandBuffer vk_command_buffer);
|
|
void begin_recording();
|
|
void end_recording();
|
|
void bind(const VKPipeline &vk_pipeline, VkPipelineBindPoint bind_point);
|
|
void bind(const VKDescriptorSet &descriptor_set,
|
|
const VkPipelineLayout vk_pipeline_layout,
|
|
VkPipelineBindPoint bind_point);
|
|
void dispatch(int groups_x_len, int groups_y_len, int groups_z_len);
|
|
/* Copy the contents of a texture mip level to the dst buffer.*/
|
|
void copy(VKBuffer &dst_buffer, VKTexture &src_texture, Span<VkBufferImageCopy> regions);
|
|
void pipeline_barrier(VkPipelineStageFlags source_stages,
|
|
VkPipelineStageFlags destination_stages);
|
|
void pipeline_barrier(Span<VkImageMemoryBarrier> image_memory_barriers);
|
|
|
|
/**
|
|
* Stop recording commands, encode + send the recordings to Vulkan, wait for the until the
|
|
* commands have been executed and start the command buffer to accept recordings again.
|
|
*/
|
|
void submit();
|
|
|
|
private:
|
|
void encode_recorded_commands();
|
|
void submit_encoded_commands();
|
|
};
|
|
|
|
} // namespace blender::gpu
|