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; }
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()); }
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)); } }
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); }
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; }
protected Shader(ShaderStageMask stage, string source) { this.stage = stage; this.source = source; }
public PlatformShader(PlatformRenderContext context, ShaderStageMask stage, string source) { this.context = context; Stage = stage; Create(source); }
public IPlatformShader CreateShader(ShaderStageMask stage, string source) { return(new PlatformShader(this, stage, source)); }
internal PlatformShader(PlatformRenderContext context, ShaderStageMask stage, string source) { Context = context; Stage = stage; Initialize(source); }