diff --git a/Source/Engine/Graphics/Materials/DecalMaterialShader.cpp b/Source/Engine/Graphics/Materials/DecalMaterialShader.cpp index 70eb76015..74712e8fa 100644 --- a/Source/Engine/Graphics/Materials/DecalMaterialShader.cpp +++ b/Source/Engine/Graphics/Materials/DecalMaterialShader.cpp @@ -36,9 +36,10 @@ void DecalMaterialShader::Bind(BindParameters& params) auto context = params.GPUContext; auto& view = params.RenderContext.View; auto& drawCall = *params.FirstDrawCall; - byte* cb = _cbData.Get(); - auto materialData = reinterpret_cast(cb); - cb += sizeof(DecalMaterialShaderData); + Span cb(_cbData.Get(), _cbData.Count()); + ASSERT_LOW_LAYER(cb.Length() >= sizeof(DecalMaterialShaderData)); + auto materialData = reinterpret_cast(cb.Get()); + cb = Span(cb.Get() + sizeof(DecalMaterialShaderData), cb.Length() - sizeof(DecalMaterialShaderData)); int32 srv = 0; const bool isCameraInside = OrientedBoundingBox(Vector3::Half, params.FirstDrawCall->World).Contains(view.Position) == ContainmentType::Contains; diff --git a/Source/Engine/Graphics/Materials/DeferredMaterialShader.cpp b/Source/Engine/Graphics/Materials/DeferredMaterialShader.cpp index 9bc6df82d..e904dc9fa 100644 --- a/Source/Engine/Graphics/Materials/DeferredMaterialShader.cpp +++ b/Source/Engine/Graphics/Materials/DeferredMaterialShader.cpp @@ -60,9 +60,10 @@ void DeferredMaterialShader::Bind(BindParameters& params) auto context = params.GPUContext; auto& view = params.RenderContext.View; auto& drawCall = *params.FirstDrawCall; - byte* cb = _cbData.Get(); - auto materialData = reinterpret_cast(cb); - cb += sizeof(DeferredMaterialShaderData); + Span cb(_cbData.Get(), _cbData.Count()); + ASSERT_LOW_LAYER(cb.Length() >= sizeof(DeferredMaterialShaderData)); + auto materialData = reinterpret_cast(cb.Get()); + cb = Span(cb.Get() + sizeof(DeferredMaterialShaderData), cb.Length() - sizeof(DeferredMaterialShaderData)); int32 srv = 2; // Setup features diff --git a/Source/Engine/Graphics/Materials/DeformableMaterialShader.cpp b/Source/Engine/Graphics/Materials/DeformableMaterialShader.cpp index 3a96812d0..1c967bf34 100644 --- a/Source/Engine/Graphics/Materials/DeformableMaterialShader.cpp +++ b/Source/Engine/Graphics/Materials/DeformableMaterialShader.cpp @@ -47,9 +47,10 @@ void DeformableMaterialShader::Bind(BindParameters& params) auto context = params.GPUContext; auto& view = params.RenderContext.View; auto& drawCall = *params.FirstDrawCall; - byte* cb = _cbData.Get(); - auto materialData = reinterpret_cast(cb); - cb += sizeof(DeformableMaterialShaderData); + Span cb(_cbData.Get(), _cbData.Count()); + ASSERT_LOW_LAYER(cb.Length() >= sizeof(DeformableMaterialShaderData)); + auto materialData = reinterpret_cast(cb.Get()); + cb = Span(cb.Get() + sizeof(DeformableMaterialShaderData), cb.Length() - sizeof(DeformableMaterialShaderData)); int32 srv = 1; // Setup features diff --git a/Source/Engine/Graphics/Materials/ForwardMaterialShader.cpp b/Source/Engine/Graphics/Materials/ForwardMaterialShader.cpp index 816c98b89..94f57e725 100644 --- a/Source/Engine/Graphics/Materials/ForwardMaterialShader.cpp +++ b/Source/Engine/Graphics/Materials/ForwardMaterialShader.cpp @@ -57,9 +57,10 @@ void ForwardMaterialShader::Bind(BindParameters& params) auto context = params.GPUContext; auto& view = params.RenderContext.View; auto& drawCall = *params.FirstDrawCall; - byte* cb = _cbData.Get(); - auto materialData = reinterpret_cast(cb); - cb += sizeof(ForwardMaterialShaderData); + Span cb(_cbData.Get(), _cbData.Count()); + ASSERT_LOW_LAYER(cb.Length() >= sizeof(ForwardMaterialShaderData)); + auto materialData = reinterpret_cast(cb.Get()); + cb = Span(cb.Get() + sizeof(ForwardMaterialShaderData), cb.Length() - sizeof(ForwardMaterialShaderData)); int32 srv = 2; // Setup features diff --git a/Source/Engine/Graphics/Materials/GUIMaterialShader.cpp b/Source/Engine/Graphics/Materials/GUIMaterialShader.cpp index 6b783602e..0f20fb7a7 100644 --- a/Source/Engine/Graphics/Materials/GUIMaterialShader.cpp +++ b/Source/Engine/Graphics/Materials/GUIMaterialShader.cpp @@ -26,9 +26,10 @@ void GUIMaterialShader::Bind(BindParameters& params) { // Prepare auto context = params.GPUContext; - byte* cb = _cbData.Get(); - auto materialData = reinterpret_cast(cb); - cb += sizeof(GUIMaterialShaderData); + Span cb(_cbData.Get(), _cbData.Count()); + ASSERT_LOW_LAYER(cb.Length() >= sizeof(GUIMaterialShaderData)); + auto materialData = reinterpret_cast(cb.Get()); + cb = Span(cb.Get() + sizeof(GUIMaterialShaderData), cb.Length() - sizeof(GUIMaterialShaderData)); int32 srv = 0; const auto ps = context->IsDepthBufferBinded() ? _cache.Depth : _cache.NoDepth; diff --git a/Source/Engine/Graphics/Materials/MaterialParams.cpp b/Source/Engine/Graphics/Materials/MaterialParams.cpp index 626996575..8cafd93d2 100644 --- a/Source/Engine/Graphics/Materials/MaterialParams.cpp +++ b/Source/Engine/Graphics/Materials/MaterialParams.cpp @@ -317,28 +317,36 @@ void MaterialParameter::Bind(BindMeta& meta) const switch (_type) { case MaterialParameterType::Bool: - *((int32*)(meta.Constants + _offset)) = _asBool; + ASSERT_LOW_LAYER(meta.Constants.Get() && meta.Constants.Length() >= (int32)_offset + sizeof(bool)); + *((int32*)(meta.Constants.Get() + _offset)) = _asBool; break; case MaterialParameterType::Integer: - *((int32*)(meta.Constants + _offset)) = _asInteger; + ASSERT_LOW_LAYER(meta.Constants.Get() && meta.Constants.Length() >= (int32)_offset + sizeof(int32)); + *((int32*)(meta.Constants.Get() + _offset)) = _asInteger; break; case MaterialParameterType::Float: - *((float*)(meta.Constants + _offset)) = _asFloat; + ASSERT_LOW_LAYER(meta.Constants.Get() && meta.Constants.Length() >= (int32)_offset + sizeof(float)); + *((float*)(meta.Constants.Get() + _offset)) = _asFloat; break; case MaterialParameterType::Vector2: - *((Vector2*)(meta.Constants + _offset)) = _asVector2; + ASSERT_LOW_LAYER(meta.Constants.Get() && meta.Constants.Length() >= (int32)_offset + sizeof(Vector2)); + *((Vector2*)(meta.Constants.Get() + _offset)) = _asVector2; break; case MaterialParameterType::Vector3: - *((Vector3*)(meta.Constants + _offset)) = _asVector3; + ASSERT_LOW_LAYER(meta.Constants.Get() && meta.Constants.Length() >= (int32)_offset + sizeof(Vector3)); + *((Vector3*)(meta.Constants.Get() + _offset)) = _asVector3; break; case MaterialParameterType::Vector4: - *((Vector4*)(meta.Constants + _offset)) = *(Vector4*)&AsData; + ASSERT_LOW_LAYER(meta.Constants.Get() && meta.Constants.Length() >= (int32)_offset + sizeof(Vector4)); + *((Vector4*)(meta.Constants.Get() + _offset)) = *(Vector4*)&AsData; break; case MaterialParameterType::Color: - *((Color*)(meta.Constants + _offset)) = _asColor; + ASSERT_LOW_LAYER(meta.Constants.Get() && meta.Constants.Length() >= (int32)_offset + sizeof(Vector4)); + *((Color*)(meta.Constants.Get() + _offset)) = _asColor; break; case MaterialParameterType::Matrix: - Matrix::Transpose(*(Matrix*)&AsData, *(Matrix*)(meta.Constants + _offset)); + ASSERT_LOW_LAYER(meta.Constants.Get() && meta.Constants.Length() >= (int32)_offset + sizeof(Matrix)); + Matrix::Transpose(*(Matrix*)&AsData, *(Matrix*)(meta.Constants.Get() + _offset)); break; case MaterialParameterType::NormalMap: { @@ -415,7 +423,8 @@ void MaterialParameter::Bind(BindMeta& meta) const break; } case MaterialParameterType::ChannelMask: - *((Vector4*)(meta.Constants + _offset)) = Vector4(_asInteger == 0, _asInteger == 1, _asInteger == 2, _asInteger == 3); + ASSERT_LOW_LAYER(meta.Constants.Get() && meta.Constants.Length() >= (int32)_offset + sizeof(int32)); + *((Vector4*)(meta.Constants.Get() + _offset)) = Vector4(_asInteger == 0, _asInteger == 1, _asInteger == 2, _asInteger == 3); break; case MaterialParameterType::GameplayGlobal: if (_asAsset) @@ -426,26 +435,33 @@ void MaterialParameter::Bind(BindMeta& meta) const switch (e->Value.Type.Type) { case VariantType::Bool: - *((bool*)(meta.Constants + _offset)) = e->Value.AsBool; + ASSERT_LOW_LAYER(meta.Constants.Get() && meta.Constants.Length() >= (int32)_offset + sizeof(bool)); + *((bool*)(meta.Constants.Get() + _offset)) = e->Value.AsBool; break; case VariantType::Int: - *((int32*)(meta.Constants + _offset)) = e->Value.AsInt; + ASSERT_LOW_LAYER(meta.Constants.Get() && meta.Constants.Length() >= (int32)_offset + sizeof(int32)); + *((int32*)(meta.Constants.Get() + _offset)) = e->Value.AsInt; break; case VariantType::Uint: - *((uint32*)(meta.Constants + _offset)) = e->Value.AsUint; + ASSERT_LOW_LAYER(meta.Constants.Get() && meta.Constants.Length() >= (int32)_offset + sizeof(uint32)); + *((uint32*)(meta.Constants.Get() + _offset)) = e->Value.AsUint; break; case VariantType::Float: - *((float*)(meta.Constants + _offset)) = e->Value.AsFloat; + ASSERT_LOW_LAYER(meta.Constants.Get() && meta.Constants.Length() >= (int32)_offset + sizeof(float)); + *((float*)(meta.Constants.Get() + _offset)) = e->Value.AsFloat; break; case VariantType::Vector2: - *((Vector2*)(meta.Constants + _offset)) = e->Value.AsVector2(); + ASSERT_LOW_LAYER(meta.Constants.Get() && meta.Constants.Length() >= (int32)_offset + sizeof(Vector2)); + *((Vector2*)(meta.Constants.Get() + _offset)) = e->Value.AsVector2(); break; case VariantType::Vector3: - *((Vector3*)(meta.Constants + _offset)) = e->Value.AsVector3(); + ASSERT_LOW_LAYER(meta.Constants.Get() && meta.Constants.Length() >= (int32)_offset + sizeof(Vector3)); + *((Vector3*)(meta.Constants.Get() + _offset)) = e->Value.AsVector3(); break; case VariantType::Vector4: case VariantType::Color: - *((Vector4*)(meta.Constants + _offset)) = e->Value.AsVector4(); + ASSERT_LOW_LAYER(meta.Constants.Get() && meta.Constants.Length() >= (int32)_offset + sizeof(Vector4)); + *((Vector4*)(meta.Constants.Get() + _offset)) = e->Value.AsVector4(); break; default: ; } diff --git a/Source/Engine/Graphics/Materials/MaterialParams.h b/Source/Engine/Graphics/Materials/MaterialParams.h index dde8ed73c..d5e182878 100644 --- a/Source/Engine/Graphics/Materials/MaterialParams.h +++ b/Source/Engine/Graphics/Materials/MaterialParams.h @@ -309,7 +309,7 @@ public: /// /// The pointer to the constants buffer in the memory. /// - byte* Constants; + Span Constants; /// /// The input scene color. It's optional and used in forward/postFx rendering. diff --git a/Source/Engine/Graphics/Materials/MaterialShaderFeatures.cpp b/Source/Engine/Graphics/Materials/MaterialShaderFeatures.cpp index 03c03414c..c18e93281 100644 --- a/Source/Engine/Graphics/Materials/MaterialShaderFeatures.cpp +++ b/Source/Engine/Graphics/Materials/MaterialShaderFeatures.cpp @@ -11,13 +11,14 @@ #include "Engine/Level/Scene/Lightmap.h" #include "Engine/Level/Actors/EnvironmentProbe.h" -void ForwardShadingFeature::Bind(MaterialShader::BindParameters& params, byte*& cb, int32& srv) +void ForwardShadingFeature::Bind(MaterialShader::BindParameters& params, Span& cb, int32& srv) { auto context = params.GPUContext; auto cache = params.RenderContext.List; auto& view = params.RenderContext.View; auto& drawCall = *params.FirstDrawCall; - auto& data = *(Data*)cb; + auto& data = *(Data*)cb.Get(); + ASSERT_LOW_LAYER(cb.Length() >= sizeof(Data)); const int32 envProbeShaderRegisterIndex = srv + 0; const int32 skyLightShaderRegisterIndex = srv + 1; const int32 dirLightShaderRegisterIndex = srv + 2; @@ -116,16 +117,17 @@ void ForwardShadingFeature::Bind(MaterialShader::BindParameters& params, byte*& } } - cb += sizeof(Data); + cb = Span(cb.Get() + sizeof(Data), cb.Length() - sizeof(Data)); srv += SRVs; } -bool LightmapFeature::Bind(MaterialShader::BindParameters& params, byte*& cb, int32& srv) +bool LightmapFeature::Bind(MaterialShader::BindParameters& params, Span& cb, int32& srv) { auto context = params.GPUContext; auto& view = params.RenderContext.View; auto& drawCall = *params.FirstDrawCall; - auto& data = *(Data*)cb; + auto& data = *(Data*)cb.Get(); + ASSERT_LOW_LAYER(cb.Length() >= sizeof(Data)); const bool useLightmap = view.Flags & ViewFlags::GI #if USE_EDITOR @@ -145,8 +147,8 @@ bool LightmapFeature::Bind(MaterialShader::BindParameters& params, byte*& cb, in data.LightmapArea = drawCall.Features.LightmapUVsArea; } + cb = Span(cb.Get() + sizeof(Data), cb.Length() - sizeof(Data)); srv += SRVs; - cb += sizeof(Data); return useLightmap; } diff --git a/Source/Engine/Graphics/Materials/MaterialShaderFeatures.h b/Source/Engine/Graphics/Materials/MaterialShaderFeatures.h index 3eb1db89d..52101ef6d 100644 --- a/Source/Engine/Graphics/Materials/MaterialShaderFeatures.h +++ b/Source/Engine/Graphics/Materials/MaterialShaderFeatures.h @@ -4,6 +4,7 @@ #include "MaterialShader.h" #include "Engine/Core/Math/Rectangle.h" +#include "Engine/Core/Types/Span.h" // Material shader features are plugin-based functionalities that are reusable between different material domains. struct MaterialShaderFeature @@ -35,7 +36,7 @@ struct ForwardShadingFeature : MaterialShaderFeature LightData LocalLights[MaxLocalLights]; }); - static void Bind(MaterialShader::BindParameters& params, byte*& cb, int32& srv); + static void Bind(MaterialShader::BindParameters& params, Span& cb, int32& srv); #if USE_EDITOR static void Generate(GeneratorData& data); #endif @@ -67,7 +68,7 @@ struct LightmapFeature : MaterialShaderFeature Rectangle LightmapArea; }); - static bool Bind(MaterialShader::BindParameters& params, byte*& cb, int32& srv); + static bool Bind(MaterialShader::BindParameters& params, Span& cb, int32& srv); #if USE_EDITOR static void Generate(GeneratorData& data); #endif diff --git a/Source/Engine/Graphics/Materials/ParticleMaterialShader.cpp b/Source/Engine/Graphics/Materials/ParticleMaterialShader.cpp index fc475ea11..77251e803 100644 --- a/Source/Engine/Graphics/Materials/ParticleMaterialShader.cpp +++ b/Source/Engine/Graphics/Materials/ParticleMaterialShader.cpp @@ -57,9 +57,10 @@ void ParticleMaterialShader::Bind(BindParameters& params) auto& view = params.RenderContext.View; auto& drawCall = *params.FirstDrawCall; const uint32 sortedIndicesOffset = drawCall.Particle.Module->SortedIndicesOffset; - byte* cb = _cbData.Get(); - auto materialData = reinterpret_cast(cb); - cb += sizeof(ParticleMaterialShaderData); + Span cb(_cbData.Get(), _cbData.Count()); + ASSERT_LOW_LAYER(cb.Length() >= sizeof(ParticleMaterialShaderData)); + auto materialData = reinterpret_cast(cb.Get()); + cb = Span(cb.Get() + sizeof(ParticleMaterialShaderData), cb.Length() - sizeof(ParticleMaterialShaderData)); int32 srv = 2; // Setup features @@ -89,7 +90,8 @@ void ParticleMaterialShader::Bind(BindParameters& params) { const StringView name(param.GetName().Get() + 9, param.GetName().Length() - 9); const int32 offset = drawCall.Particle.Particles->Layout->FindAttributeOffset(name); - *((int32*)(bindMeta.Constants + param.GetBindOffset())) = offset; + ASSERT_LOW_LAYER(bindMeta.Constants.Get() && bindMeta.Constants.Length() >= (int32)param.GetBindOffset() + sizeof(int32)); + *((int32*)(bindMeta.Constants.Get() + param.GetBindOffset())) = offset; } } } diff --git a/Source/Engine/Graphics/Materials/PostFxMaterialShader.cpp b/Source/Engine/Graphics/Materials/PostFxMaterialShader.cpp index 804445029..762e18cbc 100644 --- a/Source/Engine/Graphics/Materials/PostFxMaterialShader.cpp +++ b/Source/Engine/Graphics/Materials/PostFxMaterialShader.cpp @@ -25,9 +25,10 @@ void PostFxMaterialShader::Bind(BindParameters& params) // Prepare auto context = params.GPUContext; auto& view = params.RenderContext.View; - byte* cb = _cbData.Get(); - auto materialData = reinterpret_cast(cb); - cb += sizeof(PostFxMaterialShaderData); + Span cb(_cbData.Get(), _cbData.Count()); + ASSERT_LOW_LAYER(cb.Length() >= sizeof(PostFxMaterialShaderData)); + auto materialData = reinterpret_cast(cb.Get()); + cb = Span(cb.Get() + sizeof(PostFxMaterialShaderData), cb.Length() - sizeof(PostFxMaterialShaderData)); int32 srv = 0; // Setup parameters diff --git a/Source/Engine/Graphics/Materials/TerrainMaterialShader.cpp b/Source/Engine/Graphics/Materials/TerrainMaterialShader.cpp index f975980de..f728bac97 100644 --- a/Source/Engine/Graphics/Materials/TerrainMaterialShader.cpp +++ b/Source/Engine/Graphics/Materials/TerrainMaterialShader.cpp @@ -53,9 +53,10 @@ void TerrainMaterialShader::Bind(BindParameters& params) auto context = params.GPUContext; auto& view = params.RenderContext.View; auto& drawCall = *params.FirstDrawCall; - byte* cb = _cbData.Get(); - auto materialData = reinterpret_cast(cb); - cb += sizeof(TerrainMaterialShaderData); + Span cb(_cbData.Get(), _cbData.Count()); + ASSERT_LOW_LAYER(cb.Length() >= sizeof(TerrainMaterialShaderData)); + auto materialData = reinterpret_cast(cb.Get()); + cb = Span(cb.Get() + sizeof(TerrainMaterialShaderData), cb.Length() - sizeof(TerrainMaterialShaderData)); int32 srv = 3; // Setup features diff --git a/Source/Engine/Graphics/Materials/VolumeParticleMaterialShader.cpp b/Source/Engine/Graphics/Materials/VolumeParticleMaterialShader.cpp index a23dcb253..a1aabb833 100644 --- a/Source/Engine/Graphics/Materials/VolumeParticleMaterialShader.cpp +++ b/Source/Engine/Graphics/Materials/VolumeParticleMaterialShader.cpp @@ -45,9 +45,10 @@ void VolumeParticleMaterialShader::Bind(BindParameters& params) auto context = params.GPUContext; auto& view = params.RenderContext.View; auto& drawCall = *params.FirstDrawCall; - byte* cb = _cbData.Get(); - auto materialData = reinterpret_cast(cb); - cb += sizeof(VolumeParticleMaterialShaderData); + Span cb(_cbData.Get(), _cbData.Count()); + ASSERT_LOW_LAYER(cb.Length() >= sizeof(VolumeParticleMaterialShaderData)); + auto materialData = reinterpret_cast(cb.Get()); + cb = Span(cb.Get() + sizeof(VolumeParticleMaterialShaderData), cb.Length() - sizeof(VolumeParticleMaterialShaderData)); int32 srv = 1; auto customData = (VolumetricFogPass::CustomData*)params.CustomData; @@ -74,7 +75,8 @@ void VolumeParticleMaterialShader::Bind(BindParameters& params) { const StringView name(param.GetName().Get() + 9, param.GetName().Length() - 9); const int32 offset = drawCall.Particle.Particles->Layout->FindAttributeOffset(name); - *((int32*)(bindMeta.Constants + param.GetBindOffset())) = offset; + ASSERT_LOW_LAYER(bindMeta.Constants.Get() && bindMeta.Constants.Length() >= (int32)param.GetBindOffset() + sizeof(int32)); + *((int32*)(bindMeta.Constants.Get() + param.GetBindOffset())) = offset; } } } diff --git a/Source/Engine/Particles/Graph/GPU/GPUParticles.cpp b/Source/Engine/Particles/Graph/GPU/GPUParticles.cpp index a285c5718..47ef3376c 100644 --- a/Source/Engine/Particles/Graph/GPU/GPUParticles.cpp +++ b/Source/Engine/Particles/Graph/GPU/GPUParticles.cpp @@ -162,7 +162,7 @@ void GPUParticles::Execute(GPUContext* context, ParticleEmitter* emitter, Partic // Setup parameters MaterialParameter::BindMeta bindMeta; bindMeta.Context = context; - bindMeta.Constants = hasCB ? _cbData.Get() + sizeof(GPUParticlesData) : nullptr; + bindMeta.Constants = hasCB ? Span(_cbData.Get() + sizeof(GPUParticlesData), _cbData.Count() - sizeof(GPUParticlesData)) : Span(nullptr, 0); bindMeta.Input = nullptr; if (viewTask) {