1*61046927SAndroid Build Coastguard Worker /* 2*61046927SAndroid Build Coastguard Worker * Copyright 2018 Google LLC 3*61046927SAndroid Build Coastguard Worker * SPDX-License-Identifier: MIT 4*61046927SAndroid Build Coastguard Worker */ 5*61046927SAndroid Build Coastguard Worker 6*61046927SAndroid Build Coastguard Worker #pragma once 7*61046927SAndroid Build Coastguard Worker 8*61046927SAndroid Build Coastguard Worker #include <stdlib.h> 9*61046927SAndroid Build Coastguard Worker 10*61046927SAndroid Build Coastguard Worker #include "VirtGpu.h" 11*61046927SAndroid Build Coastguard Worker #include "gfxstream/guest/IOStream.h" 12*61046927SAndroid Build Coastguard Worker 13*61046927SAndroid Build Coastguard Worker /* This file implements an IOStream that uses VIRTGPU TRANSFER* ioctls on a 14*61046927SAndroid Build Coastguard Worker * virtio-gpu DRM rendernode device to communicate with a goldfish-pipe 15*61046927SAndroid Build Coastguard Worker * service on the host side. 16*61046927SAndroid Build Coastguard Worker */ 17*61046927SAndroid Build Coastguard Worker 18*61046927SAndroid Build Coastguard Worker class VirtioGpuPipeStream : public gfxstream::guest::IOStream { 19*61046927SAndroid Build Coastguard Worker public: 20*61046927SAndroid Build Coastguard Worker explicit VirtioGpuPipeStream(size_t bufsize, int32_t descriptor); 21*61046927SAndroid Build Coastguard Worker ~VirtioGpuPipeStream(); 22*61046927SAndroid Build Coastguard Worker 23*61046927SAndroid Build Coastguard Worker virtual int connect(const char* serviceName = nullptr); 24*61046927SAndroid Build Coastguard Worker virtual uint64_t processPipeInit(); 25*61046927SAndroid Build Coastguard Worker 26*61046927SAndroid Build Coastguard Worker virtual void* allocBuffer(size_t minSize); 27*61046927SAndroid Build Coastguard Worker virtual int commitBuffer(size_t size); 28*61046927SAndroid Build Coastguard Worker virtual const unsigned char* readFully(void* buf, size_t len); 29*61046927SAndroid Build Coastguard Worker virtual const unsigned char* commitBufferAndReadFully(size_t size, void* buf, size_t len); 30*61046927SAndroid Build Coastguard Worker virtual const unsigned char* read(void* buf, size_t* inout_len); 31*61046927SAndroid Build Coastguard Worker 32*61046927SAndroid Build Coastguard Worker bool valid(); 33*61046927SAndroid Build Coastguard Worker int getRendernodeFd(); 34*61046927SAndroid Build Coastguard Worker int recv(void* buf, size_t len); 35*61046927SAndroid Build Coastguard Worker 36*61046927SAndroid Build Coastguard Worker virtual int writeFully(const void* buf, size_t len); 37*61046927SAndroid Build Coastguard Worker 38*61046927SAndroid Build Coastguard Worker private: 39*61046927SAndroid Build Coastguard Worker // sync. Also resets the write position. 40*61046927SAndroid Build Coastguard Worker void wait(); 41*61046927SAndroid Build Coastguard Worker 42*61046927SAndroid Build Coastguard Worker // transfer to/from host ops 43*61046927SAndroid Build Coastguard Worker ssize_t transferToHost(const void* buffer, size_t len); 44*61046927SAndroid Build Coastguard Worker ssize_t transferFromHost(void* buffer, size_t len); 45*61046927SAndroid Build Coastguard Worker 46*61046927SAndroid Build Coastguard Worker int32_t m_fd = -1; 47*61046927SAndroid Build Coastguard Worker std::unique_ptr<VirtGpuDevice> m_device; 48*61046927SAndroid Build Coastguard Worker VirtGpuResourcePtr m_resource; 49*61046927SAndroid Build Coastguard Worker VirtGpuResourceMappingPtr m_resourceMapping; 50*61046927SAndroid Build Coastguard Worker unsigned char* m_virtio_mapped; // user mapping of bo 51*61046927SAndroid Build Coastguard Worker 52*61046927SAndroid Build Coastguard Worker // intermediate buffer 53*61046927SAndroid Build Coastguard Worker size_t m_bufsize; 54*61046927SAndroid Build Coastguard Worker unsigned char* m_buf; 55*61046927SAndroid Build Coastguard Worker 56*61046927SAndroid Build Coastguard Worker size_t m_writtenPos; 57*61046927SAndroid Build Coastguard Worker }; 58