Program Listing for File D3D12DrawablePool.h

Return to documentation for file (Source\Azura\RenderSystem\Inc\D3D12\D3D12DrawablePool.h)

#pragma once
#include "Generic/Drawable.h"
#include "Log/Log.h"

#include "D3D12/D3D12Core.h"
#include "D3D12/D3D12ScopedPipeline.h"
#include "D3D12/D3D12Drawable.h"
#include "D3D12/D3D12ScopedBuffer.h"
#include "D3D12/D3D12ScopedCommandBuffer.h"
#include "D3D12/D3D12ScopedImage.h"
#include "D3D12/D3D12ScopedSampler.h"
#include "D3D12/D3D12ScopedRenderPass.h"


namespace Azura {
namespace D3D12 {

struct D3D12RenderPassRecordEntry
{
  ID3D12PipelineState* m_pso;
  ID3D12GraphicsCommandList* m_bundle;
  U32 m_poolIdx;
};

class D3D12DrawablePool : public DrawablePool {

public:
  D3D12DrawablePool(const Microsoft::WRL::ComPtr<ID3D12Device>& device,
                    const DrawablePoolCreateInfo& createInfo,
                    const DescriptorCount& descriptorCount,
                    const Containers::Vector<DescriptorSlot>& descriptorSlots,
                    const Containers::Vector<D3D12ScopedShader>& shaders,
                    const Containers::Vector<D3D12ScopedRenderPass>& renderPasses,
                    const Containers::Vector<D3D12ScopedBuffer>& gpuBuffers,
                    Microsoft::WRL::ComPtr<ID3D12CommandQueue> commandQueue,
                    Memory::Allocator& mainAllocator,
                    Memory::Allocator& initAllocator,
                    Log log);

  DrawableID CreateDrawable(const DrawableCreateInfo& createInfo) override;

  void BindVertexData(DrawableID drawableId, SlotID slot, const U8* buffer, U32 size) override;
  void BindVertexData(DrawableID drawableId, SlotID slot, U32 sourceBuffer, U32 offset, U32 size) override;
  void BindInstanceData(DrawableID drawableId, SlotID slot, const U8* buffer, U32 size) override;
  void BindUniformData(DrawableID drawableId, SlotID slot, const U8* buffer, U32 size) override;
  void SetIndexData(DrawableID drawableId, const U8* buffer, U32 size) override;
  void AddShader(U32 shaderId) override;
  void BindTextureData(SlotID slot, const TextureDesc& desc, const U8* buffer) override;
  void BindSampler(SlotID slot, const SamplerDesc& desc) override;
  void Submit() override;

  void BeginUpdates() override;
  void UpdateUniformData(DrawableID drawableId, SlotID slot, const U8* buffer, U32 size) override;
  void UpdateTextureData(SlotID slot, const U8* buffer) override;
  void UpdateVertexData(DrawableID drawableId, SlotID slot, const U8* buffer, U32 size) override;
  void UpdateInstanceData(DrawableID drawableId, SlotID slot, const U8* buffer, U32 size) override;
  void SubmitUpdates() override;

  const Containers::Vector<ID3D12DescriptorHeap*>& GetAllDescriptorHeaps() const;
  ID3D12PipelineState* GetPipelineState(U32 renderPassId) const;
  ID3D12GraphicsCommandList* GetSecondaryCommandList(U32 renderPassId) const;

  void GetRecordEntries(Containers::Vector<std::pair<U32, D3D12RenderPassRecordEntry>>& recordList) const;

private:
  void CreateRenderPassReferences(const DrawablePoolCreateInfo& createInfo, const Containers::Vector<D3D12ScopedRenderPass>& renderPasses);
  void CreateInputAttributes(const DrawablePoolCreateInfo& createInfo);
  void CreateDescriptorHeap(const DrawablePoolCreateInfo& createInfo);

  void SetTextureData(ID3D12GraphicsCommandList* oneTimeCommandList);
  void SetSamplerData();

  void CreateRenderPassInputTargetSRV(const Containers::Vector<std::reference_wrapper<const D3D12ScopedImage>>& renderPassInputs, U32 offsetTillThis) const;

  Log log_D3D12RenderSystem;

  const Microsoft::WRL::ComPtr<ID3D12Device>& m_device;
  const Containers::Vector<DescriptorSlot>& m_globalDescriptorSlots;
  const Containers::Vector<D3D12ScopedShader>& m_shaders;

  Containers::Vector<D3D12ScopedPipeline> m_pipelines;
  Containers::Vector<D3D12Drawable> m_drawables;

  Containers::Vector<std::reference_wrapper<D3D12ScopedRenderPass>> m_renderPasses;
  Containers::Vector<std::reference_wrapper<const D3D12ScopedBuffer>> m_gpuBuffers;

  Microsoft::WRL::ComPtr<ID3D12CommandQueue> m_graphicsCommandQueue;

  D3D12PipelineFactory m_pipelineFactory;
  D3D12ScopedBuffer m_updateBuffer;
  D3D12ScopedBuffer m_stagingBuffer;
  D3D12ScopedBuffer m_mainBuffer;

  U32 m_descriptorsPerDrawable;

  U32 m_cbvSrvDescriptorElementSize{0};
  U32 m_samplerDescriptorElementSize{0};
  U32 m_offsetToDrawableHeap{0};
  U32 m_offsetToRenderPassInputs{0};

  Containers::Vector<D3D12ScopedImage> m_images;
  Containers::Vector<D3D12ScopedSampler> m_samplers;
  Containers::Vector<D3D12ScopedCommandBuffer> m_secondaryCommandBuffers;

  Microsoft::WRL::ComPtr<ID3D12DescriptorHeap> m_descriptorDrawableHeap;
  Microsoft::WRL::ComPtr<ID3D12DescriptorHeap> m_descriptorSamplerHeap;

  Containers::Vector<ID3D12DescriptorHeap*> m_allHeaps;
};

} // namespace D3D12
} // namespace Azura