public void Apply(CommandList commandList, ResourceGroup[] resourceGroups, int resourceGroupsOffset) { if (resourceGroupBindings.Length == 0) return; var resourceGroupBinding = Interop.Pin(ref resourceGroupBindings[0]); for (int i = 0; i < resourceGroupBindings.Length; i++, resourceGroupBinding = Interop.IncrementPinned(resourceGroupBinding)) { var resourceGroup = resourceGroups[resourceGroupsOffset + i]; // Upload cbuffer (if not done yet) if (resourceGroupBinding.ConstantBufferSlot != -1 && resourceGroup != null && resourceGroup.ConstantBuffer.Data != IntPtr.Zero) { var preallocatedBuffer = resourceGroup.ConstantBuffer.Buffer; bool needUpdate = true; if (preallocatedBuffer == null) preallocatedBuffer = resourceGroupBinding.ConstantBufferPreallocated; // If it's preallocated buffer, we always upload else if (resourceGroup.ConstantBuffer.Uploaded) needUpdate = false; // If it's not preallocated and already uploaded, we can avoid uploading it again else resourceGroup.ConstantBuffer.Uploaded = true; // First time it is uploaded if (needUpdate) { var mappedConstantBuffer = commandList.MapSubresource(preallocatedBuffer, 0, MapMode.WriteDiscard); Utilities.CopyMemory(mappedConstantBuffer.DataBox.DataPointer, resourceGroup.ConstantBuffer.Data, resourceGroup.ConstantBuffer.Size); commandList.UnmapSubresource(mappedConstantBuffer); } resourceGroup.DescriptorSet.SetConstantBuffer(resourceGroupBinding.ConstantBufferSlot, preallocatedBuffer, 0, resourceGroup.ConstantBuffer.Size); } } }
public EffectParameterUpdater(EffectParameterUpdaterLayout updaterLayout, ParameterCollection parameters) : this() { this.updaterLayout = updaterLayout; this.resourceGroups = new ResourceGroup[updaterLayout.Layouts.Length]; for (int i = 0; i < resourceGroups.Length; ++i) resourceGroups[i] = new ResourceGroup(); parameters.UpdateLayout(updaterLayout.ParameterCollectionLayout); }
public RenderNode(RenderObject renderObject, RenderView renderView, ViewObjectNodeReference viewObjectNode, RenderStage renderStage) { RenderObject = renderObject; RenderView = renderView; ViewObjectNode = viewObjectNode; EffectObjectNode = EffectObjectNodeReference.Invalid; RenderStage = renderStage; RenderEffect = null; Resources = null; }
public ResourceGroup AllocateResourceGroup() { ResourceGroup resourceGroup; if (++currentResourceGroupPoolIndex >= resourceGroupPool.Count) { resourceGroupPool.Add(resourceGroup = new ResourceGroup()); } else { resourceGroup = resourceGroupPool[currentResourceGroupPoolIndex]; // Clear object resourceGroup.DescriptorSet = default(DescriptorSet); resourceGroup.ConstantBuffer = default(BufferPoolAllocationResult); } return resourceGroup; }
public void PrepareResourceGroup(ResourceGroupLayout resourceGroupLayout, BufferPoolAllocationType constantBufferAllocationType, ResourceGroup resourceGroup) { if (resourceGroup == null) throw new InvalidOperationException(); resourceGroup.DescriptorSet = DescriptorSet.New(graphicsDevice, currentDescriptorPool, resourceGroupLayout.DescriptorSetLayout); if (!resourceGroup.DescriptorSet.IsValid) { SetupNextDescriptorPool(); resourceGroup.DescriptorSet = DescriptorSet.New(graphicsDevice, currentDescriptorPool, resourceGroupLayout.DescriptorSetLayout); } if (resourceGroupLayout.ConstantBufferSize > 0) { if (currentBufferPool == null || !currentBufferPool.CanAllocate(resourceGroupLayout.ConstantBufferSize)) { SetupNextBufferPool(); } currentBufferPool.Allocate(graphicsDevice, resourceGroupLayout.ConstantBufferSize, constantBufferAllocationType, ref resourceGroup.ConstantBuffer); } }
public void PrepareResourceGroup(ResourceGroupLayout resourceGroupLayout, BufferPoolAllocationType constantBufferAllocationType, ResourceGroup resourceGroup) { if (resourceGroup == null) { throw new InvalidOperationException(); } resourceGroup.DescriptorSet = DescriptorSet.New(graphicsDevice, currentDescriptorPool, resourceGroupLayout.DescriptorSetLayout); if (!resourceGroup.DescriptorSet.IsValid) { SetupNextDescriptorPool(); resourceGroup.DescriptorSet = DescriptorSet.New(graphicsDevice, currentDescriptorPool, resourceGroupLayout.DescriptorSetLayout); } if (resourceGroupLayout.ConstantBufferSize > 0) { if (!currentBufferPool.CanAllocate(resourceGroupLayout.ConstantBufferSize)) { SetupNextBufferPool(); } currentBufferPool.Allocate(graphicsDevice, resourceGroupLayout.ConstantBufferSize, constantBufferAllocationType, ref resourceGroup.ConstantBuffer); } }