Mandrill 2025.6.0
Loading...
Searching...
No Matches
Pipeline.h
1#pragma once
2
3#include "Common.h"
4
5#include "Device.h"
6#include "Layout.h"
7#include "Pass.h"
8#include "Scene.h"
9#include "Shader.h"
10
11namespace Mandrill
12{
13 static std::vector<VkVertexInputBindingDescription> defaultBindingDescriptions = {{{
14 .binding = 0,
15 .stride = sizeof(Vertex),
16 .inputRate = VK_VERTEX_INPUT_RATE_VERTEX,
17 }}};
18
19 static std::vector<VkVertexInputAttributeDescription> defaultAttributeDescriptions = {{
20 {
21 .location = 0,
22 .binding = 0,
23 .format = VK_FORMAT_R32G32B32_SFLOAT,
24 .offset = offsetof(Vertex, position),
25 },
26 {
27 .location = 1,
28 .binding = 0,
29 .format = VK_FORMAT_R32G32B32_SFLOAT,
30 .offset = offsetof(Vertex, normal),
31 },
32 {
33 .location = 2,
34 .binding = 0,
35 .format = VK_FORMAT_R32G32_SFLOAT,
36 .offset = offsetof(Vertex, texcoord),
37 },
38 {
39 .location = 3,
40 .binding = 0,
41 .format = VK_FORMAT_R32G32B32_SFLOAT,
42 .offset = offsetof(Vertex, tangent),
43 },
44 {
45 .location = 4,
46 .binding = 0,
47 .format = VK_FORMAT_R32G32B32_SFLOAT,
48 .offset = offsetof(Vertex, binormal),
49 },
50 }};
51
52 struct PipelineDesc {
53 std::vector<VkVertexInputBindingDescription> bindingDescriptions;
54 std::vector<VkVertexInputAttributeDescription> attributeDescriptions;
55 VkPolygonMode polygonMode;
56 VkBool32 depthTest;
57 VkBool32 blend;
58 VkBool32 alphaToCoverage;
59
60 MANDRILL_API
61 PipelineDesc(
62 std::vector<VkVertexInputBindingDescription> bindingDescriptions = defaultBindingDescriptions,
63 std::vector<VkVertexInputAttributeDescription> attributeDescriptions = defaultAttributeDescriptions,
64 VkPolygonMode polygonMode = VK_POLYGON_MODE_FILL, VkBool32 depthTest = VK_TRUE, VkBool32 blend = VK_FALSE,
65 VkBool32 alphaToCoverage = VK_FALSE)
66 : bindingDescriptions(bindingDescriptions), attributeDescriptions(attributeDescriptions),
67 polygonMode(polygonMode), depthTest(depthTest), blend(blend), alphaToCoverage(alphaToCoverage)
68 {
69 }
70 };
71
76 {
77 public:
78 MANDRILL_NON_COPYABLE(Pipeline)
79
80
88 MANDRILL_API Pipeline(ptr<Device> pDevice, ptr<Pass> pPass, ptr<Layout> pLayout, ptr<Shader> pShader,
89 const PipelineDesc& desc = PipelineDesc());
90
94 MANDRILL_API ~Pipeline();
95
101 MANDRILL_API void bind(VkCommandBuffer cmd);
102
107 MANDRILL_API void recreate();
108
113 MANDRILL_API VkPipeline getPipeline() const
114 {
115 return mPipeline;
116 }
117
122 MANDRILL_API VkPipelineLayout getLayout() const
123 {
124 return mPipelineLayout;
125 }
126
132 MANDRILL_API void setCullMode(VkCullModeFlagBits cullMode)
133 {
134 mCullMode = cullMode;
135 }
136
142 MANDRILL_API void setFrontFace(VkFrontFace frontFace)
143 {
144 mFrontFace = frontFace;
145 }
146
152 MANDRILL_API void setLineWidth(float lineWidth)
153 {
154 mLineWidth = lineWidth;
155 }
156
157 protected:
158 virtual void createPipeline();
159 virtual void destroyPipeline();
160
161 ptr<Device> mpDevice;
162 ptr<Pass> mpPass;
163
164 ptr<Shader> mpShader;
165 ptr<Layout> mpLayout;
166
167 VkPipeline mPipeline;
168 VkPipelineLayout mPipelineLayout;
169
170 private:
171 VkPolygonMode mPolygonMode;
172 VkBool32 mDepthTest;
173 VkBool32 mBlend;
174 VkBool32 mAlphaToCoverage;
175
176 std::vector<VkVertexInputBindingDescription> mBindingDescriptions;
177 std::vector<VkVertexInputAttributeDescription> mAttributeDescriptions;
178 VkCullModeFlagBits mCullMode = VK_CULL_MODE_NONE;
179 VkFrontFace mFrontFace = VK_FRONT_FACE_COUNTER_CLOCKWISE;
180 float mLineWidth = 1.0f;
181 };
182} // namespace Mandrill
Pipeline class for managing Vulkan graphics pipelines.
Definition Pipeline.h:76
MANDRILL_API void setFrontFace(VkFrontFace frontFace)
Set the front face.
Definition Pipeline.h:142
MANDRILL_API VkPipeline getPipeline() const
Get the pipeline handle.
Definition Pipeline.h:113
MANDRILL_API VkPipelineLayout getLayout() const
Get the pipeline layout handle.
Definition Pipeline.h:122
MANDRILL_API void setLineWidth(float lineWidth)
Set line width.
Definition Pipeline.h:152
MANDRILL_API ~Pipeline()
Destructor for pipeline.
Definition Pipeline.cpp:33
MANDRILL_API void bind(VkCommandBuffer cmd)
Bind a pipeline for rendering and set its dynamic states.
Definition Pipeline.cpp:39
MANDRILL_API void setCullMode(VkCullModeFlagBits cullMode)
Set the cull mode.
Definition Pipeline.h:132
MANDRILL_API void recreate()
Recreate a pipeline. Call this if shader source code has changed and should be reloaded.
Definition Pipeline.cpp:65