Skip to content
Merged
Show file tree
Hide file tree
Changes from all commits
Commits
File filter

Filter by extension

Filter by extension

Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
1 change: 1 addition & 0 deletions Editor/Include/Editor/EditorApplication.h
Original file line number Diff line number Diff line change
Expand Up @@ -49,6 +49,7 @@ namespace Editor {
float NextDeltaSeconds();

EditorApplicationDesc desc;
std::string imguiIniFilename;
Common::UniquePtr<EditorWindow> window;
Common::UniquePtr<EditorContext> context;
Common::UniquePtr<Runtime::Canvas> sceneRenderCanvas;
Expand Down
9 changes: 8 additions & 1 deletion Editor/Src/EditorApplication.cpp
Original file line number Diff line number Diff line change
Expand Up @@ -188,7 +188,14 @@ namespace Editor {
io.ConfigFlags |= ImGuiConfigFlags_DockingEnable;
io.BackendPlatformName = "ExplosionGLFW";
io.BackendRendererName = "ExplosionRHI";
io.IniFilename = "ExplosionEditor.ini";
if (desc.mode == EditorApplicationMode::editor) {
const Common::Path iniFilePath = Core::Paths::GameCacheDir() / "Editor" / "Layout" / "Main.ini";
iniFilePath.Parent().MakeDir();
imguiIniFilename = iniFilePath.String();
io.IniFilename = imguiIniFilename.c_str();
} else {
io.IniFilename = nullptr;
}
ImFontConfig defaultFontConfig;
defaultFontConfig.SizePixels = Internal::defaultFontSize;
io.FontDefault = io.Fonts->AddFontDefaultVector(&defaultFontConfig);
Expand Down
6 changes: 3 additions & 3 deletions Editor/Src/EditorWindow.cpp
Original file line number Diff line number Diff line change
Expand Up @@ -540,9 +540,9 @@ namespace Editor {

auto bindGroup = GetDevice().CreateBindGroup(
RHI::BindGroupCreateInfo(imguiBindGroupLayout.Get(), "imguiBindGroup")
.AddEntry(RHI::BindGroupEntry(imguiPixelShaderCompileOutput.reflectionData.QueryResourceBindingChecked("imageTex").second, &inTextureView))
.AddEntry(RHI::BindGroupEntry(imguiPixelShaderCompileOutput.reflectionData.QueryResourceBindingChecked("imageSampler").second, imguiImageSampler.Get()))
.AddEntry(RHI::BindGroupEntry(imguiVertexShaderCompileOutput.reflectionData.QueryResourceBindingChecked("passParams").second, imguiPassParamsBufferView.Get())));
.AddEntry(RHI::BindGroupEntry(imguiPixelShaderCompileOutput.reflectionData.QueryResourceBindingChecked("imageTex").second, RHI::ShaderStageBits::sPixel, &inTextureView))
.AddEntry(RHI::BindGroupEntry(imguiPixelShaderCompileOutput.reflectionData.QueryResourceBindingChecked("imageSampler").second, RHI::ShaderStageBits::sPixel, imguiImageSampler.Get()))
.AddEntry(RHI::BindGroupEntry(imguiVertexShaderCompileOutput.reflectionData.QueryResourceBindingChecked("passParams").second, RHI::ShaderStageBits::sVertex, imguiPassParamsBufferView.Get())));
auto* result = bindGroup.Get();
imguiFrameTextureBindGroups.emplace(&inTextureView, std::move(bindGroup));
return result;
Expand Down
10 changes: 8 additions & 2 deletions Engine/Source/RHI-DirectX12/Include/RHI/DirectX12/BindGroup.h
Original file line number Diff line number Diff line change
Expand Up @@ -14,20 +14,26 @@
namespace RHI::DirectX12 {
class DX12BindGroupLayout;

struct NativeBinding {
HlslBinding binding;
ShaderStageFlags shaderVisibility;
CD3DX12_CPU_DESCRIPTOR_HANDLE cpuDescriptorHandle;
};

class DX12BindGroup final : public BindGroup {
public:
NonCopyable(DX12BindGroup)
explicit DX12BindGroup(const BindGroupCreateInfo& inCreateInfo);
~DX12BindGroup() override;

DX12BindGroupLayout& GetBindGroupLayout() const;
const std::vector<std::pair<HlslBinding, CD3DX12_CPU_DESCRIPTOR_HANDLE>>& GetNativeBindings();
const std::vector<NativeBinding>& GetNativeBindings();

private:
void SaveBindGroupLayout(const BindGroupCreateInfo& inCreateInfo);
void CacheBindings(const BindGroupCreateInfo& inCreateInfo);

DX12BindGroupLayout* bindGroupLayout;
std::vector<std::pair<HlslBinding, CD3DX12_CPU_DESCRIPTOR_HANDLE>> nativeBindings;
std::vector<NativeBinding> nativeBindings;
};
}
Original file line number Diff line number Diff line change
Expand Up @@ -17,8 +17,9 @@ namespace RHI::DirectX12 {
BindingType bindingType;
uint8_t layoutIndex;
HlslBinding binding;
ShaderStageFlags shaderVisibility;

RootParameterKeyInfo(BindingType inBindingType, uint8_t inLayoutIndex, HlslBinding inBinding);
RootParameterKeyInfo(BindingType inBindingType, uint8_t inLayoutIndex, HlslBinding inBinding, ShaderStageFlags inShaderVisibility);
};

class DX12BindGroupLayout final : public BindGroupLayout {
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -20,6 +20,7 @@ namespace RHI::DirectX12 {
struct RootParameterKey {
uint8_t layoutIndex;
HlslBinding binding;
ShaderStageFlags shaderVisibility;

bool operator==(const RootParameterKey& inOther) const;
};
Expand All @@ -38,7 +39,10 @@ namespace RHI::DirectX12 {
DX12PipelineLayout(DX12Device& inDevice, const PipelineLayoutCreateInfo& inCreateInfo);
~DX12PipelineLayout() override;

std::optional<BindingTypeAndRootParameterIndex> QueryRootDescriptorParameterIndex(uint8_t inLayoutIndex, const HlslBinding& inBinding);
std::optional<BindingTypeAndRootParameterIndex> QueryRootDescriptorParameterIndex(
uint8_t inLayoutIndex,
const HlslBinding& inBinding,
ShaderStageFlags inShaderVisibility);
RootParameterIndex QueryRootConstantParameterIndex(uint32_t inPipelineConstantIndex) const;
ID3D12RootSignature* GetNative() const;

Expand Down
4 changes: 2 additions & 2 deletions Engine/Source/RHI-DirectX12/Src/BindGroup.cpp
Original file line number Diff line number Diff line change
Expand Up @@ -47,7 +47,7 @@ namespace RHI::DirectX12 {
return *bindGroupLayout;
}

const std::vector<std::pair<HlslBinding, CD3DX12_CPU_DESCRIPTOR_HANDLE>>& DX12BindGroup::GetNativeBindings()
const std::vector<NativeBinding>& DX12BindGroup::GetNativeBindings()
{
return nativeBindings;
}
Expand All @@ -65,7 +65,7 @@ namespace RHI::DirectX12 {
const auto& entry = inCreateInfo.entries[i];

CD3DX12_CPU_DESCRIPTOR_HANDLE handle = GetDescriptorCpuHandle(entry);
nativeBindings.emplace_back(std::get<HlslBinding>(entry.binding.platformBinding), handle);
nativeBindings.emplace_back(std::get<HlslBinding>(entry.binding.platformBinding), entry.shaderVisibility, handle);
}
}
}
9 changes: 7 additions & 2 deletions Engine/Source/RHI-DirectX12/Src/BindGroupLayout.cpp
Original file line number Diff line number Diff line change
Expand Up @@ -19,10 +19,15 @@ namespace RHI::DirectX12 {
}

namespace RHI::DirectX12 {
RootParameterKeyInfo::RootParameterKeyInfo(const BindingType inBindingType, const uint8_t inLayoutIndex, const HlslBinding inBinding)
RootParameterKeyInfo::RootParameterKeyInfo(
const BindingType inBindingType,
const uint8_t inLayoutIndex,
const HlslBinding inBinding,
const ShaderStageFlags inShaderVisibility)
: bindingType(inBindingType)
, layoutIndex(inLayoutIndex)
, binding(inBinding)
, shaderVisibility(inShaderVisibility)
{
}

Expand Down Expand Up @@ -64,7 +69,7 @@ namespace RHI::DirectX12 {
nativeDescriptorRanges.back().Init(EnumCast<HlslBindingRangeType, D3D12_DESCRIPTOR_RANGE_TYPE>(hlslBinding.rangeType), 1, hlslBinding.index, inCreateInfo.layoutIndex);
nativeRootParameters.back().InitAsDescriptorTable(1, &nativeDescriptorRanges.back(), GetShaderVisibility(entry.shaderVisibility));

rootParameterKeyInfos.emplace_back(entry.binding.type, inCreateInfo.layoutIndex, hlslBinding);
rootParameterKeyInfos.emplace_back(entry.binding.type, inCreateInfo.layoutIndex, hlslBinding, entry.shaderVisibility);
}
}
}
22 changes: 12 additions & 10 deletions Engine/Source/RHI-DirectX12/Src/CommandRecorder.cpp
Original file line number Diff line number Diff line change
Expand Up @@ -209,17 +209,18 @@ namespace RHI::DirectX12 {
void DX12ComputePassCommandRecorder::SetBindGroup(const uint8_t inLayoutIndex, BindGroup* inBindGroup)
{
auto* bindGroup = static_cast<DX12BindGroup*>(inBindGroup);
Assert(computePipeline && bindGroup);
const auto& bindGroupLayout = bindGroup->GetBindGroupLayout();
auto& pipelineLayout = computePipeline->GetPipelineLayout();

Assert(inLayoutIndex == bindGroupLayout.GetLayoutIndex());
Assert(computePipeline);

for (const auto& bindings= bindGroup->GetNativeBindings();
const auto& [hlslBinding, cpuDescriptorHandle] : bindings) {
std::optional<BindingTypeAndRootParameterIndex> t = pipelineLayout.QueryRootDescriptorParameterIndex(inLayoutIndex, hlslBinding);
for (const auto& bindings = bindGroup->GetNativeBindings();
const auto& [hlslBinding, shaderVisibility, cpuDescriptorHandle] : bindings) {
std::optional<BindingTypeAndRootParameterIndex> t = pipelineLayout.QueryRootDescriptorParameterIndex(inLayoutIndex, hlslBinding, shaderVisibility);
Assert(t.has_value());
if (!t.has_value()) {
return;
continue;
}
commandBuffer.GetNativeCmdList()->SetComputeRootDescriptorTable(t.value().second, commandBuffer.GetRuntimeDescriptorHeaps()->NewGpuDescriptorHandle(hlslBinding.rangeType, cpuDescriptorHandle));
}
Expand Down Expand Up @@ -317,17 +318,18 @@ namespace RHI::DirectX12 {
void DX12RasterPassCommandRecorder::SetBindGroup(const uint8_t inLayoutIndex, BindGroup* inBindGroup)
{
auto* bindGroup = static_cast<DX12BindGroup*>(inBindGroup);
Assert(rasterPipeline && bindGroup);
const auto& bindGroupLayout = bindGroup->GetBindGroupLayout();
auto& pipelineLayout = rasterPipeline->GetPipelineLayout();

Assert(inLayoutIndex == bindGroupLayout.GetLayoutIndex());
Assert(rasterPipeline);

for (const auto& bindings= bindGroup->GetNativeBindings();
const auto& [hlslBinding, cpuDescriptorHandle] : bindings) {
std::optional<BindingTypeAndRootParameterIndex> t = pipelineLayout.QueryRootDescriptorParameterIndex(inLayoutIndex, hlslBinding);
for (const auto& bindings = bindGroup->GetNativeBindings();
const auto& [hlslBinding, shaderVisibility, cpuDescriptorHandle] : bindings) {
std::optional<BindingTypeAndRootParameterIndex> t = pipelineLayout.QueryRootDescriptorParameterIndex(inLayoutIndex, hlslBinding, shaderVisibility);
Assert(t.has_value());
if (!t.has_value()) {
return;
continue;
}
commandBuffer.GetNativeCmdList()->SetGraphicsRootDescriptorTable(t.value().second, commandBuffer.GetRuntimeDescriptorHeaps()->NewGpuDescriptorHandle(hlslBinding.rangeType, cpuDescriptorHandle));
}
Expand Down
24 changes: 18 additions & 6 deletions Engine/Source/RHI-DirectX12/Src/PipelineLayout.cpp
Original file line number Diff line number Diff line change
Expand Up @@ -2,6 +2,7 @@
// Created by johnk on 11/3/2022.
//

#include <array>
#include <vector>

#include <directx/d3dx12.h>
Expand All @@ -16,12 +17,19 @@ namespace RHI::DirectX12 {
{
return layoutIndex == inOther.layoutIndex
&& binding.rangeType == inOther.binding.rangeType
&& binding.index == inOther.binding.index;
&& binding.index == inOther.binding.index
&& shaderVisibility == inOther.shaderVisibility;
}

size_t RootParameterKeyHashProvider::operator()(const RootParameterKey& inKey) const
{
return Common::HashUtils::CityHash(&inKey, sizeof(RootParameterKey));
const std::array values = {
inKey.layoutIndex,
static_cast<uint8_t>(inKey.binding.rangeType),
inKey.binding.index,
inKey.shaderVisibility.Value()
};
return Common::HashUtils::CityHash(values.data(), values.size());
}

DX12PipelineLayout::DX12PipelineLayout(DX12Device& inDevice, const PipelineLayoutCreateInfo& inCreateInfo) : PipelineLayout(inCreateInfo)
Expand All @@ -31,9 +39,12 @@ namespace RHI::DirectX12 {

DX12PipelineLayout::~DX12PipelineLayout() = default;

std::optional<BindingTypeAndRootParameterIndex> DX12PipelineLayout::QueryRootDescriptorParameterIndex(uint8_t inLayoutIndex, const HlslBinding& inBinding)
std::optional<BindingTypeAndRootParameterIndex> DX12PipelineLayout::QueryRootDescriptorParameterIndex(
const uint8_t inLayoutIndex,
const HlslBinding& inBinding,
const ShaderStageFlags inShaderVisibility)
{
const auto iter = rootParameterIndexMap.find(RootParameterKey {inLayoutIndex, inBinding });
const auto iter = rootParameterIndexMap.find(RootParameterKey { inLayoutIndex, inBinding, inShaderVisibility });
if (iter == rootParameterIndexMap.end()) {
return {};
}
Expand Down Expand Up @@ -67,8 +78,9 @@ namespace RHI::DirectX12 {
rootParameters.emplace_back(pendingRootParameters[j]);

const auto& keyInfo = keyInfos[j];
auto rootParameterKey = RootParameterKey { keyInfo.layoutIndex, keyInfo.binding };
rootParameterIndexMap[rootParameterKey] = { keyInfo.bindingType, index };
auto rootParameterKey = RootParameterKey { keyInfo.layoutIndex, keyInfo.binding, keyInfo.shaderVisibility };
const bool inserted = rootParameterIndexMap.emplace(rootParameterKey, BindingTypeAndRootParameterIndex { keyInfo.bindingType, index }).second;
Assert(inserted);
}
}
rootConstantParameterIndices.reserve(inCreateInfo.pipelineConstantLayouts.size());
Expand Down
6 changes: 5 additions & 1 deletion Engine/Source/RHI/Include/RHI/BindGroup.h
Original file line number Diff line number Diff line change
Expand Up @@ -18,9 +18,13 @@ namespace RHI {

struct BindGroupEntry {
ResourceBinding binding;
ShaderStageFlags shaderVisibility;
std::variant<Sampler*, BufferView*, TextureView*> entity;

BindGroupEntry(const ResourceBinding& inBinding, const std::variant<Sampler*, BufferView*, TextureView*>& inEntity);
BindGroupEntry(
const ResourceBinding& inBinding,
ShaderStageFlags inShaderVisibility,
const std::variant<Sampler*, BufferView*, TextureView*>& inEntity);
};

struct BindGroupCreateInfo {
Expand Down
6 changes: 5 additions & 1 deletion Engine/Source/RHI/Src/BindGroup.cpp
Original file line number Diff line number Diff line change
Expand Up @@ -7,8 +7,12 @@
#include <utility>

namespace RHI {
BindGroupEntry::BindGroupEntry(const ResourceBinding& inBinding, const std::variant<Sampler*, BufferView*, TextureView*>& inEntity)
BindGroupEntry::BindGroupEntry(
const ResourceBinding& inBinding,
const ShaderStageFlags inShaderVisibility,
const std::variant<Sampler*, BufferView*, TextureView*>& inEntity)
: binding(inBinding)
, shaderVisibility(inShaderVisibility)
, entity(inEntity)
{
}
Expand Down
1 change: 1 addition & 0 deletions Engine/Source/Render/Include/Render/RenderCache.h
Original file line number Diff line number Diff line change
Expand Up @@ -151,6 +151,7 @@ namespace Render {

const RHI::ResourceBinding* GetBinding(const std::string& name);
const RHI::ResourceBinding* GetBinding(const std::string& name, RHI::ShaderStageBits shaderStage) const;
const std::pair<RHI::ShaderStageFlags, RHI::ResourceBinding>* GetBindingInfo(const std::string& name) const;
RHI::BindGroupLayout* GetRHI() const;

private:
Expand Down
6 changes: 6 additions & 0 deletions Engine/Source/Render/Src/RenderCache.cpp
Original file line number Diff line number Diff line change
Expand Up @@ -434,6 +434,12 @@ namespace Render {
return &iter->second.second;
}

const std::pair<RHI::ShaderStageFlags, RHI::ResourceBinding>* BindGroupLayout::GetBindingInfo(const std::string& name) const
{
const auto iter = bindings.find(name);
return iter == bindings.end() ? nullptr : &iter->second;
}

RHI::BindGroupLayout* BindGroupLayout::GetRHI() const
{
return rhiHandle.Get();
Expand Down
11 changes: 6 additions & 5 deletions Engine/Source/Render/Src/RenderGraph.cpp
Original file line number Diff line number Diff line change
Expand Up @@ -954,23 +954,24 @@ namespace Render {
RHI::BindGroupCreateInfo createInfo(layout->GetRHI());

for (const auto& [name, item] : items) {
const auto* binding = layout->GetBinding(name);
Assert(binding != nullptr);
const auto* bindingInfo = layout->GetBindingInfo(name);
Assert(bindingInfo != nullptr);
const auto& [shaderVisibility, binding] = *bindingInfo;

if (item.type == RHI::BindingType::uniformBuffer || item.type == RHI::BindingType::storageBuffer || item.type == RHI::BindingType::rwStorageBuffer) {
auto* bufferView = std::get<RGBufferViewRef>(item.view);
if (!devirtualizedResourceViews.contains(bufferView)) {
devirtualizedResourceViews.emplace(std::make_pair(bufferView, ResourceViewCache::Get(device).GetOrCreate(GetRHI(bufferView->GetBuffer()), bufferView->desc)));
}
createInfo.AddEntry(RHI::BindGroupEntry(*binding, GetRHI(bufferView)));
createInfo.AddEntry(RHI::BindGroupEntry(binding, shaderVisibility, GetRHI(bufferView)));
} else if (item.type == RHI::BindingType::texture || item.type == RHI::BindingType::storageTexture || item.type == RHI::BindingType::rwStorageTexture) {
auto* textureView = std::get<RGTextureViewRef>(item.view);
if (!devirtualizedResourceViews.contains(textureView)) {
devirtualizedResourceViews.emplace(std::make_pair(textureView, ResourceViewCache::Get(device).GetOrCreate(GetRHI(textureView->GetTexture()), textureView->desc)));
}
createInfo.AddEntry(RHI::BindGroupEntry(*binding, GetRHI(textureView)));
createInfo.AddEntry(RHI::BindGroupEntry(binding, shaderVisibility, GetRHI(textureView)));
} else if (item.type == RHI::BindingType::sampler) {
createInfo.AddEntry(RHI::BindGroupEntry(*binding, std::get<RHI::Sampler*>(item.view)));
createInfo.AddEntry(RHI::BindGroupEntry(binding, shaderVisibility, std::get<RHI::Sampler*>(item.view)));
} else {
Unimplement();
}
Expand Down
6 changes: 3 additions & 3 deletions Sample/RHI-ParallelCompute/ParallelCompute.cpp
Original file line number Diff line number Diff line change
Expand Up @@ -144,8 +144,8 @@ class ParallelCompute final : public Application {
bindGroupLayout = device->CreateBindGroupLayout(layoutCreateInfo);

const auto bindGroupCreateInfo = BindGroupCreateInfo(bindGroupLayout.Get())
.AddEntry(BindGroupEntry(csOutPut.reflectionData.QueryResourceBindingChecked("input").second, inputBufferView.Get()))
.AddEntry(BindGroupEntry(csOutPut.reflectionData.QueryResourceBindingChecked("output").second, outputBufferView.Get()));
.AddEntry(BindGroupEntry(csOutPut.reflectionData.QueryResourceBindingChecked("input").second, ShaderStageBits::sCompute, inputBufferView.Get()))
.AddEntry(BindGroupEntry(csOutPut.reflectionData.QueryResourceBindingChecked("output").second, ShaderStageBits::sCompute, outputBufferView.Get()));
bindGroup = device->CreateBindGroup(bindGroupCreateInfo);

pipelineLayout = device->CreatePipelineLayout(PipelineLayoutCreateInfo().AddBindGroupLayout(bindGroupLayout.Get()));
Expand Down Expand Up @@ -232,4 +232,4 @@ int main(int argc, char* argv[])
application.ComputeAndSaveResult();

return 0;
}
}
Loading
Loading