Files
FlaxEngine/Source/Engine/GraphicsDevice/Vulkan/GPUShaderVulkan.h
Wojtek Figat 14902dc29e Merge remote-tracking branch 'origin/master' into 1.8
# Conflicts:
#	Flax.flaxproj
2024-02-26 19:49:39 +01:00

137 lines
3.8 KiB
C++

// Copyright (c) 2012-2024 Wojciech Figat. All rights reserved.
#pragma once
#if GRAPHICS_API_VULKAN
#include "Engine/Graphics/Shaders/GPUShader.h"
#include "Engine/Graphics/Shaders/GPUConstantBuffer.h"
#include "GPUDeviceVulkan.h"
#include "ResourceOwnerVulkan.h"
/// <summary>
/// The shared ring buffer for uniform buffers uploading for Vulkan backend.
/// </summary>
/// <seealso cref="GPUResourceVulkan{GPUResource}" />
/// <seealso cref="ResourceOwnerVulkan" />
class UniformBufferUploaderVulkan : public GPUResourceVulkan<GPUResource>, public ResourceOwnerVulkan
{
public:
struct Allocation
{
/// <summary>
/// The allocation offset from the GPU buffer begin (in bytes).
/// </summary>
uint64 Offset;
/// <summary>
/// The allocation size (in bytes).
/// </summary>
uint64 Size;
/// <summary>
/// The GPU buffer.
/// </summary>
VkBuffer Buffer;
/// <summary>
/// The CPU memory address to the mapped buffer data. Can be used to write the uniform buffer contents to upload them to GPU.
/// </summary>
byte* CPUAddress;
};
private:
VkBuffer _buffer;
VmaAllocation _allocation;
uint64 _size;
uint64 _offset;
uint32 _minAlignment;
byte* _mapped;
CmdBufferVulkan* _fenceCmdBuffer;
uint64 _fenceCounter;
public:
/// <summary>
/// Initializes a new instance of the <see cref="UniformBufferUploaderVulkan"/> class.
/// </summary>
/// <param name="device">The graphics device.</param>
UniformBufferUploaderVulkan(GPUDeviceVulkan* device);
public:
Allocation Allocate(uint64 size, uint32 alignment, GPUContextVulkan* context);
public:
// [GPUResourceVulkan]
GPUResourceType GetResourceType() const final override
{
return GPUResourceType::Buffer;
}
// [ResourceOwnerVulkan]
GPUResource* AsGPUResource() const override
{
return (GPUResource*)this;
}
protected:
// [GPUResourceVulkan]
void OnReleaseGPU() override;
};
/// <summary>
/// Constant Buffer for Vulkan backend.
/// </summary>
class GPUConstantBufferVulkan : public GPUResourceVulkan<GPUConstantBuffer>, public DescriptorOwnerResourceVulkan
{
public:
/// <summary>
/// Initializes a new instance of the <see cref="GPUConstantBufferVulkan"/> class.
/// </summary>
/// <param name="device">The graphics device.</param>
/// <param name="size">The buffer size (in bytes).</param>
GPUConstantBufferVulkan(GPUDeviceVulkan* device, uint32 size) noexcept
: GPUResourceVulkan(device, String::Empty)
{
_size = size;
}
public:
/// <summary>
/// The last uploaded data inside the shared uniforms uploading ring buffer.
/// </summary>
UniformBufferUploaderVulkan::Allocation Allocation;
public:
// [DescriptorOwnerResourceVulkan]
void DescriptorAsDynamicUniformBuffer(GPUContextVulkan* context, VkBuffer& buffer, VkDeviceSize& offset, VkDeviceSize& range, uint32& dynamicOffset) override
{
buffer = Allocation.Buffer;
offset = 0;
range = Allocation.Size;
dynamicOffset = (uint32)Allocation.Offset;
}
};
/// <summary>
/// Shader for Vulkan backend.
/// </summary>
class GPUShaderVulkan : public GPUResourceVulkan<GPUShader>
{
public:
/// <summary>
/// Initializes a new instance of the <see cref="GPUShaderVulkan"/> class.
/// </summary>
/// <param name="device">The device.</param>
/// <param name="name">The resource name.</param>
GPUShaderVulkan(GPUDeviceVulkan* device, const StringView& name)
: GPUResourceVulkan<GPUShader>(device, name)
{
}
protected:
// [GPUShader]
GPUShaderProgram* CreateGPUShaderProgram(ShaderStage type, const GPUShaderProgramInitializer& initializer, byte* cacheBytes, uint32 cacheSize, MemoryReadStream& stream) override;
};
#endif