Skip to content

Commit

Permalink
Moved mesh rendering to the render pass (WIP)
Browse files Browse the repository at this point in the history
  • Loading branch information
TheMostDiligent committed Oct 19, 2023
1 parent a6cbdcd commit c3fe9bb
Show file tree
Hide file tree
Showing 6 changed files with 225 additions and 297 deletions.
26 changes: 18 additions & 8 deletions Hydrogent/include/HnRenderDelegate.hpp
Original file line number Diff line number Diff line change
Expand Up @@ -34,13 +34,14 @@
#include "pxr/imaging/hd/renderDelegate.h"

#include "RenderDevice.h"
#include "RenderStateCache.h"
#include "RefCntAutoPtr.hpp"
#include "HnTextureRegistry.hpp"

namespace Diligent
{

class PBR_Renderer;
class USD_Renderer;

namespace USD
{
Expand All @@ -54,12 +55,11 @@ class HnRenderDelegate final : public pxr::HdRenderDelegate
public:
struct CreateInfo
{
IRenderDevice* pDevice = nullptr;
IDeviceContext* pContext = nullptr;
IBuffer* pCameraAttribs = nullptr;
IBuffer* pLightAttribs = nullptr;

std::shared_ptr<PBR_Renderer> PBRRenderer;
IRenderDevice* pDevice = nullptr;
IDeviceContext* pContext = nullptr;
IRenderStateCache* pStateCache = nullptr;
IBuffer* pCameraAttribs = nullptr;
IBuffer* pLightAttribs = nullptr;
};
static std::unique_ptr<HnRenderDelegate> Create(const CreateInfo& CI);

Expand Down Expand Up @@ -196,6 +196,16 @@ class HnRenderDelegate final : public pxr::HdRenderDelegate
return it != m_Meshes.end() ? it->second : NullMesh;
}

std::shared_ptr<USD_Renderer> GetUSDRenderer() { return m_USDRenderer; }

IRenderDevice* GetDevice() { return m_pDevice; }
IDeviceContext* GetDeviceContext() { return m_pContext; }

// TODO: needs to be dynamic
static constexpr TEXTURE_FORMAT ColorBufferFormat = TEX_FORMAT_R11G11B10_FLOAT;
static constexpr TEXTURE_FORMAT MeshIdFormat = TEX_FORMAT_R32_FLOAT;
static constexpr TEXTURE_FORMAT DepthFormat = TEX_FORMAT_D32_FLOAT;

private:
static const pxr::TfTokenVector SupportedRPrimTypes;
static const pxr::TfTokenVector SupportedSPrimTypes;
Expand All @@ -205,7 +215,7 @@ class HnRenderDelegate final : public pxr::HdRenderDelegate
RefCntAutoPtr<IDeviceContext> m_pContext;
RefCntAutoPtr<IBuffer> m_CameraAttribsCB;
RefCntAutoPtr<IBuffer> m_LightAttribsCB;
std::shared_ptr<PBR_Renderer> m_PBRRenderer;
std::shared_ptr<USD_Renderer> m_USDRenderer;

HnTextureRegistry m_TextureRegistry;

Expand Down
14 changes: 14 additions & 0 deletions Hydrogent/include/HnRenderPass.hpp
Original file line number Diff line number Diff line change
Expand Up @@ -29,12 +29,18 @@
#include "pxr/imaging/hd/types.h"
#include "pxr/imaging/hd/renderPass.h"

#include "DeviceContext.h"
#include "USD_Renderer.hpp"

namespace Diligent
{

namespace USD
{

class HnMesh;
class HnMaterial;

/// Hydra render pass implementation in Hydrogent.
class HnRenderPass final : public pxr::HdRenderPass
{
Expand All @@ -56,7 +62,15 @@ class HnRenderPass final : public pxr::HdRenderPass
private:
void UpdateDrawItems(const pxr::TfTokenVector& RenderTags);

void RenderMesh(IDeviceContext* pCtx,
const HnMesh& Mesh,
const HnMaterial& Material);

private:
std::shared_ptr<USD_Renderer> m_USDRenderer;
USD_Renderer::PbrPsoCacheAccessor m_PbrPSOCache;
USD_Renderer::WireframePsoCacheAccessor m_WireframePSOCache;

pxr::HdRenderIndex::HdDrawItemPtrVector m_DrawItems;

unsigned int m_CollectionVersion = ~0u;
Expand Down
33 changes: 0 additions & 33 deletions Hydrogent/include/HnRendererImpl.hpp
Original file line number Diff line number Diff line change
Expand Up @@ -38,7 +38,6 @@
#include "BasicMath.hpp"
#include "ObjectBase.hpp"
#include "GPUCompletionAwaitQueue.hpp"
#include "USD_Renderer.hpp"
#include "Tasks/HnTaskController.hpp"

#include "pxr/usd/usd/stage.h"
Expand Down Expand Up @@ -86,13 +85,6 @@ class HnRendererImpl final : public ObjectBase<IHnRenderer>
virtual const pxr::SdfPath* QueryPrimId(IDeviceContext* pCtx, Uint32 X, Uint32 Y) override final;

private:
void RenderMesh(IDeviceContext* pCtx,
const HnMesh& Mesh,
const HnMaterial& Material,
const HnDrawAttribs& Attribs,
USD_Renderer::ALPHA_MODE AlphaMode);
void RenderMeshes(IDeviceContext* pCtx, const HnDrawAttribs& Attribs);

void PrepareRenderTargets(ITextureView* pDstRtv);
void PreparePostProcess(TEXTURE_FORMAT RTVFmt);
void PerformPostProcess(IDeviceContext* pCtx, const HnDrawAttribs& Attribs);
Expand All @@ -107,12 +99,8 @@ class HnRendererImpl final : public ObjectBase<IHnRenderer>

const bool m_ConvertOutputToSRGB;

std::shared_ptr<USD_Renderer> m_USDRenderer;
std::unique_ptr<EnvMapRenderer> m_EnvMapRenderer;

USD_Renderer::PbrPsoCacheAccessor m_PbrPSOCache;
USD_Renderer::WireframePsoCacheAccessor m_WireframePSOCache;

pxr::UsdStageRefPtr m_Stage;

std::unique_ptr<HnRenderDelegate> m_RenderDelegate;
Expand All @@ -122,33 +110,12 @@ class HnRendererImpl final : public ObjectBase<IHnRenderer>

pxr::HdEngine m_Engine;

pxr::TfTokenVector m_RenderTags;
pxr::HdRenderPassSharedPtr m_GeometryPass;

RefCntAutoPtr<ITexture> m_ColorBuffer;
RefCntAutoPtr<ITexture> m_MeshIdTexture;
RefCntAutoPtr<ITextureView> m_DepthBufferDSV;

GPUCompletionAwaitQueue<RefCntAutoPtr<ITexture>> m_MeshIdReadBackQueue;

PBR_Renderer::PSO_FLAGS m_DefaultPSOFlags = PBR_Renderer::PSO_FLAG_NONE;

static constexpr TEXTURE_FORMAT ColorBufferFormat = TEX_FORMAT_R11G11B10_FLOAT;
static constexpr TEXTURE_FORMAT MeshIdFormat = TEX_FORMAT_R32_FLOAT;
static constexpr TEXTURE_FORMAT DepthFormat = TEX_FORMAT_D32_FLOAT;

struct MeshRenderInfo
{
const HnMesh& Mesh;
const HnMaterial& Material;

MeshRenderInfo(const HnMesh& _Mesh, const HnMaterial& _Material) noexcept :
Mesh{_Mesh},
Material{_Material}
{}
};
std::array<std::vector<MeshRenderInfo>, USD_Renderer::ALPHA_MODE_NUM_MODES> m_RenderLists;

struct PostProcessState
{
RefCntAutoPtr<IPipelineState> PSO;
Expand Down
33 changes: 31 additions & 2 deletions Hydrogent/src/HnRenderDelegate.cpp
Original file line number Diff line number Diff line change
Expand Up @@ -29,6 +29,7 @@
#include "HnMaterial.hpp"
#include "HnRenderPass.hpp"
#include "DebugUtilities.hpp"
#include "USD_Renderer.hpp"

#include "pxr/imaging/hd/material.h"

Expand Down Expand Up @@ -65,7 +66,35 @@ HnRenderDelegate::HnRenderDelegate(const CreateInfo& CI) :
m_pContext{CI.pContext},
m_CameraAttribsCB{CI.pCameraAttribs},
m_LightAttribsCB{CI.pLightAttribs},
m_PBRRenderer{CI.PBRRenderer},
m_USDRenderer{
std::make_shared<USD_Renderer>(
CI.pDevice,
CI.pStateCache,
CI.pContext,
[]() {
USD_Renderer::CreateInfo USDRendererCI;

// Use samplers from texture views
USDRendererCI.UseImmutableSamplers = false;
// Disable animation
USDRendererCI.MaxJointCount = 0;
// Use separate textures for metallic and roughness
USDRendererCI.UseSeparateMetallicRoughnessTextures = true;

static constexpr LayoutElement Inputs[] =
{
{0, 0, 3, VT_FLOAT32}, //float3 Pos : ATTRIB0;
{1, 1, 3, VT_FLOAT32}, //float3 Normal : ATTRIB1;
{2, 2, 2, VT_FLOAT32}, //float2 UV0 : ATTRIB2;
{3, 3, 2, VT_FLOAT32}, //float2 UV1 : ATTRIB3;
};

USDRendererCI.InputLayout.LayoutElements = Inputs;
USDRendererCI.InputLayout.NumElements = _countof(Inputs);

return USDRendererCI;
}()),
},
m_TextureRegistry{CI.pDevice}
{
}
Expand Down Expand Up @@ -178,7 +207,7 @@ void HnRenderDelegate::CommitResources(pxr::HdChangeTracker* tracker)
m_TextureRegistry.Commit(m_pContext);
for (auto mat_it : m_Materials)
{
mat_it.second->UpdateSRB(m_pDevice, *m_PBRRenderer, m_CameraAttribsCB, m_LightAttribsCB);
mat_it.second->UpdateSRB(m_pDevice, *m_USDRenderer, m_CameraAttribsCB, m_LightAttribsCB);
}
for (auto mesh_it : m_Meshes)
{
Expand Down
Loading

0 comments on commit c3fe9bb

Please sign in to comment.