示例#1
0
        public void SetUniform(int index, IntPtr data, int elementCount)
        {
            var info = uniformInfos[index];

            if (info.StagingOffset < 0)
            {
                throw new InvalidOperationException();
            }
            elementCount = Math.Min(elementCount, info.ArraySize);
            var dstData = uniformStagingData + info.StagingOffset;

            if (info.ColumnStride == info.ColumnSize)
            {
                GraphicsUtility.CopyMemory(dstData, data, info.ColumnSize * info.ColumnCount * elementCount);
            }
            else
            {
                var totalCols = info.ColumnCount * elementCount;
                for (var i = 0; i < totalCols; i++)
                {
                    GraphicsUtility.CopyMemory(dstData, data, info.ColumnSize);
                    dstData += info.ColumnStride;
                    data    += info.ColumnSize;
                }
            }
            dirtyStageMask |= info.StageMask;
        }
示例#2
0
        private static long ComputeHash(ShaderStageMask stage, string source)
        {
            var hasher = new Hasher();

            hasher.Begin();
            hasher.Write(stage);
            hasher.Write(source.Length);
            hasher.Write(source);
            return(hasher.End());
        }
示例#3
0
        public static ShaderType GetGLShaderType(ShaderStageMask stage)
        {
            switch (stage)
            {
            case ShaderStageMask.Vertex:
                return(ShaderType.VertexShader);

            case ShaderStageMask.Fragment:
                return(ShaderType.FragmentShader);

            default:
                throw new ArgumentException(nameof(stage));
            }
        }
示例#4
0
        public static SharpVulkan.ShaderStageFlags GetVKShaderStageFlags(ShaderStageMask mask)
        {
            var result = SharpVulkan.ShaderStageFlags.None;

            if ((mask & ShaderStageMask.Vertex) != 0)
            {
                result |= SharpVulkan.ShaderStageFlags.Vertex;
            }
            if ((mask & ShaderStageMask.Fragment) != 0)
            {
                result |= SharpVulkan.ShaderStageFlags.Fragment;
            }
            return(result);
        }
示例#5
0
 internal void UpdateUniformBuffers(ulong fenceValue)
 {
     for (var i = 0; i < uniformBuffers.Length; i++)
     {
         var buffer     = uniformBuffers[i];
         var bufferInfo = uniformBufferInfos[i];
         if ((dirtyStageMask & bufferInfo.Stage) == 0)
         {
             continue;
         }
         buffer.DiscardSlice(uniformBufferWriteFenceValue);
         var bufferData = buffer.MapSlice();
         foreach (var templateEntry in bufferInfo.UpdateTemplate)
         {
             var dstData = bufferData + templateEntry.BufferOffset;
             var srcData = uniformStagingData + templateEntry.StagingOffset;
             GraphicsUtility.CopyMemory(dstData, srcData, templateEntry.Size);
         }
         buffer.UnmapSlice();
     }
     uniformBufferWriteFenceValue = fenceValue;
     dirtyStageMask = ShaderStageMask.None;
 }
示例#6
0
 protected Shader(ShaderStageMask stage, string source)
 {
     this.stage  = stage;
     this.source = source;
 }
示例#7
0
 public PlatformShader(PlatformRenderContext context, ShaderStageMask stage, string source)
 {
     this.context = context;
     Stage        = stage;
     Create(source);
 }
示例#8
0
 public IPlatformShader CreateShader(ShaderStageMask stage, string source)
 {
     return(new PlatformShader(this, stage, source));
 }
示例#9
0
 internal PlatformShader(PlatformRenderContext context, ShaderStageMask stage, string source)
 {
     Context = context;
     Stage   = stage;
     Initialize(source);
 }