// Copyright (C) 2021-2022, Dmitry Maluev (dmaluev@gmail.com). All rights reserved. #pragma once namespace verus::CGI { struct ShaderInclude : public ID3DInclude { public: virtual HRESULT STDMETHODCALLTYPE Open( D3D_INCLUDE_TYPE IncludeType, LPCSTR pFileName, LPCVOID pParentData, LPCVOID* ppData, UINT* pBytes) override; virtual HRESULT STDMETHODCALLTYPE Close(LPCVOID pData) override; }; VERUS_TYPEDEFS(ShaderInclude); class ShaderD3D12 : public BaseShader { public: enum SET_MOD { SET_MOD_TO_VIEW_HEAP = 0x10000 }; struct Compiled { ComPtr _pBlobs[+Stage::count]; String _entry; int _stageCount = 0; }; VERUS_TYPEDEFS(Compiled); private: typedef Map TMapCompiled; struct DescriptorSetDesc { Vector _vSamplers; ComPtr _pConstantBuffer; D3D12MA::Allocation* _pMaAllocation = nullptr; DescriptorHeap _dhDynamicOffsets; BYTE* _pMappedData = nullptr; const void* _pSrc = nullptr; int _size = 0; int _alignedSize = 0; int _capacity = 1; int _capacityInBytes = 0; int _offset = 0; int _peakLoad = 0; int _index = 0; ShaderStageFlags _stageFlags = ShaderStageFlags::vs_fs; bool _staticSamplersOnly = true; }; struct ComplexSet { Vector _vTextures; DescriptorHeap _dhViews; DescriptorHeap _dhSamplers; HandlePair _hpBase; }; VERUS_TYPEDEFS(ComplexSet); TMapCompiled _mapCompiled; Vector _vDescriptorSetDesc; Vector _vComplexSets; ComPtr _pRootSignature; String _debugInfo; UINT64 _currentFrame = UINT64_MAX; bool _compute = false; public: ShaderD3D12(); virtual ~ShaderD3D12() override; virtual void Init(CSZ source, CSZ sourceName, CSZ* branches) override; virtual void Done() override; virtual void CreateDescriptorSet(int setNumber, const void* pSrc, int size, int capacity, std::initializer_list il, ShaderStageFlags stageFlags) override; virtual void CreatePipelineLayout() override; virtual CSHandle BindDescriptorSetTextures(int setNumber, std::initializer_list il, const int* pMipLevels, const int* pArrayLayers) override; virtual void FreeDescriptorSet(CSHandle& complexSetHandle) override; virtual void BeginBindDescriptors() override; virtual void EndBindDescriptors() override; // // D3D12 // RcCompiled GetCompiled(CSZ branch) const { return _mapCompiled.at(branch); } ID3D12RootSignature* GetD3DRootSignature() const { return _pRootSignature.Get(); } UINT ToRootParameterIndex(int setNumber) const; bool TryRootConstants(int setNumber, RBaseCommandBuffer cb) const; CD3DX12_GPU_DESCRIPTOR_HANDLE UpdateConstantBuffer(int setNumber, int complexSetHandle); CD3DX12_GPU_DESCRIPTOR_HANDLE UpdateSamplers(int setNumber, int complexSetHandle) const; int GetDescriptorSetCount() const { return static_cast(_vDescriptorSetDesc.size()); } bool IsCompute() const { return _compute; } void OnError(CSZ s) const; void UpdateDebugInfo( const Vector& vRootParams, const Vector& vStaticSamplers, D3D12_ROOT_SIGNATURE_FLAGS rootSignatureFlags); void UpdateUtilization() const; }; VERUS_TYPEDEFS(ShaderD3D12); }