diff --git a/Source/Engine/Core/Types/Span.h b/Source/Engine/Core/Types/Span.h index 8f16b8c7d..3120ae670 100644 --- a/Source/Engine/Core/Types/Span.h +++ b/Source/Engine/Core/Types/Span.h @@ -85,6 +85,30 @@ public: return (U*)_data; } +public: + /// + /// Constructs a slice out of the current span that begins at a specified index. + /// + /// The zero-based index at which to begin the slice. + /// A span that consists of all elements of the current span from to the end of the span. + Span Slice(int32 start) + { + ASSERT(start <= _length); + return Span(_data + start, _length - start); + } + + /// + /// Constructs a slice out of the current span starting at a specified index for a specified length. + /// + /// The zero-based index at which to begin this slice. + /// The length for the result slice. + /// A span that consists of elements from the current span starting at . + Span Slice(int32 start, int32 length) + { + ASSERT(start + length <= _length); + return Span(_data + start, length); + } + public: /// /// Gets or sets the element by index diff --git a/Source/Engine/Graphics/Materials/DecalMaterialShader.cpp b/Source/Engine/Graphics/Materials/DecalMaterialShader.cpp index 714805f45..ab38822c0 100644 --- a/Source/Engine/Graphics/Materials/DecalMaterialShader.cpp +++ b/Source/Engine/Graphics/Materials/DecalMaterialShader.cpp @@ -33,7 +33,7 @@ void DecalMaterialShader::Bind(BindParameters& params) 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)); + cb = cb.Slice(sizeof(DecalMaterialShaderData)); const bool isCameraInside = OrientedBoundingBox(Vector3::Half, drawCall.World).Contains(view.Position) == ContainmentType::Contains; // Setup parameters diff --git a/Source/Engine/Graphics/Materials/DeformableMaterialShader.cpp b/Source/Engine/Graphics/Materials/DeformableMaterialShader.cpp index 434d1ef05..333c9eb35 100644 --- a/Source/Engine/Graphics/Materials/DeformableMaterialShader.cpp +++ b/Source/Engine/Graphics/Materials/DeformableMaterialShader.cpp @@ -41,7 +41,7 @@ void DeformableMaterialShader::Bind(BindParameters& params) 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)); + cb = cb.Slice(sizeof(DeformableMaterialShaderData)); int32 srv = 1; // Setup features diff --git a/Source/Engine/Graphics/Materials/GUIMaterialShader.cpp b/Source/Engine/Graphics/Materials/GUIMaterialShader.cpp index 69a097a2a..d6066adab 100644 --- a/Source/Engine/Graphics/Materials/GUIMaterialShader.cpp +++ b/Source/Engine/Graphics/Materials/GUIMaterialShader.cpp @@ -32,7 +32,7 @@ void GUIMaterialShader::Bind(BindParameters& params) 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)); + cb = cb.Slice(sizeof(GUIMaterialShaderData)); int32 srv = 0; const auto ps = context->IsDepthBufferBinded() ? _cache.Depth : _cache.NoDepth; auto customData = (Render2D::CustomData*)params.CustomData; diff --git a/Source/Engine/Graphics/Materials/MaterialShaderFeatures.cpp b/Source/Engine/Graphics/Materials/MaterialShaderFeatures.cpp index 2b2d079cd..a0b85092a 100644 --- a/Source/Engine/Graphics/Materials/MaterialShaderFeatures.cpp +++ b/Source/Engine/Graphics/Materials/MaterialShaderFeatures.cpp @@ -113,7 +113,7 @@ void ForwardShadingFeature::Bind(MaterialShader::BindParameters& params, Span(cb.Get() + sizeof(Data), cb.Length() - sizeof(Data)); + cb = cb.Slice(sizeof(Data)); srv += SRVs; } @@ -184,7 +184,7 @@ bool GlobalIlluminationFeature::Bind(MaterialShader::BindParameters& params, Spa params.GPUContext->UnBindSR(srv + 2); } - cb = Span(cb.Get() + sizeof(Data), cb.Length() - sizeof(Data)); + cb = cb.Slice(sizeof(Data)); srv += SRVs; return useGI; } @@ -236,7 +236,7 @@ bool SDFReflectionsFeature::Bind(MaterialShader::BindParameters& params, SpanUnBindSR(srv + 6); } - cb = Span(cb.Get() + sizeof(Data), cb.Length() - sizeof(Data)); + cb = cb.Slice(sizeof(Data)); srv += SRVs; return useSDFReflections; } diff --git a/Source/Engine/Graphics/Materials/ParticleMaterialShader.cpp b/Source/Engine/Graphics/Materials/ParticleMaterialShader.cpp index 33e2bb454..1659e973e 100644 --- a/Source/Engine/Graphics/Materials/ParticleMaterialShader.cpp +++ b/Source/Engine/Graphics/Materials/ParticleMaterialShader.cpp @@ -53,7 +53,7 @@ void ParticleMaterialShader::Bind(BindParameters& params) 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)); + cb = cb.Slice(sizeof(ParticleMaterialShaderData)); int32 srv = 2; // Setup features diff --git a/Source/Engine/Graphics/Materials/PostFxMaterialShader.cpp b/Source/Engine/Graphics/Materials/PostFxMaterialShader.cpp index c820fc613..edb293c65 100644 --- a/Source/Engine/Graphics/Materials/PostFxMaterialShader.cpp +++ b/Source/Engine/Graphics/Materials/PostFxMaterialShader.cpp @@ -31,7 +31,7 @@ void PostFxMaterialShader::Bind(BindParameters& params) 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)); + cb = cb.Slice(sizeof(PostFxMaterialShaderData)); int32 srv = 0; // Setup parameters diff --git a/Source/Engine/Graphics/Materials/TerrainMaterialShader.cpp b/Source/Engine/Graphics/Materials/TerrainMaterialShader.cpp index 2a040b55a..2bb0b42ad 100644 --- a/Source/Engine/Graphics/Materials/TerrainMaterialShader.cpp +++ b/Source/Engine/Graphics/Materials/TerrainMaterialShader.cpp @@ -50,7 +50,7 @@ void TerrainMaterialShader::Bind(BindParameters& params) 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)); + cb = cb.Slice(sizeof(TerrainMaterialShaderData)); int32 srv = 3; // Setup features diff --git a/Source/Engine/Graphics/Materials/VolumeParticleMaterialShader.cpp b/Source/Engine/Graphics/Materials/VolumeParticleMaterialShader.cpp index cc04498df..853058226 100644 --- a/Source/Engine/Graphics/Materials/VolumeParticleMaterialShader.cpp +++ b/Source/Engine/Graphics/Materials/VolumeParticleMaterialShader.cpp @@ -41,7 +41,7 @@ void VolumeParticleMaterialShader::Bind(BindParameters& params) 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)); + cb = cb.Slice(sizeof(VolumeParticleMaterialShaderData)); int32 srv = 1; auto customData = (VolumetricFogPass::CustomData*)params.CustomData; diff --git a/Source/Engine/GraphicsDevice/DirectX/DX12/GPUShaderDX12.cpp b/Source/Engine/GraphicsDevice/DirectX/DX12/GPUShaderDX12.cpp index c4aea2172..0fe07a466 100644 --- a/Source/Engine/GraphicsDevice/DirectX/DX12/GPUShaderDX12.cpp +++ b/Source/Engine/GraphicsDevice/DirectX/DX12/GPUShaderDX12.cpp @@ -12,7 +12,7 @@ GPUShaderProgram* GPUShaderDX12::CreateGPUShaderProgram(ShaderStage type, const { // Extract the DX shader header from the cache DxShaderHeader* header = (DxShaderHeader*)bytecode.Get(); - bytecode = Span(bytecode.Get() + sizeof(DxShaderHeader), bytecode.Length() - sizeof(DxShaderHeader)); + bytecode = bytecode.Slice(sizeof(DxShaderHeader)); GPUShaderProgram* shader = nullptr; switch (type) diff --git a/Source/Engine/GraphicsDevice/Vulkan/GPUShaderVulkan.cpp b/Source/Engine/GraphicsDevice/Vulkan/GPUShaderVulkan.cpp index d36919b5f..9608d5207 100644 --- a/Source/Engine/GraphicsDevice/Vulkan/GPUShaderVulkan.cpp +++ b/Source/Engine/GraphicsDevice/Vulkan/GPUShaderVulkan.cpp @@ -102,7 +102,7 @@ GPUShaderProgram* GPUShaderVulkan::CreateGPUShaderProgram(ShaderStage type, cons { // Extract the SPIR-V shader header from the cache SpirvShaderHeader* header = (SpirvShaderHeader*)bytecode.Get(); - bytecode = Span(bytecode.Get() + sizeof(SpirvShaderHeader), bytecode.Length() - sizeof(SpirvShaderHeader)); + bytecode = bytecode.Slice(sizeof(SpirvShaderHeader)); // Extract the SPIR-V bytecode BytesContainer spirv; diff --git a/Source/Engine/Particles/Graph/GPU/GPUParticles.cpp b/Source/Engine/Particles/Graph/GPU/GPUParticles.cpp index dbd7c0d02..43fde57db 100644 --- a/Source/Engine/Particles/Graph/GPU/GPUParticles.cpp +++ b/Source/Engine/Particles/Graph/GPU/GPUParticles.cpp @@ -166,7 +166,7 @@ void GPUParticles::Execute(GPUContext* context, ParticleEmitter* emitter, Partic // Setup parameters MaterialParameter::BindMeta bindMeta; bindMeta.Context = context; - bindMeta.Constants = hasCB ? Span(_cbData.Get() + sizeof(GPUParticlesData), _cbData.Count() - sizeof(GPUParticlesData)) : Span(nullptr, 0); + bindMeta.Constants = hasCB ? ToSpan(_cbData).Slice(sizeof(GPUParticlesData)) : Span(nullptr, 0); bindMeta.Input = nullptr; if (viewTask) {