public GpuVideo(string pathForStreamingAssets) { _pathForStreamingAssets = pathForStreamingAssets; _filestream = File.OpenRead(Application.streamingAssetsPath + "/" + pathForStreamingAssets); { var reader = new BinaryReader(_filestream); _width = (int)reader.ReadUInt32(); _height = (int)reader.ReadUInt32(); _frameCount = (int)reader.ReadUInt32(); _framePerSecond = reader.ReadSingle(); int fmt = (int)reader.ReadUInt32(); _format = System.Enum.IsDefined(typeof(TextureFormat), fmt) ? (GpuTextureFormat)fmt : GpuTextureFormat.Dxt1; _frameBytes = (int)reader.ReadUInt32(); } _filestream.Seek(_filestream.Length - _frameCount * 16 /*block def*/, SeekOrigin.Begin); { var reader = new BinaryReader(_filestream); _lz4Blocks.Capacity = _frameCount; ulong maxSize = 0; for (int i = 0; i < _frameCount; ++i) { Lz4Block block = new Lz4Block(); block.address = reader.ReadUInt64(); block.size = reader.ReadUInt64(); _lz4Blocks.Add(block); // Debug.Log (string.Format ("block {0}, {0}", block.address, block.size)); maxSize = maxSize < block.size ? block.size : maxSize; } _lz4Buffer = new byte[maxSize]; _lz4BufferNative = Marshal.AllocHGlobal((int)maxSize); } TextureFormat textureFmt = TextureFormat.ARGB32; switch (_format) { case GpuTextureFormat.Dxt1: textureFmt = TextureFormat.DXT1; break; case GpuTextureFormat.Dxt3: Debug.Assert(false, "Not Supperted Fomat DXT 3"); break; case GpuTextureFormat.Dxt5: textureFmt = TextureFormat.DXT5; break; } _texture = new Texture2D(_width, _height, textureFmt, false); _textureBuffer = new byte[_frameBytes]; _textureBufferNative = Marshal.AllocHGlobal(_frameBytes); this.setFrame(0); }
public Configure(GpuDevice device, Settings settings, GpuBindGroupLayout bindGroupLayout, GpuBindGroupLayout dynamicBindGroupLayout, GpuBindGroupLayout timeBindGroupLayout, GpuRenderPipeline pipeline, GpuRenderPipeline dynamicPipeline, GpuBuffer vertexBuffer, GpuTextureFormat swapChainFormat) { Device = device; Settings = settings; Pipeline = pipeline; DynamicPipeline = dynamicPipeline; VertexBuffer = vertexBuffer; SwapChainFormat = swapChainFormat; UniformBuffer = Device.CreateBuffer(new GpuBufferDescriptor(Settings.NumTriangles * AlignedUniformBytes + sizeof(float), GpuBufferUsageFlags.Uniform | GpuBufferUsageFlags.CopyDst)); var uniformCpuBuffer = new Windows.Storage.Streams.Buffer(Settings.NumTriangles * AlignedUniformBytes) { Length = Settings.NumTriangles * AlignedUniformBytes }; using (var uniformCpuStream = uniformCpuBuffer.AsStream()) using (var uniformCpuWriter = new BinaryWriter(uniformCpuStream)) { var rand = new Random(); for (var i = 0; i < Settings.NumTriangles; ++i) { uniformCpuWriter.Seek((int)(i * AlignedUniformBytes), SeekOrigin.Begin); float scale = (float)(rand.NextDouble() * 0.2 + 0.2); //scale = 5; float offsetX = (float)(0.9 * 2 * (rand.NextDouble() - 0.5)); float offsetY = (float)(0.9 * 2 * (rand.NextDouble() - 0.5)); float scalar = (float)(rand.NextDouble() * 1.5 + 0.5); float scalarOffset = (float)(rand.NextDouble() * 10); uniformCpuWriter.Write(scale); //Scale uniformCpuWriter.Write(offsetX); //offsetX uniformCpuWriter.Write(offsetY); //offsetY uniformCpuWriter.Write(scalar); //scalar uniformCpuWriter.Write(scalarOffset); //scalar offset } } BindGroups = new GpuBindGroup[Settings.NumTriangles]; for (var i = 0; i < Settings.NumTriangles; ++i) { BindGroups[i] = Device.CreateBindGroup(new GpuBindGroupDescriptor(bindGroupLayout, new GpuBindGroupEntry[] { new GpuBindGroupEntry(0, new GpuBufferBinding(UniformBuffer, 6 * sizeof(float)) { Offset = (UInt64)(i * AlignedUniformBytes) }) })); } DynamicBindGroup = Device.CreateBindGroup(new GpuBindGroupDescriptor(dynamicBindGroupLayout, new GpuBindGroupEntry[] { new GpuBindGroupEntry(0, new GpuBufferBinding(UniformBuffer, 6 * sizeof(float))) })); TimeBindGroup = Device.CreateBindGroup(new GpuBindGroupDescriptor(timeBindGroupLayout, new GpuBindGroupEntry[] { new GpuBindGroupEntry(0, new GpuBufferBinding(UniformBuffer, sizeof(float)) { Offset = TimeOffset }) })); Device.DefaultQueue.WriteBuffer(UniformBuffer, 0, uniformCpuBuffer); var renderBundleEncoder = Device.CreateRenderBundleEncoder(new GpuRenderBundleEncoderDescriptor(new GpuTextureFormat[] { SwapChainFormat })); RecordRenderPass(renderBundleEncoder); RenderBundle = renderBundleEncoder.Finish(); UniformTimeCpuBuffer = new Windows.Storage.Streams.Buffer(sizeof(float)) { Length = sizeof(float) }; }