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
|
|
|
|
|
{
|
2022-11-15 12:19:11 +01:00
|
|
|
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
|
|
|
};
|
2020-11-03 01:18:30 +01: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;
|
2020-11-03 01:18:30 +01:00
|
|
|
};
|
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
|
|
|
|
|
{
|
2022-11-15 12:19:11 +01:00
|
|
|
std::string mainModule;
|
2020-08-06 00:54:43 +02:00
|
|
|
//It's possible to input multiple source files for materials or vertexFactories
|
2022-11-15 12:19:11 +01:00
|
|
|
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
|