Example #1
0
        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);
        }
Example #2
0
        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);
                    }
                }
            }
        }
Example #3
0
        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);
                }
            }
        }
Example #4
0
        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);
            }
        }
Example #5
0
        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);
                }
            }
        }
Example #6
0
 public GLNextDescriptorSet(uint key, IGLNextDescriptorPool parent)
 {
     Key    = key;
     Parent = parent;
     IsValidDescriptorSet = false;
 }