Grindstone Game Engine v0.2.0
An open source game engine and toolkit.
Loading...
Searching...
No Matches
GraphicsPipeline.hpp
1#pragma once
2
3#include <string>
4#include <vector>
5#include <iostream>
6#include <xkeycheck.h>
7
8#include <Common/Hash.hpp>
9#include "Formats.hpp"
10
11namespace Grindstone::GraphicsAPI {
12 class RenderPass;
14
20 public:
22 const char* fileName;
23 const char* content;
24 uint32_t size;
25 ShaderStage type;
26 };
27
29 BlendData blendData = BlendData::NoBlending();
30 ColorMask colorMask = ColorMask::RGBA;
31 };
32
33 struct PipelineData {
34 const char* debugName;
35
36 GeometryType primitiveType;
37 PolygonFillMode polygonFillMode;
38 CullMode cullMode;
39 RenderPass* renderPass;
40 float width, height;
41 int32_t scissorX = 0, scissorY = 0;
42 uint32_t scissorW, scissorH;
43 const ShaderStageData* shaderStageCreateInfos;
44 uint32_t shaderStageCreateInfoCount;
45 const DescriptorSetLayout* const * descriptorSetLayouts;
46 uint32_t descriptorSetLayoutCount;
47
48 const AttachmentData* colorAttachmentData = nullptr;
49 uint8_t colorAttachmentCount;
50 CompareOperation depthCompareOp = CompareOperation::LessOrEqual;
51 bool isDepthTestEnabled = true;
52 bool isDepthWriteEnabled = true;
53 bool isStencilEnabled = false;
54 bool hasDynamicViewport = false;
55 bool hasDynamicScissor = false;
56 bool isDepthBiasEnabled = false;
57 bool isDepthClampEnabled = false;
58
59 float depthBiasConstantFactor = 1.25f;
60 float depthBiasSlopeFactor = 1.75f;
61 float depthBiasClamp = 0.0f;
62 };
63
64 struct CreateInfo {
65 VertexInputLayout vertexInputLayout;
66 PipelineData pipelineData;
67 };
68 };
69}
70
71namespace std {
72 template<>
73 struct std::hash<Grindstone::GraphicsAPI::GraphicsPipeline::ShaderStageData> {
74 std::size_t operator()(const Grindstone::GraphicsAPI::GraphicsPipeline::ShaderStageData& stage) const noexcept {
75 size_t result = stage.size;
76 result ^= std::hash<uint8_t>{}(static_cast<uint8_t>(stage.type));
77
78 return result;
79 }
80 };
81
82 template<>
83 struct std::hash<Grindstone::GraphicsAPI::GraphicsPipeline::AttachmentData> {
84 std::size_t operator()(const Grindstone::GraphicsAPI::GraphicsPipeline::AttachmentData& attachment) const noexcept {
85 size_t result =
86 static_cast<size_t>(attachment.colorMask) |
87 static_cast<size_t>(attachment.blendData.alphaFactorDst) << 8 |
88 static_cast<size_t>(attachment.blendData.alphaFactorSrc) << 16 |
89 static_cast<size_t>(attachment.blendData.alphaOperation) << 24 |
90 static_cast<size_t>(attachment.blendData.colorFactorDst) << 32 |
91 static_cast<size_t>(attachment.blendData.colorFactorSrc) << 40 |
92 static_cast<size_t>(attachment.blendData.colorOperation) << 48;
93 return result;
94 }
95 };
96
97 template<>
98 struct std::hash<Grindstone::GraphicsAPI::GraphicsPipeline::PipelineData> {
99 std::size_t operator()(const Grindstone::GraphicsAPI::GraphicsPipeline::PipelineData& pipelineData) const noexcept {
100 size_t result =
101 static_cast<size_t>(pipelineData.cullMode) |
102 static_cast<size_t>(pipelineData.depthCompareOp) << 8 |
103 static_cast<size_t>(pipelineData.primitiveType) << 16 |
104 static_cast<size_t>(pipelineData.polygonFillMode) << 24 |
105 static_cast<size_t>(pipelineData.isDepthTestEnabled ? 1 : 0) << 32 |
106 static_cast<size_t>(pipelineData.isDepthWriteEnabled ? 1 : 0) << 33 |
107 static_cast<size_t>(pipelineData.isStencilEnabled ? 1 : 0) << 34 |
108 static_cast<size_t>(pipelineData.hasDynamicViewport ? 1 : 0) << 35 |
109 static_cast<size_t>(pipelineData.hasDynamicScissor ? 1 : 0) << 36 |
110 static_cast<size_t>(pipelineData.isDepthBiasEnabled ? 1 : 0) << 37 |
111 static_cast<size_t>(pipelineData.isDepthClampEnabled ? 1 : 0) << 38;
112
113 result ^= static_cast<size_t>(pipelineData.width) | (static_cast<size_t>(pipelineData.height) << 32);
114 result ^= static_cast<size_t>(pipelineData.scissorX) | (static_cast<size_t>(pipelineData.scissorY) << 32);
115 result ^= static_cast<size_t>(pipelineData.scissorW) | (static_cast<size_t>(pipelineData.scissorH) << 32);
116 result ^= static_cast<size_t>(pipelineData.depthBiasConstantFactor) | (static_cast<size_t>(pipelineData.depthBiasSlopeFactor) << 32);
117 result ^= static_cast<size_t>(pipelineData.depthBiasClamp);
118
119 result ^= pipelineData.colorAttachmentCount;
120 for (uint8_t i = 0; i < pipelineData.colorAttachmentCount; ++i) {
121 result ^= std::hash<Grindstone::GraphicsAPI::GraphicsPipeline::AttachmentData>{}(pipelineData.colorAttachmentData[i]);
122 }
123
124 result ^= pipelineData.shaderStageCreateInfoCount;
125 for (uint8_t i = 0; i < pipelineData.shaderStageCreateInfoCount; ++i) {
126 result ^= std::hash<Grindstone::GraphicsAPI::GraphicsPipeline::ShaderStageData>{}(pipelineData.shaderStageCreateInfos[i]);
127 }
128
129 return result;
130 }
131 };
132}
Definition DescriptorSetLayout.hpp:13
Definition GraphicsPipeline.hpp:19
Definition RenderPass.hpp:27
Definition Formats.hpp:485