private void CopyPlanesYuv420p(NvGpuVmm Vmm, SurfaceOutputConfig OutputConfig) { FFmpegFrame Frame = FFmpegWrapper.GetFrame(); if ((Frame.Width | Frame.Height) == 0) { return; } int HalfSrcWidth = Frame.Width / 2; int HalfWidth = Frame.Width / 2; int HalfHeight = Frame.Height / 2; int AlignedWidth = (OutputConfig.SurfaceWidth + 0xff) & ~0xff; for (int Y = 0; Y < Frame.Height; Y++) { int Src = Y * Frame.Width; int Dst = Y * AlignedWidth; int Size = Frame.Width; for (int Offset = 0; Offset < Size; Offset++) { Vmm.WriteByte(OutputConfig.SurfaceLumaAddress + Dst + Offset, *(Frame.LumaPtr + Src + Offset)); } } //Copy chroma data from both channels with interleaving. for (int Y = 0; Y < HalfHeight; Y++) { int Src = Y * HalfSrcWidth; int Dst = Y * AlignedWidth; for (int X = 0; X < HalfWidth; X++) { Vmm.WriteByte(OutputConfig.SurfaceChromaUAddress + Dst + X * 2 + 0, *(Frame.ChromaBPtr + Src + X)); Vmm.WriteByte(OutputConfig.SurfaceChromaUAddress + Dst + X * 2 + 1, *(Frame.ChromaRPtr + Src + X)); } } }
private void CopyPlanesYuv420P(NvGpuVmm vmm, SurfaceOutputConfig outputConfig) { FFmpegFrame frame = FFmpegWrapper.GetFrame(); if ((frame.Width | frame.Height) == 0) { return; } int halfSrcWidth = frame.Width / 2; int halfWidth = frame.Width / 2; int halfHeight = frame.Height / 2; int alignedWidth = (outputConfig.SurfaceWidth + 0xff) & ~0xff; for (int y = 0; y < frame.Height; y++) { int src = y * frame.Width; int dst = y * alignedWidth; int size = frame.Width; for (int offset = 0; offset < size; offset++) { vmm.WriteByte(outputConfig.SurfaceLumaAddress + dst + offset, *(frame.LumaPtr + src + offset)); } } // Copy chroma data from both channels with interleaving. for (int y = 0; y < halfHeight; y++) { int src = y * halfSrcWidth; int dst = y * alignedWidth; for (int x = 0; x < halfWidth; x++) { vmm.WriteByte(outputConfig.SurfaceChromaUAddress + dst + x * 2 + 0, *(frame.ChromaBPtr + src + x)); vmm.WriteByte(outputConfig.SurfaceChromaUAddress + dst + x * 2 + 1, *(frame.ChromaRPtr + src + x)); } } }
private void PushData(NvGpuVmm vmm, GpuMethodCall methCall) { if (_buffer == null) { return; } Profile.Begin(Profiles.GPU.EngineP2mf.PushData); for (int shift = 0; shift < 32 && _copyOffset < _copySize; shift += 8, _copyOffset++) { _buffer[_copyOffset] = (byte)(methCall.Argument >> shift); } if (methCall.IsLastCall) { if (_copyLinear) { vmm.WriteBytes(_copyAddress, _buffer); } else { BlockLinearSwizzle swizzle = new BlockLinearSwizzle( _copyWidth, _copyHeight, 1, _copyGobBlockHeight, 1, 1); int srcOffset = 0; for (int y = _copyStartY; y < _copyHeight && srcOffset < _copySize; y++) { for (int x = _copyStartX; x < _copyWidth && srcOffset < _copySize; x++) { int dstOffset = swizzle.GetSwizzleOffset(x, y, 0); vmm.WriteByte(_copyAddress + dstOffset, _buffer[srcOffset++]); } } } _buffer = null; } Profile.End(Profiles.GPU.EngineP2mf.PushData); }
private void PushData(NvGpuVmm Vmm, GpuMethodCall MethCall) { if (Buffer == null) { return; } for (int Shift = 0; Shift < 32 && CopyOffset < CopySize; Shift += 8, CopyOffset++) { Buffer[CopyOffset] = (byte)(MethCall.Argument >> Shift); } if (MethCall.IsLastCall) { if (CopyLinear) { Vmm.WriteBytes(CopyAddress, Buffer); } else { BlockLinearSwizzle Swizzle = new BlockLinearSwizzle(CopyWidth, 1, CopyGobBlockHeight); int SrcOffset = 0; for (int Y = CopyStartY; Y < CopyHeight && SrcOffset < CopySize; Y++) { for (int X = CopyStartX; X < CopyWidth && SrcOffset < CopySize; X++) { int DstOffset = Swizzle.GetSwizzleOffset(X, Y); Vmm.WriteByte(CopyAddress + DstOffset, Buffer[SrcOffset++]); } } } Buffer = null; } }
private void Execute(NvGpuVmm Vmm, NvGpuPBEntry PBEntry) { int Control = PBEntry.Arguments[0]; bool SrcLinear = ((Control >> 7) & 1) != 0; bool DstLinear = ((Control >> 8) & 1) != 0; long SrcAddress = MakeInt64From2xInt32(NvGpuEngineDmaReg.SrcAddress); long DstAddress = MakeInt64From2xInt32(NvGpuEngineDmaReg.DstAddress); int SrcPitch = ReadRegister(NvGpuEngineDmaReg.SrcPitch); int DstPitch = ReadRegister(NvGpuEngineDmaReg.DstPitch); int DstBlkDim = ReadRegister(NvGpuEngineDmaReg.DstBlkDim); int DstSizeX = ReadRegister(NvGpuEngineDmaReg.DstSizeX); int DstSizeY = ReadRegister(NvGpuEngineDmaReg.DstSizeY); int DstSizeZ = ReadRegister(NvGpuEngineDmaReg.DstSizeZ); int DstPosXY = ReadRegister(NvGpuEngineDmaReg.DstPosXY); int DstPosZ = ReadRegister(NvGpuEngineDmaReg.DstPosZ); int SrcBlkDim = ReadRegister(NvGpuEngineDmaReg.SrcBlkDim); int SrcSizeX = ReadRegister(NvGpuEngineDmaReg.SrcSizeX); int SrcSizeY = ReadRegister(NvGpuEngineDmaReg.SrcSizeY); int SrcSizeZ = ReadRegister(NvGpuEngineDmaReg.SrcSizeZ); int SrcPosXY = ReadRegister(NvGpuEngineDmaReg.SrcPosXY); int SrcPosZ = ReadRegister(NvGpuEngineDmaReg.SrcPosZ); int DstPosX = (DstPosXY >> 0) & 0xffff; int DstPosY = (DstPosXY >> 16) & 0xffff; int SrcPosX = (SrcPosXY >> 0) & 0xffff; int SrcPosY = (SrcPosXY >> 16) & 0xffff; int SrcBlockHeight = 1 << ((SrcBlkDim >> 4) & 0xf); int DstBlockHeight = 1 << ((DstBlkDim >> 4) & 0xf); ISwizzle SrcSwizzle; if (SrcLinear) { SrcSwizzle = new LinearSwizzle(SrcPitch, 1); } else { SrcSwizzle = new BlockLinearSwizzle(SrcSizeX, 1, SrcBlockHeight); } ISwizzle DstSwizzle; if (DstLinear) { DstSwizzle = new LinearSwizzle(DstPitch, 1); } else { DstSwizzle = new BlockLinearSwizzle(DstSizeX, 1, DstBlockHeight); } for (int Y = 0; Y < DstSizeY; Y++) { for (int X = 0; X < DstSizeX; X++) { long SrcOffset = SrcAddress + (uint)SrcSwizzle.GetSwizzleOffset(X, Y); long DstOffset = DstAddress + (uint)DstSwizzle.GetSwizzleOffset(X, Y); Vmm.WriteByte(DstOffset, Vmm.ReadByte(SrcOffset)); } } }