uint BindStorageBuffer(IGLDescriptorSet ds, GLDescriptorPoolResourceInfo resource, uint[] dynamicOffsets, uint offsetIndex) { IGLNextDescriptorPool parentPool = ds.Parent; Debug.Assert(parentPool != null); // BIND SSBOS if (resource.DescriptorCount > 1) { throw new InvalidOperationException("Mg.GL : only one storage buffer per a binding allowed."); } for (var i = resource.Ticket.First; i <= resource.Ticket.Last; i += 1) { var buffer = parentPool.StorageBuffers.Items[i]; var offset = buffer.Offset; // WHAT ABOUT THE DYNAMIC OFFSET if (buffer.IsDynamic) { offset += AdjustOffset(dynamicOffsets, ref offsetIndex); } mEntrypoint.BindStorageBuffer( resource.Binding, buffer.BufferId, new IntPtr(offset), new IntPtr(buffer.Size)); } return(offsetIndex); }
static void UpdateStorageBuffer( MgWriteDescriptorSet desc, IGLNextDescriptorPool pool, GLDescriptorPoolResourceInfo ticket, uint first, uint count, string errorParameterName ) { if (ticket.GroupType == GLDescriptorBindingGroup.StorageBuffer) { for (var j = 0; j < count; j += 1) { var info = desc.BufferInfo[j]; var buf = (IGLBuffer)info.Buffer; var isBufferFlags = MgBufferUsageFlagBits.STORAGE_BUFFER_BIT; if (buf != null && ((buf.Usage & isBufferFlags) == isBufferFlags)) { var index = first + j; var bufferDesc = pool.StorageBuffers.Items[index]; bufferDesc.BufferId = buf.BufferId; if (info.Offset > (ulong)long.MaxValue) { throw new ArgumentOutOfRangeException(errorParameterName + ".BufferInfo[" + j + "].Offset is > long.MaxValue"); } // CROSS PLATFORM ISSUE : VK_WHOLE_SIZE == ulong.MaxValue if (info.Range == ulong.MaxValue) { throw new ArgumentOutOfRangeException( "Mg.OpenGL : Cannot accept " + errorParameterName + ".BufferInfo[" + j + "].Range == ulong.MaxValue (VK_WHOLE_SIZE). Please use actual size of buffer instead."); } if (info.Range > (ulong)int.MaxValue) { throw new ArgumentOutOfRangeException( errorParameterName + ".BufferInfo[" + j + "].Range is > int.MaxValue"); } bufferDesc.Offset = (long)info.Offset; // need to pass in whole bufferDesc.Size = (int)info.Range; bufferDesc.IsDynamic = (desc.DescriptorType == MgDescriptorType.STORAGE_BUFFER_DYNAMIC); } } } }
void BindCombinedSampler(IGLDescriptorSet ds, GLDescriptorPoolResourceInfo resource) { IGLNextDescriptorPool parentPool = ds.Parent; Debug.Assert(parentPool != null); for (var i = resource.Ticket.First; i <= resource.Ticket.Last; i += 1) { var image = parentPool.CombinedImageSamplers.Items[i]; if (image.SamplerHandle.HasValue) { mEntrypoint.BindCombinedImageSampler(ProgramID, (int)resource.Binding, image.SamplerHandle.Value); } } }
uint BindUniformBuffer(IGLDescriptorSet ds, GLDescriptorPoolResourceInfo resource, uint[] dynamicOffsets, uint offsetIndex) { // do diff if (BoundPipelineLayout != null) { IGLNextDescriptorPool parentPool = ds.Parent; Debug.Assert(parentPool != null); // for each active uniform block var uniformGroup = BoundPipelineLayout.Ranges[(int)resource.Binding]; var srcIndex = resource.Ticket.First; var dstIndex = uniformGroup.First; for (var j = 0; j < resource.DescriptorCount; j += 1) { var buffer = parentPool.UniformBuffers.Items[srcIndex]; mUniformBuffers[dstIndex] = buffer.BufferId; var offset = buffer.Offset; // WHAT DYNAMIC if (buffer.IsDynamic) { offset += AdjustOffset(dynamicOffsets, ref offsetIndex); } mUniformOffsets[dstIndex] = new IntPtr(offset); mUniformSizes[dstIndex] = new IntPtr(buffer.Size); srcIndex += 1; dstIndex += 1; } return(offsetIndex); } else { return(offsetIndex); } }
void UpdateCombinedImageSamplers(MgWriteDescriptorSet desc, IGLNextDescriptorPool parentPool, GLDescriptorPoolResourceInfo ticket, uint first, uint count) { if (ticket.GroupType == GLDescriptorBindingGroup.CombinedImageSampler) { for (var j = 0; j < count; j += 1) { MgDescriptorImageInfo info = desc.ImageInfo[j]; var localSampler = (GLSampler)info.Sampler; var localView = (GLImageView)info.ImageView; // Generate bindless texture handle // FIXME : messy as F*** var texHandle = mImage.CreateHandle(localView.TextureId, localSampler.SamplerId); var index = first + j; parentPool.CombinedImageSamplers.Items[index].Replace(texHandle); } } }
public GLNextDescriptorSet(uint key, IGLNextDescriptorPool parent) { Key = key; Parent = parent; IsValidDescriptorSet = false; }