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