MESH BUFFER
This commit is contained in:
parent
86d7adb07f
commit
523852da08
11 changed files with 93 additions and 51 deletions
|
|
@ -1,15 +0,0 @@
|
|||
module;
|
||||
|
||||
#include <cstdint>
|
||||
|
||||
export module Crafter.Graphics:Mesh;
|
||||
|
||||
namespace Crafter {
|
||||
export class Mesh {
|
||||
public:
|
||||
vks::Buffer buffer;
|
||||
Mesh();
|
||||
private:
|
||||
CameraBufferData data;
|
||||
};
|
||||
}
|
||||
|
|
@ -22,7 +22,7 @@ namespace Crafter {
|
|||
};
|
||||
export class Camera {
|
||||
public:
|
||||
Buffer<CameraBufferData, 1> buffer;
|
||||
Buffer<CameraBufferData> buffer;
|
||||
Camera();
|
||||
};
|
||||
}
|
||||
|
|
|
|||
19
Crafter.Graphics-Mesh.cppm
Normal file
19
Crafter.Graphics-Mesh.cppm
Normal file
|
|
@ -0,0 +1,19 @@
|
|||
module;
|
||||
|
||||
#include <cstdint>
|
||||
#include <vulkan/vulkan.h>
|
||||
|
||||
export module Crafter.Graphics:Mesh;
|
||||
import :VulkanBuffer;
|
||||
|
||||
namespace Crafter {
|
||||
export template <typename VertexType>
|
||||
class Mesh {
|
||||
public:
|
||||
Buffer<VertexType> verticies;
|
||||
Buffer<std::uint32_t> indicies;
|
||||
Mesh(std::uint32_t vertexCount, std::uint32_t indexCount) : verticies(VK_BUFFER_USAGE_STORAGE_BUFFER_BIT, VK_MEMORY_PROPERTY_HOST_VISIBLE_BIT | VK_MEMORY_PROPERTY_HOST_COHERENT_BIT, vertexCount), indicies(VK_BUFFER_USAGE_STORAGE_BUFFER_BIT, VK_MEMORY_PROPERTY_HOST_VISIBLE_BIT | VK_MEMORY_PROPERTY_HOST_COHERENT_BIT, indexCount) {
|
||||
|
||||
}
|
||||
};
|
||||
}
|
||||
|
|
@ -23,9 +23,10 @@ namespace Crafter {
|
|||
std::uint8_t a;
|
||||
};
|
||||
|
||||
export struct Vertex_xf32_yf32_zf32 {
|
||||
export struct __attribute__((packed)) Vertex_xf32_yf32_zf32_wf32 {
|
||||
float x;
|
||||
float y;
|
||||
float z;
|
||||
float w;
|
||||
};
|
||||
}
|
||||
|
|
|
|||
|
|
@ -8,12 +8,12 @@ export module Crafter.Graphics:VulkanBuffer;
|
|||
import :VulkanDevice;
|
||||
|
||||
namespace Crafter {
|
||||
export template <typename T, std::uint32_t count>
|
||||
export template <typename T>
|
||||
class Buffer {
|
||||
public:
|
||||
T* value;
|
||||
VkDescriptorBufferInfo descriptor;
|
||||
Buffer(VkBufferUsageFlags usageFlags, VkMemoryPropertyFlags memoryPropertyFlags) {
|
||||
Buffer(VkBufferUsageFlags usageFlags, VkMemoryPropertyFlags memoryPropertyFlags, std::uint32_t count = 1) {
|
||||
VkBufferCreateInfo bufferCreateInfo = vks::initializers::bufferCreateInfo(usageFlags, sizeof(T)*count);
|
||||
VulkanDevice::CHECK_VK_RESULT(vkCreateBuffer(VulkanDevice::device, &bufferCreateInfo, nullptr, &buffer));
|
||||
|
||||
|
|
|
|||
|
|
@ -23,7 +23,7 @@ import :WindowWaylandVulkan;
|
|||
namespace Crafter {
|
||||
struct DescriptorEntry {
|
||||
VkDescriptorType type;
|
||||
std::uint32_t occurrences = 0;
|
||||
bool occured = true;
|
||||
};
|
||||
|
||||
export template <typename MeshShader, typename FragmentShader>
|
||||
|
|
@ -35,7 +35,7 @@ namespace Crafter {
|
|||
for(const DescriptorBinding& binding : MeshShader::descriptors) {
|
||||
for(DescriptorEntry& type : types) {
|
||||
if(type.type == binding.type) {
|
||||
type.occurrences++;
|
||||
type.occured = true;
|
||||
}
|
||||
}
|
||||
}
|
||||
|
|
@ -43,14 +43,16 @@ namespace Crafter {
|
|||
for(const DescriptorBinding& binding : FragmentShader::descriptors) {
|
||||
for(DescriptorEntry& type : types) {
|
||||
if(type.type == binding.type) {
|
||||
type.occurrences++;
|
||||
type.occured = true;
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
std::uint32_t size = 0;
|
||||
for(DescriptorEntry& type : types) {
|
||||
size+=type.occurrences;
|
||||
if(type.occured) {
|
||||
size++;
|
||||
}
|
||||
}
|
||||
|
||||
return size;
|
||||
|
|
@ -58,30 +60,46 @@ namespace Crafter {
|
|||
constexpr static std::uint32_t uniqueDescriptorCount = GetUniqueDiscriptorCount();
|
||||
consteval static std::array<VkDescriptorPoolSize, uniqueDescriptorCount> GetPoolSizes() {
|
||||
std::array<VkDescriptorPoolSize, uniqueDescriptorCount> types = {};
|
||||
std::uint32_t i = 0;
|
||||
for(std::uint32_t i = 0; i < uniqueDescriptorCount; i++){
|
||||
types[i].descriptorCount = 12345;
|
||||
}
|
||||
|
||||
for(const DescriptorBinding& binding : MeshShader::descriptors) {
|
||||
bool found = false;
|
||||
for(VkDescriptorPoolSize& type : types) {
|
||||
if(type.type == binding.type) {
|
||||
if(type.type == binding.type && type.descriptorCount != 12345) {
|
||||
type.descriptorCount++;
|
||||
goto next;
|
||||
found = true;
|
||||
}
|
||||
}
|
||||
if(!found) {
|
||||
for(std::uint32_t i = 0; i < uniqueDescriptorCount; i++){
|
||||
if(types[i].descriptorCount == 12345) {
|
||||
types[i].type = binding.type;
|
||||
types[i].descriptorCount = 1;
|
||||
next:;
|
||||
break;
|
||||
}
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
for(const DescriptorBinding& binding : FragmentShader::descriptors) {
|
||||
bool found = false;
|
||||
for(VkDescriptorPoolSize& type : types) {
|
||||
if(type.type == binding.type) {
|
||||
type.descriptorCount++;
|
||||
goto next2;
|
||||
found = true;
|
||||
}
|
||||
}
|
||||
if(!found) {
|
||||
for(std::uint32_t i = 0; i < uniqueDescriptorCount; i++){
|
||||
if(types[i].descriptorCount == 12345) {
|
||||
types[i].type = binding.type;
|
||||
types[i].descriptorCount = 1;
|
||||
next2:;
|
||||
break;
|
||||
}
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
return types;
|
||||
|
|
@ -165,6 +183,7 @@ namespace Crafter {
|
|||
shaderStages[0].pName = MeshShader::_entrypoint.value;
|
||||
shaderStages[0].flags = 0;
|
||||
shaderStages[0].pSpecializationInfo = nullptr;
|
||||
shaderStages[0].pNext = nullptr;
|
||||
|
||||
// Fragment stage of the pipeline
|
||||
shaderStages[1].sType = VK_STRUCTURE_TYPE_PIPELINE_SHADER_STAGE_CREATE_INFO;
|
||||
|
|
@ -173,6 +192,7 @@ namespace Crafter {
|
|||
shaderStages[1].pName = FragmentShader::_entrypoint.value;
|
||||
shaderStages[1].flags = 0;
|
||||
shaderStages[1].pSpecializationInfo = nullptr;
|
||||
shaderStages[1].pNext = nullptr;
|
||||
|
||||
VulkanDevice::CHECK_VK_RESULT(vkCreateGraphicsPipelines(VulkanDevice::device, VK_NULL_HANDLE, 1, &pipelineCI, nullptr, &pipeline));
|
||||
}
|
||||
|
|
|
|||
|
|
@ -31,7 +31,7 @@ namespace Crafter {
|
|||
StringLiteral entrypoint,
|
||||
VkShaderStageFlagBits stage,
|
||||
std::uint32_t DescriptorCount,
|
||||
std::array<DescriptorBinding, DescriptorCount> Descriptors
|
||||
const std::array<DescriptorBinding, DescriptorCount> Descriptors
|
||||
>
|
||||
class VulkanShader {
|
||||
public:
|
||||
|
|
|
|||
|
|
@ -13,3 +13,4 @@ export import :VulkanElement;
|
|||
export import :Camera;
|
||||
export import :VulkanElementFromPipeline;
|
||||
export import :VulkanBuffer;
|
||||
export import :Mesh;
|
||||
23
main.cpp
23
main.cpp
|
|
@ -5,9 +5,9 @@
|
|||
import Crafter.Graphics;
|
||||
using namespace Crafter;
|
||||
|
||||
typedef VulkanShader<"test.spirv", "main", VK_SHADER_STAGE_MESH_BIT_EXT, 1, {{VK_DESCRIPTOR_TYPE_UNIFORM_BUFFER, 0}}> MeshShader;
|
||||
typedef VulkanShader<"test.spirv", "main", VK_SHADER_STAGE_MESH_BIT_EXT, 3, {{{VK_DESCRIPTOR_TYPE_UNIFORM_BUFFER, 0}, {VK_DESCRIPTOR_TYPE_STORAGE_BUFFER, 1}, {VK_DESCRIPTOR_TYPE_STORAGE_BUFFER, 2}}}> MeshShader;
|
||||
typedef VulkanShader<"test2.spirv", "main", VK_SHADER_STAGE_FRAGMENT_BIT, 0, {}> FragmentShader;
|
||||
typedef VulkanPipeline<VulkanShader<"test.spirv", "main", VK_SHADER_STAGE_MESH_BIT_EXT, 1, {{VK_DESCRIPTOR_TYPE_UNIFORM_BUFFER, 0}}>, VulkanShader<"test2.spirv", "main", VK_SHADER_STAGE_FRAGMENT_BIT, 0, {}>> Pipeline;
|
||||
typedef VulkanPipeline<MeshShader, FragmentShader> Pipeline;
|
||||
|
||||
int main() {
|
||||
// WindowWaylandWayland window("test", 128, 128);
|
||||
|
|
@ -33,13 +33,28 @@ int main() {
|
|||
|
||||
//WriteDescriptor(0, VK_DESCRIPTOR_TYPE_UNIFORM_BUFFER, 0, &uniformBuffer.descriptor);
|
||||
VulkanDevice::CreateDevice();
|
||||
WindowWaylandVulkan window("Crafter.Graphics", 128, 128);
|
||||
MeshShader::CreateShader();
|
||||
FragmentShader::CreateShader();
|
||||
Pipeline::CreatePipeline();
|
||||
VulkanElement test = VulkanElementFromPipeline<Pipeline>(3, 1, 1);
|
||||
|
||||
WindowWaylandVulkan window("Crafter.Graphics", 128, 128);
|
||||
|
||||
VulkanElement test = VulkanElementFromPipeline<Pipeline>(1, 1, 1);
|
||||
|
||||
Camera camera;
|
||||
test.WriteDescriptor(0, VK_DESCRIPTOR_TYPE_UNIFORM_BUFFER, 0, &camera.buffer.descriptor);
|
||||
|
||||
Mesh<Vertex_xf32_yf32_zf32_wf32> mesh(3, 3);
|
||||
mesh.verticies.value[0] = {0.0f, -1.0f, 0.0f, 1.0f};
|
||||
mesh.verticies.value[1] = {-1.0f, 1.0f, 0.0f, 1.0f};
|
||||
mesh.verticies.value[2] = {1.0f, 1.0f, 0.0f, 1.0f};
|
||||
|
||||
mesh.indicies.value[0] = 0;
|
||||
mesh.indicies.value[0] = 1;
|
||||
mesh.indicies.value[0] = 2;
|
||||
test.WriteDescriptor(0, VK_DESCRIPTOR_TYPE_STORAGE_BUFFER, 1, &mesh.verticies.descriptor);
|
||||
test.WriteDescriptor(0, VK_DESCRIPTOR_TYPE_STORAGE_BUFFER, 2, &mesh.indicies.descriptor);
|
||||
|
||||
window.vulkanElements.AddComponent(&test);
|
||||
window.Start();
|
||||
while(true) {
|
||||
|
|
|
|||
|
|
@ -6,7 +6,7 @@
|
|||
"standard": "c++26",
|
||||
"source_files": ["Crafter.Graphics-Window","Crafter.Graphics-WindowWayland","Crafter.Graphics-WindowWaylandWayland", "Crafter.Graphics-UiElement", "Crafter.Graphics-VulkanDevice", "Crafter.Graphics-WindowWaylandVulkan", "VulkanBuffer", "VulkanTools", "Crafter.Graphics-VulkanElement", "Crafter.Graphics-Camera"],
|
||||
"c_files": ["wayland-xdg-decoration-unstable-v1-client-protocol", "xdg-shell-protocol", "shm"],
|
||||
"module_files": ["Crafter.Graphics-Window","Crafter.Graphics-WindowWayland","Crafter.Graphics-WindowWaylandWayland", "Crafter.Graphics", "Crafter.Graphics-UiElement", "Crafter.Graphics-Types", "Crafter.Graphics-VulkanDevice", "Crafter.Graphics-VulkanPipeline", "Crafter.Graphics-VulkanShader", "Crafter.Graphics-WindowWaylandVulkan", "Crafter.Graphics-VulkanElement", "Crafter.Graphics-VulkanElementFromPipeline", "Crafter.Graphics-Camera", "Crafter.Graphics-VulkanBuffer"],
|
||||
"module_files": ["Crafter.Graphics-Window","Crafter.Graphics-WindowWayland","Crafter.Graphics-WindowWaylandWayland", "Crafter.Graphics", "Crafter.Graphics-UiElement", "Crafter.Graphics-Types", "Crafter.Graphics-VulkanDevice", "Crafter.Graphics-VulkanPipeline", "Crafter.Graphics-VulkanShader", "Crafter.Graphics-WindowWaylandVulkan", "Crafter.Graphics-VulkanElement", "Crafter.Graphics-VulkanElementFromPipeline", "Crafter.Graphics-Camera", "Crafter.Graphics-VulkanBuffer", "Crafter.Graphics-Mesh"],
|
||||
"build_dir": "./build",
|
||||
"output_dir": "./bin",
|
||||
"type":"library",
|
||||
|
|
|
|||
23
test.mesh
23
test.mesh
|
|
@ -14,6 +14,15 @@ layout (binding = 0) uniform UBO
|
|||
mat4 view;
|
||||
} ubo;
|
||||
|
||||
layout (binding = 1) buffer VERTEX
|
||||
{
|
||||
vec4 pos[];
|
||||
} vertex;
|
||||
layout (binding = 2) buffer INDEX {
|
||||
uint index[];
|
||||
} index;
|
||||
|
||||
|
||||
layout(local_size_x = 1, local_size_y = 1, local_size_z = 1) in;
|
||||
layout(triangles, max_vertices = 3, max_primitives = 1) out;
|
||||
|
||||
|
|
@ -22,12 +31,6 @@ layout(location = 0) out VertexOutput
|
|||
vec4 color;
|
||||
} vertexOutput[];
|
||||
|
||||
const vec4[3] positions = {
|
||||
vec4( 0.0, -1.0, 0.0, 1.0),
|
||||
vec4(-1.0, 1.0, 0.0, 1.0),
|
||||
vec4( 1.0, 1.0, 0.0, 1.0)
|
||||
};
|
||||
|
||||
const vec4[3] colors = {
|
||||
vec4(0.0, 1.0, 0.0, 1.0),
|
||||
vec4(0.0, 0.0, 1.0, 1.0),
|
||||
|
|
@ -38,13 +41,11 @@ void main()
|
|||
{
|
||||
uint iid = gl_LocalInvocationID.x;
|
||||
|
||||
vec4 offset = vec4(0.0, 0.0, gl_GlobalInvocationID.x, 0.0);
|
||||
|
||||
SetMeshOutputsEXT(3, 1);
|
||||
mat4 mvp = ubo.projection * ubo.view * ubo.model;
|
||||
gl_MeshVerticesEXT[0].gl_Position = mvp * (positions[0] + offset);
|
||||
gl_MeshVerticesEXT[1].gl_Position = mvp * (positions[1] + offset);
|
||||
gl_MeshVerticesEXT[2].gl_Position = mvp * (positions[2] + offset);
|
||||
gl_MeshVerticesEXT[0].gl_Position = mvp * vertex.pos[0];
|
||||
gl_MeshVerticesEXT[1].gl_Position = mvp * vertex.pos[1];
|
||||
gl_MeshVerticesEXT[2].gl_Position = mvp * vertex.pos[2];
|
||||
vertexOutput[0].color = colors[0];
|
||||
vertexOutput[1].color = colors[1];
|
||||
vertexOutput[2].color = colors[2];
|
||||
|
|
|
|||
Loading…
Add table
Add a link
Reference in a new issue