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

252 lines
7.2 KiB
C++
Raw Normal View History

2020-06-02 11:46:18 +02:00
#pragma once
2020-05-05 01:51:13 +02:00
#include "GraphicsEnums.h"
2023-02-13 14:56:13 +01:00
#include "Containers/Map.h"
2020-05-05 01:51:13 +02:00
namespace Seele
{
struct GraphicsInitializer
{
const char *applicationName;
const char *engineName;
2021-04-01 16:40:14 +02:00
const char *windowLayoutFile;
2020-05-05 01:51:13 +02:00
/**
* 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;
2021-04-01 16:40:14 +02:00
void *windowHandle;
2020-05-05 01:51:13 +02:00
GraphicsInitializer()
2021-04-01 16:40:14 +02:00
: applicationName("SeeleEngine")
, engineName("SeeleEngine")
2022-01-12 14:40:26 +01:00
, windowLayoutFile(nullptr)
2022-04-15 23:45:44 +02:00
, layers{"VK_LAYER_KHRONOS_validation"}
2021-04-01 16:40:14 +02:00
, instanceExtensions{}
, deviceExtensions{"VK_KHR_swapchain"}
, windowHandle(nullptr)
2020-05-05 01:51:13 +02:00
{
}
};
struct WindowCreateInfo
{
int32 width;
int32 height;
const char *title;
bool bFullscreen;
2020-08-11 21:23:20 +02:00
Gfx::SeSampleCountFlags numSamples;
2020-05-05 01:51:13 +02:00
Gfx::SeFormat pixelFormat;
void *windowHandle;
};
struct ViewportCreateInfo
{
2023-01-21 18:43:21 +01:00
URect dimensions;
2022-11-30 10:19:45 +01:00
float fieldOfView = 1.222f; // 70 deg
2020-05-05 01:51:13 +02:00
};
2020-06-02 11:46:18 +02:00
// doesnt own the data, only proxy it
struct BulkResourceData
{
uint64 size = 0;
uint64 offset = 0;
2022-04-15 11:19:30 +02:00
uint8 *data = nullptr;
2021-05-10 23:57:55 +02:00
Gfx::QueueType owner = Gfx::QueueType::GRAPHICS;
2020-06-02 11:46:18 +02:00
};
2020-05-05 01:51:13 +02:00
struct TextureCreateInfo
{
2022-04-15 11:19:30 +02:00
BulkResourceData resourceData = BulkResourceData();
uint32 width = 1;
uint32 height = 1;
uint32 depth = 1;
bool bArray = false;
uint32 arrayLayers = 1;
uint32 mipLevels = 1;
uint32 samples = 1;
Gfx::SeFormat format = Gfx::SE_FORMAT_R32G32B32A32_SFLOAT;
Gfx::SeImageUsageFlagBits usage = Gfx::SE_IMAGE_USAGE_SAMPLED_BIT;
2020-05-05 01:51:13 +02:00
};
2020-10-03 11:00:10 +02:00
struct SamplerCreateInfo
{
2022-04-15 11:19:30 +02:00
Gfx::SeSamplerCreateFlags flags;
Gfx::SeFilter magFilter;
Gfx::SeFilter minFilter;
Gfx::SeSamplerMipmapMode mipmapMode;
Gfx::SeSamplerAddressMode addressModeU;
Gfx::SeSamplerAddressMode addressModeV;
Gfx::SeSamplerAddressMode addressModeW;
float mipLodBias;
uint32 anisotropyEnable;
float maxAnisotropy;
uint32 compareEnable;
Gfx::SeCompareOp compareOp;
float minLod;
float maxLod;
Gfx::SeBorderColor borderColor;
uint32 unnormalizedCoordinates;
2020-10-03 11:00:10 +02:00
};
2020-05-05 01:51:13 +02:00
struct VertexBufferCreateInfo
{
2022-04-15 11:19:30 +02:00
BulkResourceData resourceData = BulkResourceData();
2020-05-05 01:51:13 +02:00
// bytes per vertex
2022-04-15 11:19:30 +02:00
uint32 vertexSize = 0;
uint32 numVertices = 0;
2020-05-05 01:51:13 +02:00
};
struct IndexBufferCreateInfo
{
2022-04-15 11:19:30 +02:00
BulkResourceData resourceData = BulkResourceData();
Gfx::SeIndexType indexType = Gfx::SeIndexType::SE_INDEX_TYPE_UINT16;
2020-05-05 01:51:13 +02:00
};
struct UniformBufferCreateInfo
{
2022-04-15 11:19:30 +02:00
BulkResourceData resourceData = BulkResourceData();
2022-04-15 23:45:44 +02:00
uint8 bDynamic = 0;
};
2023-08-28 21:23:13 +02:00
struct ShaderBufferCreateInfo
2021-05-10 23:57:55 +02:00
{
BulkResourceData resourceData;
2022-04-15 23:45:44 +02:00
uint32 stride;
uint8 bDynamic = 0;
2021-05-10 23:57:55 +02:00
};
2020-06-02 11:46:18 +02:00
struct ShaderCreateInfo
{
std::string mainModule;
//It's possible to input multiple source files for materials or vertexFactories
Array<std::string> additionalModules;
2021-05-06 17:02:10 +02:00
std::string name; // Debug info
2020-06-02 11:46:18 +02:00
std::string entryPoint;
Array<const char*> typeParameter;
2020-09-19 14:36:50 +02:00
Map<const char*, const char*> defines;
2020-06-02 11:46:18 +02:00
};
2020-05-05 01:51:13 +02:00
namespace Gfx
{
struct SePushConstantRange
{
SeShaderStageFlags stageFlags;
uint32_t offset;
uint32_t size;
};
struct VertexElement
{
2020-10-03 11:00:10 +02:00
uint8 streamIndex;
uint8 offset;
2020-05-05 01:51:13 +02:00
SeFormat vertexFormat;
2020-10-03 11:00:10 +02:00
uint8 attributeIndex;
uint8 stride;
uint8 bInstanced = 0;
2020-05-05 01:51:13 +02:00
};
2022-04-15 11:19:30 +02:00
static_assert(std::is_aggregate_v<VertexElement>);
2020-05-05 01:51:13 +02:00
struct RasterizationState
{
uint8 depthClampEnable : 1;
uint8 rasterizerDiscardEnable : 1;
uint8 depthBiasEnable : 1;
float depthBoasConstantFactor;
float depthBiasClamp;
float depthBiasSlopeFactor;
float lineWidth;
SePolygonMode polygonMode;
SeCullModeFlags cullMode;
SeFrontFace frontFace;
};
struct MultisampleState
{
uint32 samples;
float minSampleShading;
uint8 sampleShadingEnable : 1;
uint8 alphaCoverageEnable;
uint8 alphaToOneEnable;
};
struct DepthStencilState
{
uint8 depthTestEnable : 1;
uint8 depthWriteEnable : 1;
uint8 depthBoundsTestEnable : 1;
uint8 stencilTestEnable : 1;
SeCompareOp depthCompareOp;
SeStencilOp front;
SeStencilOp back;
float minDepthBounds;
float maxDepthBounds;
};
struct ColorBlendState
{
uint8 logicOpEnable : 1;
SeLogicOp logicOp;
uint32 attachmentCount;
struct BlendAttachment
{
uint8 blendEnable;
SeBlendFactor srcColorBlendFactor;
SeBlendFactor dstColorBlendFactor;
SeBlendOp colorBlendOp;
SeBlendFactor srcAlphaBlendFactor;
SeBlendFactor dstAlphaBlendFactor;
SeBlendOp alphaBlendOp;
SeColorComponentFlags colorWriteMask;
} blendAttachments[16];
float blendConstants[4];
};
} // namespace Gfx
2021-04-01 16:40:14 +02:00
DECLARE_NAME_REF(Gfx, VertexDeclaration)
DECLARE_NAME_REF(Gfx, VertexShader)
DECLARE_NAME_REF(Gfx, ControlShader)
DECLARE_NAME_REF(Gfx, EvaluationShader)
DECLARE_NAME_REF(Gfx, GeometryShader)
DECLARE_NAME_REF(Gfx, FragmentShader)
2021-05-10 23:57:55 +02:00
DECLARE_NAME_REF(Gfx, ComputeShader)
2021-04-01 16:40:14 +02:00
DECLARE_NAME_REF(Gfx, PipelineLayout)
DECLARE_NAME_REF(Gfx, RenderPass)
2020-05-05 01:51:13 +02:00
struct GraphicsPipelineCreateInfo
{
Gfx::PVertexDeclaration vertexDeclaration;
Gfx::PVertexShader vertexShader;
Gfx::PControlShader controlShader;
Gfx::PEvaluationShader evalShader;
Gfx::PGeometryShader geometryShader;
Gfx::PFragmentShader fragmentShader;
Gfx::PRenderPass renderPass;
2020-10-03 11:00:10 +02:00
Gfx::PPipelineLayout pipelineLayout;
2020-05-05 01:51:13 +02:00
Gfx::SePrimitiveTopology topology;
Gfx::RasterizationState rasterizationState;
Gfx::DepthStencilState depthStencilState;
Gfx::MultisampleState multisampleState;
Gfx::ColorBlendState colorBlend;
GraphicsPipelineCreateInfo()
{
2021-04-01 16:40:14 +02:00
std::memset((void*)this, 0, sizeof(*this));
2020-06-02 11:46:18 +02:00
topology = Gfx::SE_PRIMITIVE_TOPOLOGY_TRIANGLE_LIST;
rasterizationState.cullMode = Gfx::SE_CULL_MODE_BACK_BIT;
rasterizationState.polygonMode = Gfx::SE_POLYGON_MODE_FILL;
rasterizationState.frontFace = Gfx::SE_FRONT_FACE_COUNTER_CLOCKWISE;
2021-05-06 17:02:10 +02:00
depthStencilState.depthCompareOp = Gfx::SE_COMPARE_OP_LESS_OR_EQUAL;
2020-06-02 11:46:18 +02:00
depthStencilState.minDepthBounds = 0.0f;
depthStencilState.maxDepthBounds = 1.0f;
depthStencilState.stencilTestEnable = false;
depthStencilState.depthWriteEnable = true;
depthStencilState.depthTestEnable = true;
multisampleState.samples = 1;
colorBlend.attachmentCount = 0;
colorBlend.logicOpEnable = false;
colorBlend.blendConstants[0] = 1.0f;
colorBlend.blendConstants[1] = 1.0f;
colorBlend.blendConstants[2] = 1.0f;
colorBlend.blendConstants[3] = 1.0f;
2022-11-17 16:47:42 +01:00
colorBlend.blendAttachments[0].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;
2020-05-05 01:51:13 +02:00
}
};
2021-05-06 17:02:10 +02:00
struct ComputePipelineCreateInfo
{
Gfx::PComputeShader computeShader;
Gfx::PPipelineLayout pipelineLayout;
ComputePipelineCreateInfo()
{
std::memset((void*)this, 0, sizeof(*this));
}
};
2020-05-05 01:51:13 +02:00
} // namespace Seele