1 /* 2 * Copyright 2022 Google LLC. 3 * 4 * Use of this source code is governed by a BSD-style license that can be 5 * found in the LICENSE file. 6 */ 7 8 #ifndef skgpu_piet_Renderer_DEFINED 9 #define skgpu_piet_Renderer_DEFINED 10 11 #include "src/gpu/piet/PietTypes.h" 12 13 #include <memory> 14 15 #if defined(SK_METAL) && defined(__OBJC__) 16 #import <Metal/Metal.h> 17 #endif 18 19 /** 20 * Renderer provides the piet library interface for encoding compute dispatches to render a 21 * skgpu::piet::Scene to a target texture. The Renderer template is meant to be specialized to 22 * directly depend on graphics backend types and acts as the glue between a GPU backend and the 23 * pgpu-render library. 24 * 25 * For instance, the `MtlRenderer` specialization operates directly on Metal framework types and 26 * this header file can be included directly in an Obj-C++ program. 27 */ 28 29 namespace skgpu::piet { 30 31 class Scene; 32 33 class RendererBase : public Object<PgpuRenderer, pgpu_renderer_destroy> { 34 protected: 35 RendererBase(void* device, void* queue); 36 ~RendererBase() override = default; 37 38 void render(const Scene& scene, void* target, void* cmdBuffer) const; 39 40 private: 41 RendererBase(const RendererBase&) = delete; 42 RendererBase(RendererBase&&) = delete; 43 }; 44 45 template <typename BackendTraits> class Renderer final : public RendererBase { 46 using Device = typename BackendTraits::Device; 47 using CommandQueue = typename BackendTraits::CommandQueue; 48 using CommandBuffer = typename BackendTraits::CommandBuffer; 49 using Texture = typename BackendTraits::Texture; 50 51 public: Renderer(Device device,CommandQueue queue)52 Renderer(Device device, CommandQueue queue) 53 : RendererBase(static_cast<void*>(device), static_cast<void*>(queue)) {} 54 55 ~Renderer() override = default; 56 render(const Scene & scene,Texture target,CommandBuffer cmdBuffer)57 void render(const Scene& scene, Texture target, CommandBuffer cmdBuffer) const { 58 RendererBase::render(scene, static_cast<void*>(target), static_cast<void*>(cmdBuffer)); 59 } 60 }; 61 62 #if defined(SK_METAL) && defined(__OBJC__) 63 64 // The MtlRenderer is inteded to be accessed by Obj-C code as it has a direct dependency on Metal 65 // framework objects. 66 struct MtlBackendTraits { 67 using Device = id<MTLDevice>; 68 using CommandQueue = id<MTLCommandQueue>; 69 using CommandBuffer = id<MTLCommandBuffer>; 70 using Texture = id<MTLTexture>; 71 }; 72 using MtlRenderer = Renderer<MtlBackendTraits>; 73 74 #endif // defined(SK_METAL) && defined(__OBJC__) 75 76 } // namespace skgpu::piet 77 78 #endif // skgpu_piet_Renderer_DEFINED 79