Flint Engine
Modular C++20 2D game engine powered by SDL3
Loading...
Searching...
No Matches
primitives-pipeline.h
1// SPDX-License-Identifier: MIT
2// SPDX-FileCopyrightText: 2025-2026 Manuel Osorio
3#pragma once
4#include "flint/core/log.h"
5#include "flint/graphics/shaders.h"
6
7#include <SDL3/SDL.h>
8#include <SDL3/SDL_gpu.h>
9
10namespace Flint {
16 public:
17 PrimitivePipeline() = default;
18
20 cleanup();
21 }
22
30 bool initialize(SDL_GPUDevice *device, ShaderFormat shaderFormat,
31 SDL_GPUTextureFormat swapchainFormat);
32
38 void bind(SDL_GPURenderPass *renderPass, SDL_GPUPrimitiveType primitiveType) const {
39 if (!renderPass) {
40 FLINT_ENGINE_ERROR("PrimitivePipeline: Cannot bind to null render pass");
41 return;
42 }
43
44 SDL_GPUGraphicsPipeline *pipeline = nullptr;
45 switch (primitiveType) {
46 case SDL_GPU_PRIMITIVETYPE_LINELIST:
47 pipeline = linePipeline;
48 break;
49 case SDL_GPU_PRIMITIVETYPE_LINESTRIP:
50 pipeline = lineStripPipeline;
51 break;
52 case SDL_GPU_PRIMITIVETYPE_POINTLIST:
53 pipeline = pointPipeline;
54 break;
55 default:
56 FLINT_ENGINE_WARN("PrimitivePipeline: Unsupported primitive type");
57 return;
58 }
59
60 if (pipeline) {
61 SDL_BindGPUGraphicsPipeline(renderPass, pipeline);
62 }
63 }
64
65 bool isInitialized() const {
66 return linePipeline != nullptr && lineStripPipeline != nullptr && pointPipeline != nullptr;
67 }
68
69 void cleanup() {
70 m_shader.reset();
71 if (m_device) {
72 if (linePipeline) {
73 SDL_ReleaseGPUGraphicsPipeline(m_device, linePipeline);
74 linePipeline = nullptr;
75 }
76 if (lineStripPipeline) {
77 SDL_ReleaseGPUGraphicsPipeline(m_device, lineStripPipeline);
78 lineStripPipeline = nullptr;
79 }
80 if (pointPipeline) {
81 SDL_ReleaseGPUGraphicsPipeline(m_device, pointPipeline);
82 pointPipeline = nullptr;
83 }
84 }
85 }
86
87 private:
88 SDL_GPUDevice *m_device = nullptr;
89 SDL_GPUGraphicsPipeline *linePipeline = nullptr;
90 SDL_GPUGraphicsPipeline *lineStripPipeline = nullptr;
91 SDL_GPUGraphicsPipeline *pointPipeline = nullptr;
92 std::unique_ptr<Shader> m_shader;
93 };
94
95}
bool initialize(SDL_GPUDevice *device, ShaderFormat shaderFormat, SDL_GPUTextureFormat swapchainFormat)
void bind(SDL_GPURenderPass *renderPass, SDL_GPUPrimitiveType primitiveType) const