Skip to content

Commit df6b14e

Browse files
committed
WIP: TextureScene/bindless texture table
1 parent 590dcbe commit df6b14e

17 files changed

Lines changed: 511 additions & 30 deletions

Core/Source/Lux/Platform/Vulkan/DescriptorSetManager.cpp

Lines changed: 3 additions & 4 deletions
Original file line numberDiff line numberDiff line change
@@ -443,6 +443,8 @@ namespace Lux {
443443
for (size_t i = 0; i < input.Input.size(); i++)
444444
{
445445
Ref<Texture2D> texture = input.Input[i].As<Texture2D>();
446+
if (texture == nullptr)
447+
texture = Renderer::GetWhiteTexture();
446448

447449
nvrhi::TextureHandle handle = texture->GetHandle();
448450
nvrhi::BindingSetItem bindingSetItem = nvrhi::BindingSetItem::Texture_SRV(binding, handle);
@@ -492,7 +494,7 @@ namespace Lux {
492494
? nvrhi::BindingSetItem::Texture_UAV(binding, handle)
493495
: nvrhi::BindingSetItem::Texture_SRV(binding, handle);
494496

495-
bindingSetItem.arrayElement = i;
497+
bindingSetItem.arrayElement = (uint32_t)i;
496498
bindingSetItem.subresources = imageInfo->ImageView;
497499
bindingSetItem.dimension = imageInfo->Dimension;
498500

@@ -806,10 +808,7 @@ namespace Lux {
806808
{
807809
Ref<Texture2D> texture = input.Input[i].As<Texture2D>();
808810
if (texture == nullptr)
809-
{
810811
texture = Renderer::GetWhiteTexture(); // TODO(Yan): error texture
811-
LUX_CORE_VERIFY(false);
812-
}
813812

814813
if (texture->GetHandle() != bindingSetHandleArray[i])
815814
{

Core/Source/Lux/Platform/Vulkan/DescriptorSetManager.h

Lines changed: 19 additions & 4 deletions
Original file line numberDiff line numberDiff line change
@@ -8,6 +8,7 @@
88
#include "Lux/Platform/Vulkan/VulkanShader.h"
99

1010
#include <set>
11+
#include <vector>
1112

1213
namespace Lux {
1314

@@ -17,8 +18,7 @@ namespace Lux {
1718

1819
struct RenderPassInput
1920
{
20-
static constexpr uint32_t MAX_ARRAY_ELEMENTS = 32;
21-
using InputArray = nvrhi::static_vector<Ref<RefCounted>, MAX_ARRAY_ELEMENTS>;
21+
using InputArray = std::vector<Ref<RefCounted>>;
2222

2323
RenderResourceType Type = RenderResourceType::None;
2424
bool IsWriteable = false;
@@ -64,57 +64,73 @@ namespace Lux {
6464
void Set(Ref<UniformBuffer> uniformBuffer, uint32_t arrayIndex = 0)
6565
{
6666
Type = RenderResourceType::UniformBuffer;
67+
EnsureSize(arrayIndex);
6768
Input[arrayIndex] = uniformBuffer;
6869
}
6970

7071
void Set(Ref<UniformBufferSet> uniformBufferSet, uint32_t arrayIndex = 0)
7172
{
7273
Type = RenderResourceType::UniformBufferSet;
74+
EnsureSize(arrayIndex);
7375
Input[arrayIndex] = uniformBufferSet;
7476
}
7577

7678
void Set(Ref<StorageBuffer> storageBuffer, uint32_t arrayIndex = 0)
7779
{
7880
Type = RenderResourceType::StorageBuffer;
81+
EnsureSize(arrayIndex);
7982
Input[arrayIndex] = storageBuffer;
8083
}
8184

8285
void Set(Ref<StorageBufferSet> storageBufferSet, uint32_t arrayIndex = 0)
8386
{
8487
Type = RenderResourceType::StorageBufferSet;
88+
EnsureSize(arrayIndex);
8589
Input[arrayIndex] = storageBufferSet;
8690
}
8791

8892
void Set(Ref<Texture2D> texture, uint32_t arrayIndex = 0)
8993
{
9094
Type = RenderResourceType::Texture2D;
95+
EnsureSize(arrayIndex);
9196
Input[arrayIndex] = texture;
9297
}
9398

9499
void Set(Ref<TextureCube> texture, uint32_t arrayIndex = 0)
95100
{
96101
Type = RenderResourceType::TextureCube;
102+
EnsureSize(arrayIndex);
97103
Input[arrayIndex] = texture;
98104
}
99105

100106
void Set(Ref<Image2D> image, uint32_t arrayIndex = 0)
101107
{
102108
Type = RenderResourceType::Image2D;
109+
EnsureSize(arrayIndex);
103110
Input[arrayIndex] = image;
104111
}
105112

106113
void Set(Ref<ImageView> image, uint32_t arrayIndex = 0)
107114
{
108115
Type = RenderResourceType::Image2D;
116+
EnsureSize(arrayIndex);
109117
Input[arrayIndex] = image;
110118
}
111119

112120
void Set(Ref<Sampler> sampler, uint32_t arrayIndex = 0)
113121
{
114122
Type = RenderResourceType::Sampler;
123+
EnsureSize(arrayIndex);
115124
Input[arrayIndex] = sampler;
116125
}
117126

127+
private:
128+
void EnsureSize(uint32_t arrayIndex)
129+
{
130+
if (Input.size() <= arrayIndex)
131+
Input.resize((size_t)arrayIndex + 1);
132+
}
133+
118134
};
119135

120136
inline bool IsCompatibleInput(RenderResourceType inputResource, RenderInputType inputType)
@@ -240,8 +256,7 @@ namespace Lux {
240256
// Per-frame in flight
241257
nvrhi::static_vector<nvrhi::static_vector<nvrhi::BindingSetHandle, nvrhi::c_MaxBindingLayouts>, 3> m_BindingSets;
242258
// Frame->set->binding
243-
static constexpr uint32_t MAX_ARRAY_ELEMENTS = 32;
244-
nvrhi::static_vector<std::map<uint32_t, std::map<uint32_t, nvrhi::static_vector<nvrhi::ResourceHandle, MAX_ARRAY_ELEMENTS>>>, 3> m_BindingSetHandles;
259+
nvrhi::static_vector<std::map<uint32_t, std::map<uint32_t, std::vector<nvrhi::ResourceHandle>>>, 3> m_BindingSetHandles;
245260

246261
};
247262

Core/Source/Lux/Renderer/Image.h

Lines changed: 6 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -317,13 +317,19 @@ namespace Lux {
317317
case ImageFormat::RED16UI: return 2;
318318
case ImageFormat::RED32UI: return 4;
319319
case ImageFormat::RED32F: return 4;
320+
case ImageFormat::RG8: return 2;
321+
case ImageFormat::RG16F: return 2 * 2;
322+
case ImageFormat::RG32F: return 4 * 2;
320323
case ImageFormat::RGB:
321324
case ImageFormat::SRGB: return 3;
322325
case ImageFormat::RGBA: return 4;
323326
case ImageFormat::SRGBA: return 4;
324327
case ImageFormat::RGBA16F: return 2 * 4;
325328
case ImageFormat::RGBA32F: return 4 * 4;
326329
case ImageFormat::B10R11G11UF: return 4;
330+
case ImageFormat::DEPTH24STENCIL8: return 4;
331+
case ImageFormat::DEPTH32F: return 4;
332+
case ImageFormat::DEPTH32FSTENCIL8UINT: return 8;
327333
case ImageFormat::BC1:
328334
case ImageFormat::BC1_SRGB:
329335
case ImageFormat::BC3:

Core/Source/Lux/Renderer/MaterialScene.cpp

Lines changed: 12 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -7,6 +7,7 @@
77

88
#include <algorithm>
99
#include <cstring>
10+
#include <utility>
1011

1112
namespace Lux {
1213

@@ -60,7 +61,8 @@ namespace Lux {
6061
if (!textureHandle || !Project::GetAssetManager())
6162
return false;
6263

63-
return AssetManager::IsAssetHandleValid(textureHandle);
64+
return AssetManager::IsAssetHandleValid(textureHandle)
65+
&& AssetManager::GetAssetType(textureHandle) == AssetType::Texture;
6466
}
6567
}
6668

@@ -69,6 +71,11 @@ namespace Lux {
6971
EnsureFallbackMaterial();
7072
}
7173

74+
void MaterialScene::SetTextureResolver(std::function<GPUTextureIndex(AssetHandle)> textureResolver)
75+
{
76+
m_TextureResolver = std::move(textureResolver);
77+
}
78+
7279
GPUMaterialData MaterialScene::GetFallbackMaterialData()
7380
{
7481
GPUMaterialData data;
@@ -256,6 +263,9 @@ namespace Lux {
256263
if (!textureHandle)
257264
return InvalidGPUTextureIndex;
258265

266+
if (m_TextureResolver)
267+
return m_TextureResolver(textureHandle);
268+
259269
auto [it, inserted] = m_TextureIndexByHandle.try_emplace(textureHandle, InvalidGPUTextureIndex);
260270
if (inserted || it->second == InvalidGPUTextureIndex)
261271
it->second = m_NextTextureIndex++;
@@ -326,6 +336,7 @@ namespace Lux {
326336
m_FreeMaterialIDs.clear();
327337
m_MaterialIDByKey.clear();
328338
m_TextureIndexByHandle.clear();
339+
m_TextureResolver = {};
329340
m_DirtyMaterialIDs.clear();
330341
m_DirtyRanges.clear();
331342
EnsureFallbackMaterial();

Core/Source/Lux/Renderer/MaterialScene.h

Lines changed: 4 additions & 5 deletions
Original file line numberDiff line numberDiff line change
@@ -3,12 +3,12 @@
33
#include "Lux/Asset/Asset.h"
44
#include "Lux/Core/Base.h"
55
#include "Lux/Renderer/MaterialAsset.h"
6+
#include "Lux/Renderer/TextureScene.h"
67

78
#include <glm/glm.hpp>
89

910
#include <cstddef>
1011
#include <functional>
11-
#include <limits>
1212
#include <unordered_map>
1313
#include <vector>
1414

@@ -17,9 +17,6 @@ namespace Lux {
1717
using RenderMaterialID = uint32_t;
1818
inline constexpr RenderMaterialID InvalidRenderMaterialID = 0;
1919

20-
using GPUTextureIndex = uint32_t;
21-
inline constexpr GPUTextureIndex InvalidGPUTextureIndex = std::numeric_limits<GPUTextureIndex>::max();
22-
2320
enum class GPUMaterialAlphaMode : uint32_t
2421
{
2522
Opaque = 0,
@@ -87,6 +84,7 @@ namespace Lux {
8784
public:
8885
MaterialScene();
8986

87+
void SetTextureResolver(std::function<GPUTextureIndex(AssetHandle)> textureResolver);
9088
void BeginSync(uint32_t frameIndex);
9189
RenderMaterialID UpsertMaterial(AssetHandle materialHandle, bool forceDirty = false);
9290
RenderMaterialID UpsertOverrideMaterial(uint64_t overrideKey, const Ref<Material>& material, bool transparent, bool forceDirty = false);
@@ -98,7 +96,7 @@ namespace Lux {
9896
bool HasDirtyMaterials() const { return m_DirtyMaterialCount > 0; }
9997
uint32_t GetDirtyMaterialCount() const { return m_DirtyMaterialCount; }
10098
size_t GetActiveMaterialCount() const { return m_MaterialIDByKey.size(); }
101-
uint32_t GetTextureIndexCount() const { return m_NextTextureIndex > 0 ? m_NextTextureIndex - 1 : 0; }
99+
uint32_t GetTextureIndexCount() const { return m_TextureResolver ? 0 : (m_NextTextureIndex > 0 ? m_NextTextureIndex - 1 : 0); }
102100

103101
static GPUMaterialData GetFallbackMaterialData();
104102
static GPUMaterialData BuildGPUMaterialData(
@@ -142,6 +140,7 @@ namespace Lux {
142140
uint32_t m_FrameIndex = 0;
143141
uint32_t m_DirtyMaterialCount = 0;
144142
GPUTextureIndex m_NextTextureIndex = 1;
143+
std::function<GPUTextureIndex(AssetHandle)> m_TextureResolver;
145144

146145
std::vector<GPUMaterialData> m_Materials;
147146
std::vector<MaterialKey> m_MaterialKeys;

Core/Source/Lux/Renderer/RenderScene.cpp

Lines changed: 5 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -110,6 +110,8 @@ namespace Lux {
110110
m_LastSyncStats = {};
111111
m_FrameStaticMeshProxyOrder.clear();
112112
m_GPUScene.BeginSync(m_FrameIndex);
113+
m_TextureScene.BeginSync(m_FrameIndex);
114+
m_MaterialScene.SetTextureResolver([this](AssetHandle textureHandle) { return m_TextureScene.UpsertTexture(textureHandle); });
113115
m_MaterialScene.BeginSync(m_FrameIndex);
114116
}
115117

@@ -265,10 +267,12 @@ namespace Lux {
265267

266268
m_GPUScene.EndSync();
267269
m_MaterialScene.EndSync();
270+
m_TextureScene.EndSync();
268271
m_LastSyncStats.StaticMeshProxyCount = (uint32_t)m_StaticMeshProxiesByEntity.size();
269272
m_LastSyncStats.VisibleStaticMeshProxyCount = (uint32_t)m_StaticMeshProxies.size();
270273
m_LastSyncStats.GPUSceneDirtyInstances = m_GPUScene.GetDirtyInstanceCount();
271274
m_LastSyncStats.MaterialSceneDirtyMaterials = m_MaterialScene.GetDirtyMaterialCount();
275+
m_LastSyncStats.TextureSceneDirtyTextures = m_TextureScene.GetDirtyTextureCount();
272276
}
273277

274278
void RenderScene::Clear()
@@ -280,6 +284,7 @@ namespace Lux {
280284
m_FrameStaticMeshProxyOrder.clear();
281285
m_StaticMeshProxies.clear();
282286
m_GPUScene.Clear();
287+
m_TextureScene.Clear();
283288
m_MaterialScene.Clear();
284289
m_LastSyncStats = {};
285290
}

Core/Source/Lux/Renderer/RenderScene.h

Lines changed: 5 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -6,6 +6,7 @@
66
#include "Lux/Renderer/MaterialScene.h"
77
#include "Lux/Renderer/MaterialAsset.h"
88
#include "Lux/Renderer/Mesh.h"
9+
#include "Lux/Renderer/TextureScene.h"
910

1011
#include <glm/glm.hpp>
1112

@@ -54,6 +55,7 @@ namespace Lux {
5455
uint32_t SelectionDirtyProxies = 0;
5556
uint32_t GPUSceneDirtyInstances = 0;
5657
uint32_t MaterialSceneDirtyMaterials = 0;
58+
uint32_t TextureSceneDirtyTextures = 0;
5759
};
5860

5961
class RenderScene : public RefCounted
@@ -70,6 +72,8 @@ namespace Lux {
7072
GPUScene& GetGPUScene() { return m_GPUScene; }
7173
const MaterialScene& GetMaterialScene() const { return m_MaterialScene; }
7274
MaterialScene& GetMaterialScene() { return m_MaterialScene; }
75+
const TextureScene& GetTextureScene() const { return m_TextureScene; }
76+
TextureScene& GetTextureScene() { return m_TextureScene; }
7377
const RenderSceneSyncStats& GetLastSyncStats() const { return m_LastSyncStats; }
7478
size_t GetStaticMeshProxyCount() const { return m_StaticMeshProxiesByEntity.size(); }
7579
size_t GetVisibleStaticMeshProxyCount() const { return m_StaticMeshProxies.size(); }
@@ -86,6 +90,7 @@ namespace Lux {
8690
RenderPrimitiveID m_NextPrimitiveID = 1;
8791

8892
GPUScene m_GPUScene;
93+
TextureScene m_TextureScene;
8994
MaterialScene m_MaterialScene;
9095
RenderSceneSyncStats m_LastSyncStats;
9196

0 commit comments

Comments
 (0)