1 /* 2 * Copyright 2023 Google 3 * SPDX-License-Identifier: MIT 4 */ 5 6 #pragma once 7 8 #include "VirtGpu.h" 9 10 class LinuxVirtGpuResource : public std::enable_shared_from_this<LinuxVirtGpuResource>, 11 public VirtGpuResource { 12 public: 13 LinuxVirtGpuResource(int64_t deviceHandle, uint32_t blobHandle, uint32_t resourceHandle, 14 uint64_t size); 15 ~LinuxVirtGpuResource(); 16 17 void intoRaw() override; 18 uint32_t getResourceHandle() const override; 19 uint32_t getBlobHandle() const override; 20 uint64_t getSize() const override; 21 int wait() override; 22 23 VirtGpuResourceMappingPtr createMapping(void) override; 24 int exportBlob(struct VirtGpuExternalHandle& handle) override; 25 26 int transferFromHost(uint32_t x, uint32_t y, uint32_t w, uint32_t h) override; 27 int transferToHost(uint32_t x, uint32_t y, uint32_t w, uint32_t h) override; 28 29 private: 30 // Not owned. Really should use a ScopedFD for this, but doesn't matter since we have a 31 // singleton deviceimplemenentation anyways. 32 int64_t mDeviceHandle; 33 34 uint32_t mBlobHandle; 35 uint32_t mResourceHandle; 36 uint64_t mSize; 37 }; 38 39 class LinuxVirtGpuResourceMapping : public VirtGpuResourceMapping { 40 public: 41 LinuxVirtGpuResourceMapping(VirtGpuResourcePtr blob, uint8_t* ptr, uint64_t size); 42 ~LinuxVirtGpuResourceMapping(void); 43 44 uint8_t* asRawPtr(void) override; 45 46 private: 47 VirtGpuResourcePtr mBlob; 48 uint8_t* mPtr; 49 uint64_t mSize; 50 }; 51 52 class LinuxVirtGpuDevice : public VirtGpuDevice { 53 public: 54 LinuxVirtGpuDevice(enum VirtGpuCapset capset, int fd = -1); 55 virtual ~LinuxVirtGpuDevice(); 56 57 virtual int64_t getDeviceHandle(void); 58 59 virtual struct VirtGpuCaps getCaps(void); 60 61 VirtGpuResourcePtr createBlob(const struct VirtGpuCreateBlob& blobCreate) override; 62 VirtGpuResourcePtr createResource(uint32_t width, uint32_t height, uint32_t stride, 63 uint32_t size, uint32_t virglFormat, uint32_t target, 64 uint32_t bind) override; 65 66 virtual VirtGpuResourcePtr importBlob(const struct VirtGpuExternalHandle& handle); 67 virtual int execBuffer(struct VirtGpuExecBuffer& execbuffer, const VirtGpuResource* blob); 68 69 private: 70 int64_t mDeviceHandle; 71 struct VirtGpuCaps mCaps; 72 }; 73