Files
Seele/src/Engine/Graphics/Initializer.h
T

271 lines
8.5 KiB
C++
Raw Normal View History

2020-06-02 11:46:18 +02:00
#pragma once
2023-02-13 14:56:13 +01:00
#include "Containers/Map.h"
2024-06-09 12:20:04 +02:00
#include "Enums.h"
2023-10-26 18:37:29 +02:00
#include "Math/Math.h"
2024-06-09 10:44:24 +02:00
#include "MeshData.h"
2024-06-09 12:20:04 +02:00
#include "MinimalEngine.h"
2020-05-05 01:51:13 +02:00
2024-06-09 12:20:04 +02:00
namespace Seele {
struct GraphicsInitializer {
const char* applicationName;
const char* engineName;
const char* windowLayoutFile;
/**
* layers defines the enabled Vulkan layers used in the instance,
* if ENABLE_VALIDATION is defined, standard validation is already enabled
* not yet implemented
*/
Array<const char*> layers;
Array<const char*> instanceExtensions;
Array<const char*> deviceExtensions;
2023-11-15 00:06:00 +01:00
2024-06-09 12:20:04 +02:00
void* windowHandle;
2025-05-18 08:49:22 +02:00
GraphicsInitializer() : applicationName("SeeleEngine"), engineName("SeeleEngine"), windowLayoutFile(nullptr), windowHandle(nullptr) {}
2024-06-09 12:20:04 +02:00
};
struct WindowCreateInfo {
int32 width;
int32 height;
const char* title;
Gfx::SeFormat preferredFormat = Gfx::SE_FORMAT_B8G8R8A8_UNORM;
void* windowHandle;
};
struct ViewportCreateInfo {
URect dimensions;
2024-10-18 19:01:04 +02:00
float fieldOfView = glm::radians(70.0f);
2025-05-06 19:36:43 +02:00
// ortho params
float left = 0;
float right = 0;
float top = 0;
float bottom = 0;
2024-06-09 12:20:04 +02:00
};
// doesnt own the data, only proxy it
struct DataSource {
uint64 size = 0;
uint64 offset = 0;
uint8* data = nullptr;
Gfx::QueueType owner = Gfx::QueueType::GRAPHICS;
};
struct TextureCreateInfo {
DataSource sourceData = DataSource();
Gfx::SeFormat format = Gfx::SE_FORMAT_R32G32B32A32_SFLOAT;
uint32 width = 1;
uint32 height = 1;
uint32 depth = 1;
uint32 elements = 1;
uint32 samples = 1;
2024-08-13 22:44:04 +02:00
bool useMip = false;
2024-06-09 12:20:04 +02:00
Gfx::SeImageUsageFlags usage = Gfx::SE_IMAGE_USAGE_SAMPLED_BIT;
Gfx::SeMemoryPropertyFlags memoryProps = Gfx::SE_MEMORY_PROPERTY_DEVICE_LOCAL_BIT;
std::string name;
};
struct SamplerCreateInfo {
Gfx::SeSamplerCreateFlags flags;
Gfx::SeFilter magFilter = Gfx::SE_FILTER_LINEAR;
Gfx::SeFilter minFilter = Gfx::SE_FILTER_LINEAR;
Gfx::SeSamplerMipmapMode mipmapMode = Gfx::SE_SAMPLER_MIPMAP_MODE_LINEAR;
Gfx::SeSamplerAddressMode addressModeU = Gfx::SE_SAMPLER_ADDRESS_MODE_REPEAT;
Gfx::SeSamplerAddressMode addressModeV = Gfx::SE_SAMPLER_ADDRESS_MODE_REPEAT;
Gfx::SeSamplerAddressMode addressModeW = Gfx::SE_SAMPLER_ADDRESS_MODE_REPEAT;
float mipLodBias = 0.0f;
uint32 anisotropyEnable = 0;
2024-09-16 13:00:53 +02:00
float maxAnisotropy = 1.0f;
2024-06-09 12:20:04 +02:00
uint32 compareEnable = 0;
Gfx::SeCompareOp compareOp = Gfx::SE_COMPARE_OP_NEVER;
float minLod = 0.0f;
float maxLod = 0.0f;
Gfx::SeBorderColor borderColor = Gfx::SE_BORDER_COLOR_FLOAT_OPAQUE_BLACK;
uint32 unnormalizedCoordinates = 0;
std::string name;
};
struct VertexBufferCreateInfo {
DataSource sourceData = DataSource();
// bytes per vertex
uint32 vertexSize = 0;
uint32 numVertices = 0;
std::string name = "Unnamed";
};
struct IndexBufferCreateInfo {
DataSource sourceData = DataSource();
Gfx::SeIndexType indexType = Gfx::SeIndexType::SE_INDEX_TYPE_UINT16;
std::string name = "Unnamed";
};
struct UniformBufferCreateInfo {
DataSource sourceData = DataSource();
std::string name = "Unnamed";
};
struct ShaderBufferCreateInfo {
DataSource sourceData = DataSource();
uint64 numElements = 1;
2024-06-19 10:33:19 +02:00
uint32 clearValue = 0;
2024-10-07 20:14:00 +02:00
Gfx::SeBufferUsageFlags usage = 0;
2024-06-09 12:20:04 +02:00
std::string name = "Unnamed";
};
DECLARE_NAME_REF(Gfx, PipelineLayout)
2024-07-10 21:07:10 +02:00
struct ShaderCompilationInfo {
2024-06-09 12:20:04 +02:00
std::string name; // Debug info
2024-07-10 21:07:10 +02:00
Array<std::string> modules;
Array<Pair<std::string, std::string>> entryPoints; // entry function name, module name
2024-06-09 12:20:04 +02:00
Array<Pair<const char*, const char*>> typeParameter;
Map<const char*, const char*> defines;
Gfx::PPipelineLayout rootSignature;
2024-08-13 22:44:04 +02:00
bool dumpIntermediate = false;
2024-06-09 12:20:04 +02:00
};
2024-07-10 21:07:10 +02:00
struct ShaderCreateInfo {
uint32 entryPointIndex;
};
2024-06-09 12:20:04 +02:00
struct VertexInputBinding {
uint32 binding;
uint32 stride;
Gfx::SeVertexInputRate inputRate;
};
struct VertexInputAttribute {
uint32 location;
uint32 binding;
Gfx::SeFormat format;
uint32 offset;
};
struct VertexInputStateCreateInfo {
Array<VertexInputBinding> bindings;
Array<VertexInputAttribute> attributes;
};
DECLARE_REF(MaterialInstance)
DECLARE_REF(Mesh)
namespace Gfx {
struct SePushConstantRange {
SeShaderStageFlags stageFlags;
uint32 offset;
uint32 size;
2024-09-16 13:00:53 +02:00
std::string name;
2024-06-09 12:20:04 +02:00
};
struct RasterizationState {
uint32 depthClampEnable = 0;
uint32 rasterizerDiscardEnable = 0;
SePolygonMode polygonMode = Gfx::SE_POLYGON_MODE_FILL;
SeCullModeFlags cullMode = Gfx::SE_CULL_MODE_BACK_BIT;
SeFrontFace frontFace = Gfx::SE_FRONT_FACE_COUNTER_CLOCKWISE;
uint32 depthBiasEnable = 0;
float depthBiasConstantFactor = 0;
float depthBiasClamp = 0;
float depthBiasSlopeFactor = 0;
float lineWidth = 1.0;
};
struct MultisampleState {
SeSampleCountFlags samples = 1;
uint32 sampleShadingEnable = 0;
float minSampleShading = 1;
uint8 alphaCoverageEnable = 0;
uint8 alphaToOneEnable = 0;
};
struct DepthStencilState {
uint32 depthTestEnable = 1;
uint32 depthWriteEnable = 1;
SeCompareOp depthCompareOp = Gfx::SE_COMPARE_OP_GREATER;
uint32 depthBoundsTestEnable = 0;
uint32 stencilTestEnable = 0;
SeStencilOp front = Gfx::SE_STENCIL_OP_ZERO;
SeStencilOp back = Gfx::SE_STENCIL_OP_ZERO;
float minDepthBounds = 0.0f;
float maxDepthBounds = 1.0f;
};
struct ColorBlendState {
struct BlendAttachment {
uint32 blendEnable = 0;
SeBlendFactor srcColorBlendFactor = Gfx::SE_BLEND_FACTOR_SRC_ALPHA;
2024-06-20 21:57:26 +02:00
SeBlendFactor dstColorBlendFactor = Gfx::SE_BLEND_FACTOR_DST_ALPHA;
2024-06-09 12:20:04 +02:00
SeBlendOp colorBlendOp = Gfx::SE_BLEND_OP_ADD;
2024-06-20 21:57:26 +02:00
SeBlendFactor srcAlphaBlendFactor = Gfx::SE_BLEND_FACTOR_ONE;
SeBlendFactor dstAlphaBlendFactor = Gfx::SE_BLEND_FACTOR_ONE;
2024-06-09 12:20:04 +02:00
SeBlendOp alphaBlendOp = Gfx::SE_BLEND_OP_ADD;
SeColorComponentFlags colorWriteMask =
Gfx::SE_COLOR_COMPONENT_R_BIT | Gfx::SE_COLOR_COMPONENT_G_BIT | Gfx::SE_COLOR_COMPONENT_B_BIT | Gfx::SE_COLOR_COMPONENT_A_BIT;
};
uint32 logicOpEnable = 0;
SeLogicOp logicOp = Gfx::SE_LOGIC_OP_OR;
uint32 attachmentCount = 0;
StaticArray<BlendAttachment, 16> blendAttachments;
StaticArray<float, 4> blendConstants = {
1.0f,
1.0f,
1.0f,
1.0f,
};
};
2023-10-26 18:37:29 +02:00
2024-06-09 12:20:04 +02:00
DECLARE_REF(VertexInput)
DECLARE_REF(VertexShader)
DECLARE_REF(TaskShader)
DECLARE_REF(MeshShader)
DECLARE_REF(FragmentShader)
DECLARE_REF(ComputeShader)
2024-06-18 19:19:05 +02:00
DECLARE_REF(RayGenShader)
DECLARE_REF(ClosestHitShader)
DECLARE_REF(AnyHitShader)
DECLARE_REF(IntersectionShader)
DECLARE_REF(MissShader)
DECLARE_REF(CallableShader)
2024-06-09 12:20:04 +02:00
DECLARE_REF(RenderPass)
DECLARE_REF(PipelineLayout)
2024-07-10 21:07:10 +02:00
DECLARE_REF(BottomLevelAS)
2024-06-09 12:20:04 +02:00
struct LegacyPipelineCreateInfo {
SePrimitiveTopology topology = Gfx::SE_PRIMITIVE_TOPOLOGY_TRIANGLE_LIST;
PVertexInput vertexInput = nullptr;
PVertexShader vertexShader = nullptr;
PFragmentShader fragmentShader = nullptr;
PRenderPass renderPass = nullptr;
PPipelineLayout pipelineLayout = nullptr;
MultisampleState multisampleState;
RasterizationState rasterizationState;
DepthStencilState depthStencilState;
ColorBlendState colorBlend;
};
2024-06-09 10:44:24 +02:00
2024-06-09 12:20:04 +02:00
struct MeshPipelineCreateInfo {
PTaskShader taskShader = nullptr;
PMeshShader meshShader = nullptr;
PFragmentShader fragmentShader = nullptr;
PRenderPass renderPass = nullptr;
PPipelineLayout pipelineLayout = nullptr;
MultisampleState multisampleState;
RasterizationState rasterizationState;
DepthStencilState depthStencilState;
ColorBlendState colorBlend;
};
struct ComputePipelineCreateInfo {
Gfx::PComputeShader computeShader = nullptr;
Gfx::PPipelineLayout pipelineLayout = nullptr;
};
2024-07-12 13:33:52 +02:00
struct RayTracingRayGenGroup {
PRayGenShader shader;
Array<uint8> parameters;
};
2024-07-10 21:07:10 +02:00
struct RayTracingHitGroup {
PClosestHitShader closestHitShader;
PAnyHitShader anyHitShader;
PIntersectionShader intersectionShader;
Array<uint8> parameters;
};
2024-07-12 13:33:52 +02:00
struct RayTracingMissGroup {
PMissShader shader;
Array<uint8> parameters;
};
struct RayTracingCallableGroup {
PCallableShader shader;
Array<uint8> parameters;
};
2024-06-18 09:48:00 +02:00
struct RayTracingPipelineCreateInfo {
PPipelineLayout pipelineLayout = nullptr;
2024-07-12 13:33:52 +02:00
RayTracingRayGenGroup rayGenGroup;
Array<RayTracingHitGroup> hitGroups;
Array<RayTracingMissGroup> missGroups;
Array<RayTracingCallableGroup> callableGroups;
2024-06-18 09:48:00 +02:00
};
2024-06-09 12:20:04 +02:00
struct BottomLevelASCreateInfo {
PMesh mesh;
};
2024-07-10 21:07:10 +02:00
struct TopLevelASCreateInfo {
Array<InstanceData> instances;
Array<Gfx::PBottomLevelAS> bottomLevelStructures;
};
2024-06-09 12:20:04 +02:00
} // namespace Gfx
2024-04-19 18:23:36 +02:00
} // namespace Seele