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);
    }
Example #2
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)
                };
            }