public static void ProcessResources(this ParameterCollectionLayout parameterCollectionLayout, DescriptorSetLayoutBuilder layout) { foreach (var layoutEntry in layout.Entries) { parameterCollectionLayout.LayoutParameterKeyInfos.Add(new ParameterKeyInfo(layoutEntry.Key, parameterCollectionLayout.ResourceCount++)); } }
public static void ProcessConstantBuffer(this ParameterCollectionLayout parameterCollectionLayout, EffectConstantBufferDescription constantBuffer) { foreach (var member in constantBuffer.Members) { parameterCollectionLayout.LayoutParameterKeyInfos.Add(new ParameterKeyInfo(member.KeyInfo.Key, parameterCollectionLayout.BufferSize + member.Offset, member.Type.Elements > 0 ? member.Type.Elements : 1)); } parameterCollectionLayout.BufferSize += constantBuffer.Size; }
public static void ProcessConstantBuffer(this ParameterCollectionLayout parameterCollectionLayout, ShaderConstantBufferDescription constantBuffer) { foreach (var member in constantBuffer.Members) { parameterCollectionLayout.LayoutParameterKeyInfos.Add(new ParameterKeyInfo(member.Param.Key, parameterCollectionLayout.BufferSize + member.Offset, member.Count > 0 ? member.Count : 1)); } parameterCollectionLayout.BufferSize += constantBuffer.Size; }
/// <inheritdoc/> public override void Prepare(RenderDrawContext context) { foreach (var view in RenderSystem.Views) { var viewFeature = view.Features[RootRenderFeature.Index]; RenderViewLightData renderViewData; if (!renderViewDatas.TryGetValue(view.LightingView ?? view, out renderViewData) || viewFeature.Layouts.Count == 0) { continue; } // Find a PerView layout from an effect in normal state ViewResourceGroupLayout firstViewLayout = null; foreach (var viewLayout in viewFeature.Layouts) { // Only process view layouts in normal state if (viewLayout.State != RenderEffectState.Normal) { continue; } var viewLighting = viewLayout.GetLogicalGroup(viewLightingKey); if (viewLighting.Hash != ObjectId.Empty) { firstViewLayout = viewLayout; break; } } // Nothing found for this view (no effects in normal state) if (firstViewLayout == null) { continue; } var viewIndex = renderViews.IndexOf(view); var viewParameterLayout = renderViewData.ViewParameterLayout; var viewParameters = renderViewData.ViewParameters; var firstViewLighting = firstViewLayout.GetLogicalGroup(viewLightingKey); // Prepare layout (should be similar for all PerView) if (firstViewLighting.Hash != renderViewData.ViewLayoutHash) { renderViewData.ViewLayoutHash = firstViewLighting.Hash; // Generate layout viewParameterLayout = renderViewData.ViewParameterLayout = new ParameterCollectionLayout(); viewParameterLayout.ProcessLogicalGroup(firstViewLayout, ref firstViewLighting); viewParameters.UpdateLayout(viewParameterLayout); } // Compute PerView lighting foreach (var directLightGroup in shaderPermutation.DirectLightGroups) { directLightGroup.ApplyViewParameters(context, viewIndex, viewParameters); } foreach (var environmentLight in shaderPermutation.EnvironmentLights) { environmentLight.ApplyViewParameters(context, viewIndex, viewParameters); } // Update PerView foreach (var viewLayout in viewFeature.Layouts) { // Only process view layouts in normal state if (viewLayout.State != RenderEffectState.Normal) { continue; } var viewLighting = viewLayout.GetLogicalGroup(viewLightingKey); if (viewLighting.Hash == ObjectId.Empty) { continue; } if (viewLighting.Hash != firstViewLighting.Hash) { throw new InvalidOperationException("PerView Lighting layout differs between different RenderObject in the same RenderView"); } var resourceGroup = viewLayout.Entries[view.Index].Resources; // Update resources resourceGroup.UpdateLogicalGroup(ref viewLighting, viewParameters); } // PerDraw Dispatcher.ForEach(viewFeature.RenderNodes, () => prepareThreadLocals.Value, (renderNodeReference, locals) => { var renderNode = RootRenderFeature.GetRenderNode(renderNodeReference); // Ignore fallback effects if (renderNode.RenderEffect?.State != RenderEffectState.Normal) { return; } var drawLayout = renderNode.RenderEffect?.Reflection?.PerDrawLayout; if (drawLayout == null) { return; } var drawLighting = drawLayout.GetLogicalGroup(drawLightingKey); if (drawLighting.Hash == ObjectId.Empty) { return; } // First time, let's build layout if (drawLighting.Hash != locals.DrawLayoutHash) { locals.DrawLayoutHash = drawLighting.Hash; // Generate layout var drawParameterLayout = new ParameterCollectionLayout(); drawParameterLayout.ProcessLogicalGroup(drawLayout, ref drawLighting); locals.DrawParameters.UpdateLayout(drawParameterLayout); } // TODO: Does this ever fail? Debug.Assert(drawLighting.Hash == locals.DrawLayoutHash, "PerDraw Lighting layout differs between different RenderObject in the same RenderView"); // Compute PerDraw lighting foreach (var directLightGroup in shaderPermutation.DirectLightGroups) { directLightGroup.ApplyDrawParameters(context, viewIndex, locals.DrawParameters, ref renderNode.RenderObject.BoundingBox); } foreach (var environmentLight in shaderPermutation.EnvironmentLights) { environmentLight.ApplyDrawParameters(context, viewIndex, locals.DrawParameters, ref renderNode.RenderObject.BoundingBox); } // Update resources renderNode.Resources.UpdateLogicalGroup(ref drawLighting, locals.DrawParameters); }); } }
/// <inheritdoc/> public override void Prepare(RenderDrawContext context) { //var renderViewObjectInfoData = RootRenderFeature.RenderData.GetData(renderViewObjectInfoKey); foreach (var view in RenderSystem.Views) { var viewFeature = view.Features[RootRenderFeature.Index]; RenderViewLightData renderViewData; if (!renderViewDatas.TryGetValue(view, out renderViewData) || viewFeature.Layouts.Count == 0) continue; // Find a PerView layout from an effect in normal state ViewResourceGroupLayout firstViewLayout = null; foreach (var viewLayout in viewFeature.Layouts) { // Only process view layouts in normal state if (viewLayout.State != RenderEffectState.Normal) continue; var viewLighting = viewLayout.GetLogicalGroup(viewLightingKey); if (viewLighting.Hash != ObjectId.Empty) { firstViewLayout = viewLayout; break; } } // Nothing found for this view (no effects in normal state) if (firstViewLayout == null) continue; var viewParameterLayout = renderViewData.ViewParameterLayout; var viewParameters = renderViewData.ViewParameters; var firstViewLighting = firstViewLayout.GetLogicalGroup(viewLightingKey); // Prepare layout (should be similar for all PerView) if (firstViewLighting.Hash != renderViewData.ViewLayoutHash) { renderViewData.ViewLayoutHash = firstViewLighting.Hash; // Generate layout viewParameterLayout = renderViewData.ViewParameterLayout = new ParameterCollectionLayout(); viewParameterLayout.ProcessLogicalGroup(firstViewLayout, ref firstViewLighting); viewParameters.UpdateLayout(viewParameterLayout); } // Compute PerView lighting foreach (var directLightGroup in ShaderPermutation.DirectLightGroups) { directLightGroup.ApplyViewParameters(context, renderViewData.ViewIndex, viewParameters); } foreach (var environmentLight in ShaderPermutation.EnvironmentLights) { environmentLight.ApplyViewParameters(context, renderViewData.ViewIndex, viewParameters); } // Update PerView foreach (var viewLayout in viewFeature.Layouts) { // Only process view layouts in normal state if (viewLayout.State != RenderEffectState.Normal) continue; var viewLighting = viewLayout.GetLogicalGroup(viewLightingKey); if (viewLighting.Hash == ObjectId.Empty) continue; Debug.Assert(viewLighting.Hash == firstViewLighting.Hash, "PerView Lighting layout differs between different RenderObject in the same RenderView"); var resourceGroup = viewLayout.Entries[view.Index].Resources; // Update resources resourceGroup.UpdateLogicalGroup(ref viewLighting, viewParameters); } // PerDraw var drawParameters = renderViewData.DrawParameters; foreach (var renderNodeReference in viewFeature.RenderNodes) { var renderNode = RootRenderFeature.GetRenderNode(renderNodeReference); // Ignore fallback effects if (renderNode.RenderEffect.State != RenderEffectState.Normal) continue; var drawLayout = renderNode.RenderEffect.Reflection.PerDrawLayout; if (drawLayout == null) continue; var drawLighting = drawLayout.GetLogicalGroup(drawLightingKey); if (drawLighting.Hash == ObjectId.Empty) continue; // First time, let's build layout if (drawLighting.Hash != renderViewData.DrawLayoutHash) { renderViewData.DrawLayoutHash = drawLighting.Hash; // Generate layout var drawParameterLayout = new ParameterCollectionLayout(); drawParameterLayout.ProcessLogicalGroup(drawLayout, ref drawLighting); drawParameters.UpdateLayout(drawParameterLayout); } Debug.Assert(drawLighting.Hash == renderViewData.DrawLayoutHash, "PerDraw Lighting layout differs between different RenderObject in the same RenderView"); // Compute PerDraw lighting foreach (var directLightGroup in ShaderPermutation.DirectLightGroups) { directLightGroup.ApplyDrawParameters(context, renderViewData.ViewIndex, drawParameters, ref renderNode.RenderObject.BoundingBox); } foreach (var environmentLight in ShaderPermutation.EnvironmentLights) { environmentLight.ApplyDrawParameters(context, renderViewData.ViewIndex, drawParameters, ref renderNode.RenderObject.BoundingBox); } // Update resources renderNode.Resources.UpdateLogicalGroup(ref drawLighting, drawParameters); } } }
public override void Prepare(RenderDrawContext context) { renderVoxelVolumeData = Context.VisibilityGroup.Tags.Get(CurrentProcessedVoxelVolumes); if (renderVoxelVolumeData == null) { return; } foreach (var processedVolumeKeyValue in renderVoxelVolumeData) { var processedVolume = processedVolumeKeyValue.Value; foreach (VoxelizationPass pass in processedVolume.passList.passes) { var viewFeature = pass.view.Features[RootRenderFeature.Index]; // Find a PerView layout from an effect in normal state ViewResourceGroupLayout firstViewLayout = null; foreach (var viewLayout in viewFeature.Layouts) { // Only process view layouts in normal state if (viewLayout.State != RenderEffectState.Normal) { continue; } var viewLighting = viewLayout.GetLogicalGroup(VoxelizerStorerCasterKey); if (viewLighting.Hash != ObjectId.Empty) { firstViewLayout = viewLayout; break; } } // Nothing found for this view (no effects in normal state) if (firstViewLayout == null) { continue; } var viewParameters = new ParameterCollection(); var firstViewLighting = firstViewLayout.GetLogicalGroup(VoxelizerStorerCasterKey); // Prepare layout (should be similar for all PerView) { // Generate layout var viewParameterLayout = new ParameterCollectionLayout(); viewParameterLayout.ProcessLogicalGroup(firstViewLayout, ref firstViewLighting); viewParameters.UpdateLayout(viewParameterLayout); } ParameterCollection VSViewParameters = viewParameters; pass.storer.ApplyVoxelizationParameters(VSViewParameters); foreach (var attr in processedVolume.Attributes) { attr.Attribute.ApplyVoxelizationParameters(VSViewParameters); } foreach (var viewLayout in viewFeature.Layouts) { if (viewLayout.State != RenderEffectState.Normal) { continue; } var voxelizerStorer = viewLayout.GetLogicalGroup(VoxelizerStorerCasterKey); if (voxelizerStorer.Hash == ObjectId.Empty) { continue; } if (voxelizerStorer.Hash != firstViewLighting.Hash) { throw new InvalidOperationException("PerView VoxelizerStorer layout differs between different RenderObject in the same RenderView"); } var resourceGroup = viewLayout.Entries[pass.view.Index].Resources; resourceGroup.UpdateLogicalGroup(ref voxelizerStorer, VSViewParameters); } } } }