1cb93a386Sopenharmony_ci/* 2cb93a386Sopenharmony_ci * Copyright 2020 Google LLC 3cb93a386Sopenharmony_ci * 4cb93a386Sopenharmony_ci * Use of this source code is governed by a BSD-style license that can be 5cb93a386Sopenharmony_ci * found in the LICENSE file. 6cb93a386Sopenharmony_ci */ 7cb93a386Sopenharmony_ci 8cb93a386Sopenharmony_ci#ifndef GrD3DGpu_DEFINED 9cb93a386Sopenharmony_ci#define GrD3DGpu_DEFINED 10cb93a386Sopenharmony_ci 11cb93a386Sopenharmony_ci#include "include/private/SkDeque.h" 12cb93a386Sopenharmony_ci#include "src/gpu/GrGpu.h" 13cb93a386Sopenharmony_ci#include "src/gpu/GrRenderTarget.h" 14cb93a386Sopenharmony_ci#include "src/gpu/GrSemaphore.h" 15cb93a386Sopenharmony_ci#include "src/gpu/GrStagingBufferManager.h" 16cb93a386Sopenharmony_ci#include "src/gpu/d3d/GrD3DCaps.h" 17cb93a386Sopenharmony_ci#include "src/gpu/d3d/GrD3DCommandList.h" 18cb93a386Sopenharmony_ci#include "src/gpu/d3d/GrD3DResourceProvider.h" 19cb93a386Sopenharmony_ci 20cb93a386Sopenharmony_cistruct GrD3DBackendContext; 21cb93a386Sopenharmony_ciclass GrD3DOpsRenderPass; 22cb93a386Sopenharmony_cistruct GrD3DOptions; 23cb93a386Sopenharmony_ciclass GrPipeline; 24cb93a386Sopenharmony_ci#if GR_TEST_UTILS 25cb93a386Sopenharmony_cistruct IDXGraphicsAnalysis; 26cb93a386Sopenharmony_ci#endif 27cb93a386Sopenharmony_ci 28cb93a386Sopenharmony_ciclass GrD3DGpu : public GrGpu { 29cb93a386Sopenharmony_cipublic: 30cb93a386Sopenharmony_ci static sk_sp<GrGpu> Make(const GrD3DBackendContext& backendContext, const GrContextOptions&, 31cb93a386Sopenharmony_ci GrDirectContext*); 32cb93a386Sopenharmony_ci 33cb93a386Sopenharmony_ci ~GrD3DGpu() override; 34cb93a386Sopenharmony_ci 35cb93a386Sopenharmony_ci const GrD3DCaps& d3dCaps() const { return static_cast<const GrD3DCaps&>(*this->caps()); } 36cb93a386Sopenharmony_ci 37cb93a386Sopenharmony_ci GrD3DResourceProvider& resourceProvider() { return fResourceProvider; } 38cb93a386Sopenharmony_ci 39cb93a386Sopenharmony_ci GrThreadSafePipelineBuilder* pipelineBuilder() override; 40cb93a386Sopenharmony_ci sk_sp<GrThreadSafePipelineBuilder> refPipelineBuilder() override; 41cb93a386Sopenharmony_ci 42cb93a386Sopenharmony_ci ID3D12Device* device() const { return fDevice.get(); } 43cb93a386Sopenharmony_ci ID3D12CommandQueue* queue() const { return fQueue.get(); } 44cb93a386Sopenharmony_ci 45cb93a386Sopenharmony_ci GrD3DMemoryAllocator* memoryAllocator() const { return fMemoryAllocator.get(); } 46cb93a386Sopenharmony_ci 47cb93a386Sopenharmony_ci GrD3DDirectCommandList* currentCommandList() const { return fCurrentDirectCommandList.get(); } 48cb93a386Sopenharmony_ci 49cb93a386Sopenharmony_ci GrStagingBufferManager* stagingBufferManager() override { return &fStagingBufferManager; } 50cb93a386Sopenharmony_ci void takeOwnershipOfBuffer(sk_sp<GrGpuBuffer>) override; 51cb93a386Sopenharmony_ci 52cb93a386Sopenharmony_ci GrRingBuffer* uniformsRingBuffer() override { return &fConstantsRingBuffer; } 53cb93a386Sopenharmony_ci 54cb93a386Sopenharmony_ci bool protectedContext() const { return false; } 55cb93a386Sopenharmony_ci 56cb93a386Sopenharmony_ci void xferBarrier(GrRenderTarget*, GrXferBarrierType) override {} 57cb93a386Sopenharmony_ci 58cb93a386Sopenharmony_ci void deleteBackendTexture(const GrBackendTexture&) override; 59cb93a386Sopenharmony_ci 60cb93a386Sopenharmony_ci bool compile(const GrProgramDesc&, const GrProgramInfo&) override; 61cb93a386Sopenharmony_ci 62cb93a386Sopenharmony_ci#if GR_TEST_UTILS 63cb93a386Sopenharmony_ci bool isTestingOnlyBackendTexture(const GrBackendTexture&) const override; 64cb93a386Sopenharmony_ci 65cb93a386Sopenharmony_ci GrBackendRenderTarget createTestingOnlyBackendRenderTarget(SkISize dimensions, 66cb93a386Sopenharmony_ci GrColorType, 67cb93a386Sopenharmony_ci int sampleCnt, 68cb93a386Sopenharmony_ci GrProtected) override; 69cb93a386Sopenharmony_ci void deleteTestingOnlyBackendRenderTarget(const GrBackendRenderTarget&) override; 70cb93a386Sopenharmony_ci 71cb93a386Sopenharmony_ci void testingOnly_startCapture() override; 72cb93a386Sopenharmony_ci void testingOnly_endCapture() override; 73cb93a386Sopenharmony_ci 74cb93a386Sopenharmony_ci void resetShaderCacheForTesting() const override { 75cb93a386Sopenharmony_ci fResourceProvider.resetShaderCacheForTesting(); 76cb93a386Sopenharmony_ci } 77cb93a386Sopenharmony_ci#endif 78cb93a386Sopenharmony_ci 79cb93a386Sopenharmony_ci sk_sp<GrAttachment> makeStencilAttachment(const GrBackendFormat& /*colorFormat*/, 80cb93a386Sopenharmony_ci SkISize dimensions, int numStencilSamples) override; 81cb93a386Sopenharmony_ci 82cb93a386Sopenharmony_ci GrBackendFormat getPreferredStencilFormat(const GrBackendFormat&) override { 83cb93a386Sopenharmony_ci return GrBackendFormat::MakeDxgi(this->d3dCaps().preferredStencilFormat()); 84cb93a386Sopenharmony_ci } 85cb93a386Sopenharmony_ci 86cb93a386Sopenharmony_ci sk_sp<GrAttachment> makeMSAAAttachment(SkISize dimensions, 87cb93a386Sopenharmony_ci const GrBackendFormat& format, 88cb93a386Sopenharmony_ci int numSamples, 89cb93a386Sopenharmony_ci GrProtected isProtected, 90cb93a386Sopenharmony_ci GrMemoryless isMemoryless) override { 91cb93a386Sopenharmony_ci return nullptr; 92cb93a386Sopenharmony_ci } 93cb93a386Sopenharmony_ci 94cb93a386Sopenharmony_ci void addResourceBarriers(sk_sp<GrManagedResource> resource, 95cb93a386Sopenharmony_ci int numBarriers, 96cb93a386Sopenharmony_ci D3D12_RESOURCE_TRANSITION_BARRIER* barriers) const; 97cb93a386Sopenharmony_ci 98cb93a386Sopenharmony_ci void addBufferResourceBarriers(GrD3DBuffer* buffer, 99cb93a386Sopenharmony_ci int numBarriers, 100cb93a386Sopenharmony_ci D3D12_RESOURCE_TRANSITION_BARRIER* barriers) const; 101cb93a386Sopenharmony_ci 102cb93a386Sopenharmony_ci GrFence SK_WARN_UNUSED_RESULT insertFence() override; 103cb93a386Sopenharmony_ci bool waitFence(GrFence) override; 104cb93a386Sopenharmony_ci void deleteFence(GrFence) const override {} 105cb93a386Sopenharmony_ci 106cb93a386Sopenharmony_ci std::unique_ptr<GrSemaphore> SK_WARN_UNUSED_RESULT makeSemaphore(bool isOwned) override; 107cb93a386Sopenharmony_ci std::unique_ptr<GrSemaphore> wrapBackendSemaphore(const GrBackendSemaphore&, 108cb93a386Sopenharmony_ci GrSemaphoreWrapType, 109cb93a386Sopenharmony_ci GrWrapOwnership) override; 110cb93a386Sopenharmony_ci void insertSemaphore(GrSemaphore* semaphore) override; 111cb93a386Sopenharmony_ci void waitSemaphore(GrSemaphore* semaphore) override; 112cb93a386Sopenharmony_ci std::unique_ptr<GrSemaphore> prepareTextureForCrossContextUsage(GrTexture*) override { 113cb93a386Sopenharmony_ci return nullptr; 114cb93a386Sopenharmony_ci } 115cb93a386Sopenharmony_ci 116cb93a386Sopenharmony_ci void submit(GrOpsRenderPass* renderPass) override; 117cb93a386Sopenharmony_ci void endRenderPass(GrRenderTarget* target, GrSurfaceOrigin origin, 118cb93a386Sopenharmony_ci const SkIRect& bounds); 119cb93a386Sopenharmony_ci 120cb93a386Sopenharmony_ci void checkFinishProcs() override { this->checkForFinishedCommandLists(); } 121cb93a386Sopenharmony_ci void finishOutstandingGpuWork() override; 122cb93a386Sopenharmony_ci 123cb93a386Sopenharmony_ciprivate: 124cb93a386Sopenharmony_ci enum class SyncQueue { 125cb93a386Sopenharmony_ci kForce, 126cb93a386Sopenharmony_ci kSkip 127cb93a386Sopenharmony_ci }; 128cb93a386Sopenharmony_ci 129cb93a386Sopenharmony_ci GrD3DGpu(GrDirectContext*, const GrContextOptions&, const GrD3DBackendContext&, 130cb93a386Sopenharmony_ci sk_sp<GrD3DMemoryAllocator>); 131cb93a386Sopenharmony_ci 132cb93a386Sopenharmony_ci void destroyResources(); 133cb93a386Sopenharmony_ci 134cb93a386Sopenharmony_ci sk_sp<GrTexture> onCreateTexture(SkISize, 135cb93a386Sopenharmony_ci const GrBackendFormat&, 136cb93a386Sopenharmony_ci GrRenderable, 137cb93a386Sopenharmony_ci int renderTargetSampleCnt, 138cb93a386Sopenharmony_ci SkBudgeted, 139cb93a386Sopenharmony_ci GrProtected, 140cb93a386Sopenharmony_ci int mipLevelCount, 141cb93a386Sopenharmony_ci uint32_t levelClearMask) override; 142cb93a386Sopenharmony_ci 143cb93a386Sopenharmony_ci sk_sp<GrTexture> onCreateCompressedTexture(SkISize dimensions, 144cb93a386Sopenharmony_ci const GrBackendFormat&, 145cb93a386Sopenharmony_ci SkBudgeted, 146cb93a386Sopenharmony_ci GrMipmapped, 147cb93a386Sopenharmony_ci GrProtected, 148cb93a386Sopenharmony_ci const void* data, size_t dataSize) override; 149cb93a386Sopenharmony_ci 150cb93a386Sopenharmony_ci sk_sp<GrTexture> onCreateCompressedTexture(SkISize dimensions, 151cb93a386Sopenharmony_ci const GrBackendFormat&, 152cb93a386Sopenharmony_ci SkBudgeted, 153cb93a386Sopenharmony_ci GrMipmapped, 154cb93a386Sopenharmony_ci GrProtected, 155cb93a386Sopenharmony_ci OH_NativeBuffer* nativeBuffer, 156cb93a386Sopenharmony_ci size_t bufferSize) override; 157cb93a386Sopenharmony_ci 158cb93a386Sopenharmony_ci sk_sp<GrTexture> onWrapBackendTexture(const GrBackendTexture&, 159cb93a386Sopenharmony_ci GrWrapOwnership, 160cb93a386Sopenharmony_ci GrWrapCacheable, 161cb93a386Sopenharmony_ci GrIOType) override; 162cb93a386Sopenharmony_ci sk_sp<GrTexture> onWrapCompressedBackendTexture(const GrBackendTexture&, 163cb93a386Sopenharmony_ci GrWrapOwnership, 164cb93a386Sopenharmony_ci GrWrapCacheable) override; 165cb93a386Sopenharmony_ci 166cb93a386Sopenharmony_ci sk_sp<GrTexture> onWrapRenderableBackendTexture(const GrBackendTexture&, 167cb93a386Sopenharmony_ci int sampleCnt, 168cb93a386Sopenharmony_ci GrWrapOwnership, 169cb93a386Sopenharmony_ci GrWrapCacheable) override; 170cb93a386Sopenharmony_ci 171cb93a386Sopenharmony_ci sk_sp<GrRenderTarget> onWrapBackendRenderTarget(const GrBackendRenderTarget&) override; 172cb93a386Sopenharmony_ci 173cb93a386Sopenharmony_ci sk_sp<GrGpuBuffer> onCreateBuffer(size_t sizeInBytes, GrGpuBufferType, GrAccessPattern, 174cb93a386Sopenharmony_ci const void*) override; 175cb93a386Sopenharmony_ci 176cb93a386Sopenharmony_ci bool onReadPixels(GrSurface*, 177cb93a386Sopenharmony_ci SkIRect, 178cb93a386Sopenharmony_ci GrColorType surfaceColorType, 179cb93a386Sopenharmony_ci GrColorType dstColorType, 180cb93a386Sopenharmony_ci void*, 181cb93a386Sopenharmony_ci size_t rowBytes) override; 182cb93a386Sopenharmony_ci 183cb93a386Sopenharmony_ci bool onWritePixels(GrSurface*, 184cb93a386Sopenharmony_ci SkIRect, 185cb93a386Sopenharmony_ci GrColorType surfaceColorType, 186cb93a386Sopenharmony_ci GrColorType srcColorType, 187cb93a386Sopenharmony_ci const GrMipLevel[], 188cb93a386Sopenharmony_ci int mipLevelCount, 189cb93a386Sopenharmony_ci bool prepForTexSampling) override; 190cb93a386Sopenharmony_ci 191cb93a386Sopenharmony_ci bool onTransferPixelsTo(GrTexture*, 192cb93a386Sopenharmony_ci SkIRect, 193cb93a386Sopenharmony_ci GrColorType surfaceColorType, 194cb93a386Sopenharmony_ci GrColorType bufferColorType, 195cb93a386Sopenharmony_ci sk_sp<GrGpuBuffer>, 196cb93a386Sopenharmony_ci size_t offset, 197cb93a386Sopenharmony_ci size_t rowBytes) override; 198cb93a386Sopenharmony_ci 199cb93a386Sopenharmony_ci bool onTransferPixelsFrom(GrSurface*, 200cb93a386Sopenharmony_ci SkIRect, 201cb93a386Sopenharmony_ci GrColorType surfaceColorType, 202cb93a386Sopenharmony_ci GrColorType bufferColorType, 203cb93a386Sopenharmony_ci sk_sp<GrGpuBuffer>, 204cb93a386Sopenharmony_ci size_t offset) override; 205cb93a386Sopenharmony_ci 206cb93a386Sopenharmony_ci bool onCopySurface(GrSurface* dst, GrSurface* src, const SkIRect& srcRect, 207cb93a386Sopenharmony_ci const SkIPoint& dstPoint) override; 208cb93a386Sopenharmony_ci 209cb93a386Sopenharmony_ci bool onRegenerateMipMapLevels(GrTexture*) override; 210cb93a386Sopenharmony_ci 211cb93a386Sopenharmony_ci void onResolveRenderTarget(GrRenderTarget* target, const SkIRect&) override; 212cb93a386Sopenharmony_ci 213cb93a386Sopenharmony_ci void addFinishedProc(GrGpuFinishedProc finishedProc, 214cb93a386Sopenharmony_ci GrGpuFinishedContext finishedContext) override; 215cb93a386Sopenharmony_ci void addFinishedCallback(sk_sp<GrRefCntedCallback> finishedCallback); 216cb93a386Sopenharmony_ci 217cb93a386Sopenharmony_ci GrOpsRenderPass* onGetOpsRenderPass(GrRenderTarget*, 218cb93a386Sopenharmony_ci bool useMSAASurface, 219cb93a386Sopenharmony_ci GrAttachment*, 220cb93a386Sopenharmony_ci GrSurfaceOrigin, 221cb93a386Sopenharmony_ci const SkIRect&, 222cb93a386Sopenharmony_ci const GrOpsRenderPass::LoadAndStoreInfo&, 223cb93a386Sopenharmony_ci const GrOpsRenderPass::StencilLoadAndStoreInfo&, 224cb93a386Sopenharmony_ci const SkTArray<GrSurfaceProxy*, true>& sampledProxies, 225cb93a386Sopenharmony_ci GrXferBarrierFlags renderPassXferBarriers) override; 226cb93a386Sopenharmony_ci 227cb93a386Sopenharmony_ci void prepareSurfacesForBackendAccessAndStateUpdates( 228cb93a386Sopenharmony_ci SkSpan<GrSurfaceProxy*> proxies, 229cb93a386Sopenharmony_ci SkSurface::BackendSurfaceAccess access, 230cb93a386Sopenharmony_ci const GrBackendSurfaceMutableState* newState) override; 231cb93a386Sopenharmony_ci 232cb93a386Sopenharmony_ci bool onSubmitToGpu(bool syncCpu) override; 233cb93a386Sopenharmony_ci 234cb93a386Sopenharmony_ci GrBackendTexture onCreateBackendTexture(SkISize dimensions, 235cb93a386Sopenharmony_ci const GrBackendFormat&, 236cb93a386Sopenharmony_ci GrRenderable, 237cb93a386Sopenharmony_ci GrMipmapped, 238cb93a386Sopenharmony_ci GrProtected) override; 239cb93a386Sopenharmony_ci 240cb93a386Sopenharmony_ci bool onClearBackendTexture(const GrBackendTexture&, 241cb93a386Sopenharmony_ci sk_sp<GrRefCntedCallback> finishedCallback, 242cb93a386Sopenharmony_ci std::array<float, 4> color) override; 243cb93a386Sopenharmony_ci 244cb93a386Sopenharmony_ci GrBackendTexture onCreateCompressedBackendTexture(SkISize dimensions, 245cb93a386Sopenharmony_ci const GrBackendFormat&, 246cb93a386Sopenharmony_ci GrMipmapped, 247cb93a386Sopenharmony_ci GrProtected) override; 248cb93a386Sopenharmony_ci 249cb93a386Sopenharmony_ci bool onUpdateCompressedBackendTexture(const GrBackendTexture&, 250cb93a386Sopenharmony_ci sk_sp<GrRefCntedCallback> finishedCallback, 251cb93a386Sopenharmony_ci const void* data, 252cb93a386Sopenharmony_ci size_t size) override; 253cb93a386Sopenharmony_ci 254cb93a386Sopenharmony_ci bool submitDirectCommandList(SyncQueue sync); 255cb93a386Sopenharmony_ci 256cb93a386Sopenharmony_ci void checkForFinishedCommandLists(); 257cb93a386Sopenharmony_ci void waitForQueueCompletion(); 258cb93a386Sopenharmony_ci 259cb93a386Sopenharmony_ci void copySurfaceAsCopyTexture(GrSurface* dst, GrSurface* src, GrD3DTextureResource* dstResource, 260cb93a386Sopenharmony_ci GrD3DTextureResource* srcResource, const SkIRect& srcRect, 261cb93a386Sopenharmony_ci const SkIPoint& dstPoint); 262cb93a386Sopenharmony_ci 263cb93a386Sopenharmony_ci void copySurfaceAsResolve(GrSurface* dst, GrSurface* src, const SkIRect& srcRect, 264cb93a386Sopenharmony_ci const SkIPoint& dstPoint); 265cb93a386Sopenharmony_ci void resolveTexture(GrSurface* dst, int32_t dstX, int32_t dstY, 266cb93a386Sopenharmony_ci GrD3DRenderTarget* src, const SkIRect& srcRect); 267cb93a386Sopenharmony_ci 268cb93a386Sopenharmony_ci sk_sp<GrD3DTexture> createD3DTexture(SkISize, 269cb93a386Sopenharmony_ci DXGI_FORMAT, 270cb93a386Sopenharmony_ci GrRenderable, 271cb93a386Sopenharmony_ci int renderTargetSampleCnt, 272cb93a386Sopenharmony_ci SkBudgeted, 273cb93a386Sopenharmony_ci GrProtected, 274cb93a386Sopenharmony_ci int mipLevelCount, 275cb93a386Sopenharmony_ci GrMipmapStatus); 276cb93a386Sopenharmony_ci 277cb93a386Sopenharmony_ci bool uploadToTexture(GrD3DTexture* tex, 278cb93a386Sopenharmony_ci SkIRect rect, 279cb93a386Sopenharmony_ci GrColorType colorType, 280cb93a386Sopenharmony_ci const GrMipLevel texels[], 281cb93a386Sopenharmony_ci int mipLevelCount); 282cb93a386Sopenharmony_ci 283cb93a386Sopenharmony_ci void readOrTransferPixels(GrD3DTextureResource* texResource, 284cb93a386Sopenharmony_ci SkIRect rect, 285cb93a386Sopenharmony_ci sk_sp<GrGpuBuffer> transferBuffer, 286cb93a386Sopenharmony_ci const D3D12_PLACED_SUBRESOURCE_FOOTPRINT& placedFootprint); 287cb93a386Sopenharmony_ci 288cb93a386Sopenharmony_ci bool createTextureResourceForBackendSurface(DXGI_FORMAT dxgiFormat, 289cb93a386Sopenharmony_ci SkISize dimensions, 290cb93a386Sopenharmony_ci GrTexturable texturable, 291cb93a386Sopenharmony_ci GrRenderable renderable, 292cb93a386Sopenharmony_ci GrMipmapped mipMapped, 293cb93a386Sopenharmony_ci int sampleCnt, 294cb93a386Sopenharmony_ci GrD3DTextureResourceInfo* info, 295cb93a386Sopenharmony_ci GrProtected isProtected); 296cb93a386Sopenharmony_ci 297cb93a386Sopenharmony_ci gr_cp<ID3D12Device> fDevice; 298cb93a386Sopenharmony_ci gr_cp<ID3D12CommandQueue> fQueue; 299cb93a386Sopenharmony_ci 300cb93a386Sopenharmony_ci sk_sp<GrD3DMemoryAllocator> fMemoryAllocator; 301cb93a386Sopenharmony_ci 302cb93a386Sopenharmony_ci GrD3DResourceProvider fResourceProvider; 303cb93a386Sopenharmony_ci GrStagingBufferManager fStagingBufferManager; 304cb93a386Sopenharmony_ci GrRingBuffer fConstantsRingBuffer; 305cb93a386Sopenharmony_ci 306cb93a386Sopenharmony_ci gr_cp<ID3D12Fence> fFence; 307cb93a386Sopenharmony_ci uint64_t fCurrentFenceValue = 0; 308cb93a386Sopenharmony_ci 309cb93a386Sopenharmony_ci std::unique_ptr<GrD3DDirectCommandList> fCurrentDirectCommandList; 310cb93a386Sopenharmony_ci // One-off special-case descriptors created directly for the mipmap compute shader 311cb93a386Sopenharmony_ci // and hence aren't tracked by the normal path. 312cb93a386Sopenharmony_ci SkSTArray<32, GrD3DDescriptorHeap::CPUHandle> fMipmapCPUDescriptors; 313cb93a386Sopenharmony_ci 314cb93a386Sopenharmony_ci struct OutstandingCommandList { 315cb93a386Sopenharmony_ci OutstandingCommandList(std::unique_ptr<GrD3DDirectCommandList> commandList, 316cb93a386Sopenharmony_ci uint64_t fenceValue) 317cb93a386Sopenharmony_ci : fCommandList(std::move(commandList)), fFenceValue(fenceValue) { 318cb93a386Sopenharmony_ci } 319cb93a386Sopenharmony_ci std::unique_ptr<GrD3DDirectCommandList> fCommandList; 320cb93a386Sopenharmony_ci uint64_t fFenceValue; 321cb93a386Sopenharmony_ci }; 322cb93a386Sopenharmony_ci 323cb93a386Sopenharmony_ci SkDeque fOutstandingCommandLists; 324cb93a386Sopenharmony_ci 325cb93a386Sopenharmony_ci std::unique_ptr<GrD3DOpsRenderPass> fCachedOpsRenderPass; 326cb93a386Sopenharmony_ci 327cb93a386Sopenharmony_ci#if GR_TEST_UTILS 328cb93a386Sopenharmony_ci IDXGraphicsAnalysis* fGraphicsAnalysis; 329cb93a386Sopenharmony_ci#endif 330cb93a386Sopenharmony_ci 331cb93a386Sopenharmony_ci using INHERITED = GrGpu; 332cb93a386Sopenharmony_ci}; 333cb93a386Sopenharmony_ci 334cb93a386Sopenharmony_ci#endif 335