• Home
  • Line#
  • Scopes#
  • Navigate#
  • Raw
  • Download
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