From f5ad28145836ff5714e596ad5c898e0bfe826866 Mon Sep 17 00:00:00 2001 From: r Date: Wed, 28 May 2025 17:07:58 +0200 Subject: [PATCH 01/40] template n comp shader --- include/ssbo.hpp | 5 ++--- shaders/anim.slang | 29 +++++++++++++++++++++++++++++ shaders/comp.slang | 15 +++++++++++++++ src/buffer/ssbo.cpp | 24 ++---------------------- 4 files changed, 48 insertions(+), 25 deletions(-) create mode 100644 shaders/anim.slang create mode 100644 shaders/comp.slang diff --git a/include/ssbo.hpp b/include/ssbo.hpp index c056d04..ef92b9b 100644 --- a/include/ssbo.hpp +++ b/include/ssbo.hpp @@ -8,8 +8,7 @@ class ssbo { public: static bool init(vkobjs &objs, ssbodata &ssbodata, size_t buffersize); - static void upload(vkobjs &objs, ssbodata &ssbodata, std::vector mats); - static void upload(vkobjs &objs, ssbodata &ssbodata, std::vector mats); - static void upload(vkobjs &objs, ssbodata &ssbodata, const std::vector &mats); + template + static void upload(const vkobjs &objs,const ssbodata &ssbodata, const std::vector &mats); static void cleanup(vkobjs &objs, ssbodata &ssbodata); }; diff --git a/shaders/anim.slang b/shaders/anim.slang new file mode 100644 index 0000000..f64aa25 --- /dev/null +++ b/shaders/anim.slang @@ -0,0 +1,29 @@ + +struct consts { + int aModelStride; + uint txid; + float t; +} +struct cams { + float4x4 view; + float4x4 projection; +} +struct jmats { + float4x4 jointmats; +} + +[vk_push_constant] +ConstantBuffer Constants; + +[[vk_binding(0, 1)]] +ConstantBuffer cammats; + +[[vk_binding(0, 2)]] +StructuredBuffer jmatbuffer; + + +[shader("compute")] +[[numthreads(256, 1, 1)]] +void cpmain(uint3 tid:SV_DispatchThreadID) { + +} \ No newline at end of file diff --git a/shaders/comp.slang b/shaders/comp.slang new file mode 100644 index 0000000..194d41a --- /dev/null +++ b/shaders/comp.slang @@ -0,0 +1,15 @@ + + +struct particle { + float3 pos; + float3 vel; +} + +RWStructuredBuffer Ps; + + +[shader("compute")] +[[numthreads(256, 1, 1)]] +void cpmain(uint3 tid:SV_DispatchThreadID) { + +} \ No newline at end of file diff --git a/src/buffer/ssbo.cpp b/src/buffer/ssbo.cpp index 14f8281..10cf000 100644 --- a/src/buffer/ssbo.cpp +++ b/src/buffer/ssbo.cpp @@ -78,28 +78,8 @@ bool ssbo::init(vkobjs &objs, ssbodata &SSBOData, size_t bufferSize) { return true; } -void ssbo::upload(vkobjs &objs, ssbodata &ssbodata, std::vector mats) { - if (mats.size() == 0) { - return; - } - - void *data; - vmaMapMemory(objs.alloc, ssbodata.alloc, &data); - std::memcpy(data, mats.data(), ssbodata.size); - vmaUnmapMemory(objs.alloc, ssbodata.alloc); -} - -void ssbo::upload(vkobjs &objs, ssbodata &ssbodata, std::vector mats) { - if (mats.size() == 0) { - return; - } - - void *data; - vmaMapMemory(objs.alloc, ssbodata.alloc, &data); - std::memcpy(data, mats.data(), ssbodata.size); - vmaUnmapMemory(objs.alloc, ssbodata.alloc); -} -void ssbo::upload(vkobjs &objs, ssbodata &ssbodata, const std::vector &mats) { +template +void ssbo::upload(const vkobjs &objs,const ssbodata &ssbodata, const std::vector &mats) { if (mats.size() == 0) { return; } From d287a5ebdacb2d357dc9c2577c5692172941d1d9 Mon Sep 17 00:00:00 2001 From: r Date: Fri, 30 May 2025 16:18:29 +0300 Subject: [PATCH 02/40] random --- CMakeLists.txt | 67 ++++++++++++--------- include/buffer/ssbo.hpp | 102 +++++++++++++++++++++++++++++++ include/playoutgeneric.hpp | 2 +- include/ssbo.hpp | 14 ----- include/ssbomesh.hpp | 14 ----- include/ubo.hpp | 4 +- include/vkobjs.hpp | 22 +++++++ include/vkrenderer.hpp | 2 +- shaders/anim.slang | 29 --------- shaders/comp.slang | 15 ----- shaders/gen.slang | 47 +++++++++++---- src/buffer/ssbo.cpp | 97 ------------------------------ src/buffer/ssbomesh.cpp | 107 --------------------------------- src/buffer/ubo.cpp | 9 +-- src/playout/playoutgeneric.cpp | 5 +- 15 files changed, 204 insertions(+), 332 deletions(-) create mode 100644 include/buffer/ssbo.hpp delete mode 100644 include/ssbo.hpp delete mode 100644 include/ssbomesh.hpp delete mode 100644 shaders/anim.slang delete mode 100644 shaders/comp.slang delete mode 100644 src/buffer/ssbo.cpp delete mode 100644 src/buffer/ssbomesh.cpp diff --git a/CMakeLists.txt b/CMakeLists.txt index 1ab49c9..ad40101 100644 --- a/CMakeLists.txt +++ b/CMakeLists.txt @@ -173,36 +173,49 @@ endif() file(GLOB shaders ${PROJECT_BINARY_DIR}/shaders/*) list(LENGTH shaders shader_len) -#wip -file(GLOB_RECURSE GLSL_SOURCE_FILES - # "${PROJECT_SOURCE_DIR}/shaders/*.frag" - # "${PROJECT_SOURCE_DIR}/shaders/*.vert" - "${PROJECT_SOURCE_DIR}/shaders/*.slang" - ) - foreach(GLSL ${GLSL_SOURCE_FILES}) - # get_filename_component(GLSL_EXT "${GLSL}" EXT) - # if(GLSL_EXT STREQUAL ".frag") - # set(SLANG_STAGE "fragment") - # elseif(GLSL_EXT STREQUAL ".vert") - # set(SLANG_STAGE "vertex") - # elseif(GLSL_EXT STREQUAL ".comp") - # set(SLANG_STAGE "compute") - # endif() - file(TO_CMAKE_PATH "${GLSL}" GLSL_NATIVE) - cmake_path(GET GLSL_NATIVE FILENAME SPIRV_NAME) - set(VXSPIRV "${PROJECT_BINARY_DIR}/shaders/${SPIRV_NAME}.vx.spv") - set(PXSPIRV "${PROJECT_BINARY_DIR}/shaders/${SPIRV_NAME}.px.spv") +# #wip +# file(GLOB_RECURSE GLSL_SOURCE_FILES +# # "${PROJECT_SOURCE_DIR}/shaders/*.frag" +# # "${PROJECT_SOURCE_DIR}/shaders/*.vert" +# "${PROJECT_SOURCE_DIR}/shaders/*.slang" +# ) +# foreach(GLSL ${GLSL_SOURCE_FILES}) +# # get_filename_component(GLSL_EXT "${GLSL}" EXT) +# # if(GLSL_EXT STREQUAL ".frag") +# # set(SLANG_STAGE "fragment") +# # elseif(GLSL_EXT STREQUAL ".vert") +# # set(SLANG_STAGE "vertex") +# # elseif(GLSL_EXT STREQUAL ".comp") +# # set(SLANG_STAGE "compute") +# # endif() +# file(TO_CMAKE_PATH "${GLSL}" GLSL_NATIVE) +# cmake_path(GET GLSL_NATIVE FILENAME SPIRV_NAME) +# set(VXSPIRV "${PROJECT_BINARY_DIR}/shaders/${SPIRV_NAME}.vx.spv") +# set(PXSPIRV "${PROJECT_BINARY_DIR}/shaders/${SPIRV_NAME}.px.spv") +# add_custom_command( +# OUTPUT ${VXSPIRV} +# OUTPUT ${PXSPIRV} +# COMMAND ${CMAKE_COMMAND} -E make_directory "${PROJECT_BINARY_DIR}/shaders" +# # COMMAND ${SHELL_CMD} -c "$ENV{VULKAN_SDK}/bin/slangc -default-downstream-compiler glsl glslang -lang glsl -entry main $<$:-g> $<$:-O3> -stage ${SLANG_STAGE} -matrix-layout-row-major -target spirv -capability SPIRV_1_6 ${GLSL_NATIVE} -o ${SPIRV}" DEPENDS ${GLSL_NATIVE} +# COMMAND ${SHELL_CMD} -c "$ENV{VULKAN_SDK}/bin/slangc -entry vxmain $<$:-g> $<$:-O3> -stage vertex -target spirv -capability SPIRV_1_6 ${GLSL_NATIVE} -o ${VXSPIRV}" DEPENDS ${GLSL_NATIVE} +# COMMAND ${SHELL_CMD} -c "$ENV{VULKAN_SDK}/bin/slangc -entry pxmain $<$:-g> $<$:-O3> -stage pixel -target spirv -capability SPIRV_1_6 ${GLSL_NATIVE} -o ${PXSPIRV}" DEPENDS ${GLSL_NATIVE} +# ) +# list(APPEND SPIRV_BINARY_FILES ${VXSPIRV}) +# list(APPEND SPIRV_BINARY_FILES ${PXSPIRV}) +# endforeach() +# set_source_files_properties(${SPIRV_BINARY_FILES} PROPERTIES GENERATED TRUE) +# add_custom_target(shaders ALL DEPENDS ${SPIRV_BINARY_FILES}) +# add_dependencies(rview2 shaders) + +#manually adding shaders for now add_custom_command( - OUTPUT ${VXSPIRV} - OUTPUT ${PXSPIRV} + OUTPUT ${PROJECT_BINARY_DIR}/shaders/vx.spv ${PROJECT_BINARY_DIR}/shaders/px.spv ${PROJECT_BINARY_DIR}/shaders/cx.spv COMMAND ${CMAKE_COMMAND} -E make_directory "${PROJECT_BINARY_DIR}/shaders" - # COMMAND ${SHELL_CMD} -c "$ENV{VULKAN_SDK}/bin/slangc -default-downstream-compiler glsl glslang -lang glsl -entry main $<$:-g> $<$:-O3> -stage ${SLANG_STAGE} -matrix-layout-row-major -target spirv -capability SPIRV_1_6 ${GLSL_NATIVE} -o ${SPIRV}" DEPENDS ${GLSL_NATIVE} - COMMAND ${SHELL_CMD} -c "$ENV{VULKAN_SDK}/bin/slangc -entry vxmain $<$:-g> $<$:-O3> -stage vertex -target spirv -capability SPIRV_1_6 ${GLSL_NATIVE} -o ${VXSPIRV}" DEPENDS ${GLSL_NATIVE} - COMMAND ${SHELL_CMD} -c "$ENV{VULKAN_SDK}/bin/slangc -entry pxmain $<$:-g> $<$:-O3> -stage pixel -target spirv -capability SPIRV_1_6 ${GLSL_NATIVE} -o ${PXSPIRV}" DEPENDS ${GLSL_NATIVE} + COMMAND ${SHELL_CMD} -c "$ENV{VULKAN_SDK}/bin/slangc -entry vxmain $<$:-g> $<$:-O3> -stage vertex -target spirv -capability SPIRV_1_6 ${PROJECT_SOURCE_DIR}/shaders/gen.slang -o ${PROJECT_BINARY_DIR}/shaders/vx.spv" DEPENDS ${PROJECT_SOURCE_DIR}/shaders/gen.slang + COMMAND ${SHELL_CMD} -c "$ENV{VULKAN_SDK}/bin/slangc -entry pxmain $<$:-g> $<$:-O3> -stage pixel -target spirv -capability SPIRV_1_6 ${PROJECT_SOURCE_DIR}/shaders/gen.slang -o ${PROJECT_BINARY_DIR}/shaders/px.spv" DEPENDS ${PROJECT_SOURCE_DIR}/shaders/gen.slang + COMMAND ${SHELL_CMD} -c "$ENV{VULKAN_SDK}/bin/slangc -entry cxmain $<$:-g> $<$:-O3> -stage compute -target spirv -capability SPIRV_1_6 ${PROJECT_SOURCE_DIR}/shaders/gen.slang -o ${PROJECT_BINARY_DIR}/shaders/cx.spv" DEPENDS ${PROJECT_SOURCE_DIR}/shaders/gen.slang ) - list(APPEND SPIRV_BINARY_FILES ${VXSPIRV}) - list(APPEND SPIRV_BINARY_FILES ${PXSPIRV}) - endforeach() + list(APPEND SPIRV_BINARY_FILES ${PROJECT_BINARY_DIR}/shaders/vx.spv ${PROJECT_BINARY_DIR}/shaders/px.spv ${PROJECT_BINARY_DIR}/shaders/cx.spv) set_source_files_properties(${SPIRV_BINARY_FILES} PROPERTIES GENERATED TRUE) add_custom_target(shaders ALL DEPENDS ${SPIRV_BINARY_FILES}) add_dependencies(rview2 shaders) diff --git a/include/buffer/ssbo.hpp b/include/buffer/ssbo.hpp new file mode 100644 index 0000000..cc6452b --- /dev/null +++ b/include/buffer/ssbo.hpp @@ -0,0 +1,102 @@ +#pragma once +#include +#include +#include + +#include "vkobjs.hpp" + +namespace ssbo { + static inline bool init(vkobjs &objs, ssbodata &ssboData, size_t buffersize) { + VkBufferCreateInfo bufferInfo{}; + bufferInfo.sType = VK_STRUCTURE_TYPE_BUFFER_CREATE_INFO; + bufferInfo.size = buffersize; + bufferInfo.usage = VK_BUFFER_USAGE_STORAGE_BUFFER_BIT; + + VmaAllocationCreateInfo vmaAllocInfo{}; + vmaAllocInfo.usage = VMA_MEMORY_USAGE_CPU_TO_GPU; + + if (vmaCreateBuffer(objs.alloc, &bufferInfo, &vmaAllocInfo, &ssboData.buffer, &ssboData.alloc, nullptr) != + VK_SUCCESS) { + return false; + } + + VkDescriptorSetLayoutBinding ssboBind{}; + ssboBind.descriptorType = VK_DESCRIPTOR_TYPE_STORAGE_BUFFER; + ssboBind.binding = 0; + ssboBind.descriptorCount = 1; + ssboBind.pImmutableSamplers = nullptr; + ssboBind.stageFlags = VK_SHADER_STAGE_VERTEX_BIT; + + VkDescriptorSetLayoutCreateInfo ssboCreateInfo{}; + ssboCreateInfo.sType = VK_STRUCTURE_TYPE_DESCRIPTOR_SET_LAYOUT_CREATE_INFO; + ssboCreateInfo.bindingCount = 1; + ssboCreateInfo.pBindings = &ssboBind; + + if (vkCreateDescriptorSetLayout(objs.vkdevice.device, &ssboCreateInfo, nullptr, &ssboData.dlayout) != VK_SUCCESS) { + return false; + } + + VkDescriptorPoolSize poolSize{}; + poolSize.type = VK_DESCRIPTOR_TYPE_STORAGE_BUFFER; + poolSize.descriptorCount = 1; + + VkDescriptorPoolCreateInfo descriptorPool{}; + descriptorPool.sType = VK_STRUCTURE_TYPE_DESCRIPTOR_POOL_CREATE_INFO; + descriptorPool.poolSizeCount = 1; + descriptorPool.pPoolSizes = &poolSize; + descriptorPool.maxSets = 1; + + if (vkCreateDescriptorPool(objs.vkdevice.device, &descriptorPool, nullptr, &ssboData.dpool) != VK_SUCCESS) { + return false; + } + + VkDescriptorSetAllocateInfo descriptorAllocateInfo{}; + descriptorAllocateInfo.sType = VK_STRUCTURE_TYPE_DESCRIPTOR_SET_ALLOCATE_INFO; + descriptorAllocateInfo.descriptorPool = ssboData.dpool; + descriptorAllocateInfo.descriptorSetCount = 1; + descriptorAllocateInfo.pSetLayouts = &ssboData.dlayout; + + if (vkAllocateDescriptorSets(objs.vkdevice.device, &descriptorAllocateInfo, &ssboData.dset) != VK_SUCCESS) { + return false; + } + + VkDescriptorBufferInfo ssboInfo{}; + ssboInfo.buffer = ssboData.buffer; + ssboInfo.offset = 0; + ssboInfo.range = buffersize; + + VkWriteDescriptorSet writeDescriptorSet{}; + writeDescriptorSet.sType = VK_STRUCTURE_TYPE_WRITE_DESCRIPTOR_SET; + writeDescriptorSet.descriptorType = VK_DESCRIPTOR_TYPE_STORAGE_BUFFER; + writeDescriptorSet.dstSet = ssboData.dset; + writeDescriptorSet.dstBinding = 0; + writeDescriptorSet.descriptorCount = 1; + writeDescriptorSet.pBufferInfo = &ssboInfo; + + vkUpdateDescriptorSets(objs.vkdevice.device, 1, &writeDescriptorSet, 0, nullptr); + + ssboData.size = buffersize; + + return true; + } + // template + // concept vectoradjacent = requires(T x){ + // {x.size()} -> std::convertible_to; + // {x.data()}; + // }; + template + static inline void upload(const vkobjs &objs, const ssbodata &ssbodata, const std::vector &mats) { + if (mats.size() <= 0) { + return; + } + void *data; + vmaMapMemory(objs.alloc, ssbodata.alloc, &data); + std::memcpy(data, mats.data(), ssbodata.size); + vmaUnmapMemory(objs.alloc, ssbodata.alloc); + } +static inline void cleanup(vkobjs &objs, ssbodata &ssbodata) { + vkDestroyDescriptorPool(objs.vkdevice.device, ssbodata.dpool, nullptr); + vkDestroyDescriptorSetLayout(objs.vkdevice.device, ssbodata.dlayout, nullptr); + vmaDestroyBuffer(objs.alloc, ssbodata.buffer, ssbodata.alloc); + } +}; diff --git a/include/playoutgeneric.hpp b/include/playoutgeneric.hpp index 72c6917..091b970 100644 --- a/include/playoutgeneric.hpp +++ b/include/playoutgeneric.hpp @@ -22,7 +22,7 @@ class playoutgeneric { void cleanupbuffers(vkobjs &objs); void cleanupmodels(vkobjs &objs); void uploadvboebo(vkobjs &objs, VkCommandBuffer &cbuffer); - void uploadubossbo(vkobjs &objs, std::vector &cammats); + void uploadubossbo(vkobjs &objs,std::vector &cammats); std::shared_ptr getinst(int i); diff --git a/include/ssbo.hpp b/include/ssbo.hpp deleted file mode 100644 index ef92b9b..0000000 --- a/include/ssbo.hpp +++ /dev/null @@ -1,14 +0,0 @@ -#pragma once -#include -#include -#include - -#include "vkobjs.hpp" - -class ssbo { -public: - static bool init(vkobjs &objs, ssbodata &ssbodata, size_t buffersize); - template - static void upload(const vkobjs &objs,const ssbodata &ssbodata, const std::vector &mats); - static void cleanup(vkobjs &objs, ssbodata &ssbodata); -}; diff --git a/include/ssbomesh.hpp b/include/ssbomesh.hpp deleted file mode 100644 index 54cd5e1..0000000 --- a/include/ssbomesh.hpp +++ /dev/null @@ -1,14 +0,0 @@ -#pragma once -#include -#include -#include - -#include "vkobjs.hpp" - -class ssbomesh { -public: - static bool init(vkobjs &objs, ssbodata &ssbodata); - static void upload(vkobjs &objs, ssbodata &ssbodata, std::vector &mats); - static void upload(vkobjs &objs, ssbodata &ssbodata, std::vector mats); - static void cleanup(vkobjs &objs, ssbodata &ssbodata); -}; \ No newline at end of file diff --git a/include/ubo.hpp b/include/ubo.hpp index c837630..780eaf7 100644 --- a/include/ubo.hpp +++ b/include/ubo.hpp @@ -5,8 +5,6 @@ class ubo { public: static bool init(vkobjs &mvkobjs, std::vector &ubodata); - static void upload(vkobjs &mvkobjs, std::vector &ubodata, std::vector mats, - unsigned int texidx); - static void upload(vkobjs &mvkobjs, std::vector &ubodata, unsigned int texidx); + static void upload(vkobjs &mvkobjs, std::vector &ubodata, std::vector mats); static void cleanup(vkobjs &mvkobjs, std::vector &ubodata); }; diff --git a/include/vkobjs.hpp b/include/vkobjs.hpp index f3db52b..3515e8c 100644 --- a/include/vkobjs.hpp +++ b/include/vkobjs.hpp @@ -9,6 +9,9 @@ #include #include + + + enum class skinningmode { linear = 0, dualquat }; enum class replaydirection { forward = 0, backward }; enum class blendmode { fadeinout = 0, crossfade, additive }; @@ -65,6 +68,15 @@ struct ssbodata { VkDescriptorSet dset = VK_NULL_HANDLE; }; +struct buffdata { + size_t size{0}; + VkBuffer buffer = VK_NULL_HANDLE; + VmaAllocation alloc = nullptr; + + VkDescriptorPool dpool = VK_NULL_HANDLE; + VkDescriptorSetLayout dlayout = VK_NULL_HANDLE; + VkDescriptorSet dset = VK_NULL_HANDLE; +}; struct vkpushconstants { int stride; unsigned int texidx; @@ -155,3 +167,13 @@ struct vkgltfobjs { std::vector texs{}; texdatapls texpls{}; }; +namespace rpool{ + static inline bool create(){ + return true; + } +}; +namespace rbuffer{ + static inline bool create(vkobjs& objs, buffdata &bdata, size_t bsize, bool btype, size_t bstage,size_t ){ + return true; + } +}; \ No newline at end of file diff --git a/include/vkrenderer.hpp b/include/vkrenderer.hpp index 86a5977..c1b2055 100644 --- a/include/vkrenderer.hpp +++ b/include/vkrenderer.hpp @@ -114,7 +114,7 @@ class vkrenderer { std::vector playercount{1}; std::vector playerfname{{"resources/p0.glb"}}; - const std::vector> playershaders{{"shaders/gen.slang.vx.spv", "shaders/gen.slang.px.spv"}}; + const std::vector> playershaders{{"shaders/vx.spv", "shaders/px.spv"}}; ui mui{}; timer mframetimer{}; diff --git a/shaders/anim.slang b/shaders/anim.slang deleted file mode 100644 index f64aa25..0000000 --- a/shaders/anim.slang +++ /dev/null @@ -1,29 +0,0 @@ - -struct consts { - int aModelStride; - uint txid; - float t; -} -struct cams { - float4x4 view; - float4x4 projection; -} -struct jmats { - float4x4 jointmats; -} - -[vk_push_constant] -ConstantBuffer Constants; - -[[vk_binding(0, 1)]] -ConstantBuffer cammats; - -[[vk_binding(0, 2)]] -StructuredBuffer jmatbuffer; - - -[shader("compute")] -[[numthreads(256, 1, 1)]] -void cpmain(uint3 tid:SV_DispatchThreadID) { - -} \ No newline at end of file diff --git a/shaders/comp.slang b/shaders/comp.slang deleted file mode 100644 index 194d41a..0000000 --- a/shaders/comp.slang +++ /dev/null @@ -1,15 +0,0 @@ - - -struct particle { - float3 pos; - float3 vel; -} - -RWStructuredBuffer Ps; - - -[shader("compute")] -[[numthreads(256, 1, 1)]] -void cpmain(uint3 tid:SV_DispatchThreadID) { - -} \ No newline at end of file diff --git a/shaders/gen.slang b/shaders/gen.slang index 6d18e00..74791e0 100644 --- a/shaders/gen.slang +++ b/shaders/gen.slang @@ -6,11 +6,18 @@ struct texidx { } struct VXin { - float3 pos:POSITION; - float3 aNormal:NORMAL; - float2 aTexCoord:TEXCOORD; - uint4 aJointNum:JOINTS; - float4 aJointWeight:WEIGHTS; + float3 pos : POSITION; + float3 aNormal : NORMAL; + float2 tex0 : TEXCOORD_0; + uint4 joi0 : JOINTS_0; + float4 wei0 : WEIGHTS_0; + // float2 tex1 : TEXCOORD_1; + // float2 tex2 : TEXCOORD_2; + // float2 tex3 : TEXCOORD_3; + // float2 tex4 : TEXCOORD_4; + // float2 tex5 : TEXCOORD_5; + // uint4 joi1 : JOINTS_1; + // float4 wei1 : WEIGHTS_1; } struct PXin { @@ -44,6 +51,14 @@ struct jmats { float4x4 jointmats; } +struct anim { + float3 trans; + float3 scale; + float4 rot; +} + +RWStructuredBuffer Ps; + [vk_push_constant] ConstantBuffer Constants; @@ -51,7 +66,7 @@ ConstantBuffer Constants; ConstantBuffer cammats; [[vk_binding(0, 2)]] -StructuredBuffer jmatbuffer; +RWStructuredBuffer jmatbuffer; [[vk_binding(1, 1)]] ConstantBuffer texid2; @@ -59,11 +74,10 @@ ConstantBuffer texid2; //stumped [shader("vertex")] VXout vxmain(VXin vxin) { - // float4x4 skinmat = JointMatrices[0].jointMat[vxin.aJointNum.x].scale(vxin.aJointWeight.x.toFloat()).add(JointMatrices[0].jointMat[vxin.aJointNum.y].scale(vxin.aJointWeight.y.toFloat()).add(JointMatrices[0].jointMat[vxin.aJointNum.z].scale(vxin.aJointWeight.z.toFloat())).add(JointMatrices[0].jointMat[vxin.aJointNum.w].scale(vxin.aJointWeight.w.toFloat()))); - float4x4 skinmat = jmatbuffer[vxin.aJointNum.x].jointmats * vxin.aJointWeight.x + - jmatbuffer[vxin.aJointNum.y].jointmats * vxin.aJointWeight.y + - jmatbuffer[vxin.aJointNum.z].jointmats * vxin.aJointWeight.z + - jmatbuffer[vxin.aJointNum.w].jointmats * vxin.aJointWeight.w ; + float4x4 skinmat = jmatbuffer[vxin.joi0.x].jointmats * vxin.wei0.x + + jmatbuffer[vxin.joi0.y].jointmats * vxin.wei0.y + + jmatbuffer[vxin.joi0.z].jointmats * vxin.wei0.z + + jmatbuffer[vxin.joi0.w].jointmats * vxin.wei0.w ; VXout out; float4x4 x = mul(cammats.projection, cammats.view); float4x4 y = mul(x, skinmat); @@ -71,8 +85,8 @@ VXout vxmain(VXin vxin) { float4 z = mul(y, xx); out.sv_position = z; out.pxin0.normal = vxin.aNormal; - out.pxin0.texCoord = vxin.aTexCoord; - out.pxin0.newcolor = vxin.aJointNum; + out.pxin0.texCoord = vxin.tex0; + out.pxin0.newcolor = vxin.joi0; out.pxin0.txidx = Constants.txid; out.pxin0.t2 = Constants.t; out.pxin0.dec = 0.0; @@ -87,3 +101,10 @@ PXout pxmain(PXin pxin) { return out; } + + +[shader("compute")] +[[numthreads(256, 1, 1)]] +void cxmain(uint3 tid: SV_DispatchThreadID) { + +} \ No newline at end of file diff --git a/src/buffer/ssbo.cpp b/src/buffer/ssbo.cpp deleted file mode 100644 index 10cf000..0000000 --- a/src/buffer/ssbo.cpp +++ /dev/null @@ -1,97 +0,0 @@ -#include "ssbo.hpp" - -#include - -bool ssbo::init(vkobjs &objs, ssbodata &SSBOData, size_t bufferSize) { - VkBufferCreateInfo bufferInfo{}; - bufferInfo.sType = VK_STRUCTURE_TYPE_BUFFER_CREATE_INFO; - bufferInfo.size = bufferSize; - bufferInfo.usage = VK_BUFFER_USAGE_STORAGE_BUFFER_BIT; - - VmaAllocationCreateInfo vmaAllocInfo{}; - vmaAllocInfo.usage = VMA_MEMORY_USAGE_CPU_TO_GPU; - - if (vmaCreateBuffer(objs.alloc, &bufferInfo, &vmaAllocInfo, &SSBOData.buffer, &SSBOData.alloc, - nullptr) != VK_SUCCESS) { - return false; - } - - VkDescriptorSetLayoutBinding ssboBind{}; - ssboBind.descriptorType = VK_DESCRIPTOR_TYPE_STORAGE_BUFFER; - ssboBind.binding = 0; - ssboBind.descriptorCount = 1; - ssboBind.pImmutableSamplers = nullptr; - ssboBind.stageFlags = VK_SHADER_STAGE_VERTEX_BIT; - - VkDescriptorSetLayoutCreateInfo ssboCreateInfo{}; - ssboCreateInfo.sType = VK_STRUCTURE_TYPE_DESCRIPTOR_SET_LAYOUT_CREATE_INFO; - ssboCreateInfo.bindingCount = 1; - ssboCreateInfo.pBindings = &ssboBind; - - if (vkCreateDescriptorSetLayout(objs.vkdevice.device, &ssboCreateInfo, nullptr, - &SSBOData.dlayout) != VK_SUCCESS) { - return false; - } - - VkDescriptorPoolSize poolSize{}; - poolSize.type = VK_DESCRIPTOR_TYPE_STORAGE_BUFFER; - poolSize.descriptorCount = bufferSize; - - VkDescriptorPoolCreateInfo descriptorPool{}; - descriptorPool.sType = VK_STRUCTURE_TYPE_DESCRIPTOR_POOL_CREATE_INFO; - descriptorPool.poolSizeCount = 1; - descriptorPool.pPoolSizes = &poolSize; - descriptorPool.maxSets = 1; - - if (vkCreateDescriptorPool(objs.vkdevice.device, &descriptorPool, nullptr, &SSBOData.dpool) != - VK_SUCCESS) { - return false; - } - - VkDescriptorSetAllocateInfo descriptorAllocateInfo{}; - descriptorAllocateInfo.sType = VK_STRUCTURE_TYPE_DESCRIPTOR_SET_ALLOCATE_INFO; - descriptorAllocateInfo.descriptorPool = SSBOData.dpool; - descriptorAllocateInfo.descriptorSetCount = 1; - descriptorAllocateInfo.pSetLayouts = &SSBOData.dlayout; - - if (vkAllocateDescriptorSets(objs.vkdevice.device, &descriptorAllocateInfo, &SSBOData.dset) != - VK_SUCCESS) { - return false; - } - - VkDescriptorBufferInfo ssboInfo{}; - ssboInfo.buffer = SSBOData.buffer; - ssboInfo.offset = 0; - ssboInfo.range = bufferSize; - - VkWriteDescriptorSet writeDescriptorSet{}; - writeDescriptorSet.sType = VK_STRUCTURE_TYPE_WRITE_DESCRIPTOR_SET; - writeDescriptorSet.descriptorType = VK_DESCRIPTOR_TYPE_STORAGE_BUFFER; - writeDescriptorSet.dstSet = SSBOData.dset; - writeDescriptorSet.dstBinding = 0; - writeDescriptorSet.descriptorCount = 1; - writeDescriptorSet.pBufferInfo = &ssboInfo; - - vkUpdateDescriptorSets(objs.vkdevice.device, 1, &writeDescriptorSet, 0, nullptr); - - SSBOData.size = bufferSize; - return true; -} - -template -void ssbo::upload(const vkobjs &objs,const ssbodata &ssbodata, const std::vector &mats) { - if (mats.size() == 0) { - return; - } - - void *data; - vmaMapMemory(objs.alloc, ssbodata.alloc, &data); - std::memcpy(data, mats.data(), ssbodata.size); - vmaUnmapMemory(objs.alloc, ssbodata.alloc); -} - -void ssbo::cleanup(vkobjs &objs, ssbodata &ssbodata) { - vkDestroyDescriptorPool(objs.vkdevice.device, ssbodata.dpool, nullptr); - vkDestroyDescriptorSetLayout(objs.vkdevice.device, ssbodata.dlayout, nullptr); - vmaDestroyBuffer(objs.alloc, ssbodata.buffer, ssbodata.alloc); -} diff --git a/src/buffer/ssbomesh.cpp b/src/buffer/ssbomesh.cpp deleted file mode 100644 index 1768ae5..0000000 --- a/src/buffer/ssbomesh.cpp +++ /dev/null @@ -1,107 +0,0 @@ -#include "ssbomesh.hpp" - -#include - -bool ssbomesh::init(vkobjs &objs, ssbodata &SSBOData) { - VkBufferCreateInfo bufferInfo{}; - bufferInfo.sType = VK_STRUCTURE_TYPE_BUFFER_CREATE_INFO; - bufferInfo.size = 2; //////////////////////////////////////////////////////fix - bufferInfo.usage = VK_BUFFER_USAGE_STORAGE_BUFFER_BIT; - - VmaAllocationCreateInfo vmaAllocInfo{}; - vmaAllocInfo.usage = VMA_MEMORY_USAGE_CPU_TO_GPU; - - if (vmaCreateBuffer(objs.alloc, &bufferInfo, &vmaAllocInfo, &SSBOData.buffer, &SSBOData.alloc, - nullptr) != VK_SUCCESS) { - return false; - } - - VkDescriptorSetLayoutBinding ssboBind{}; - ssboBind.descriptorType = VK_DESCRIPTOR_TYPE_STORAGE_BUFFER; - ssboBind.binding = 0; - ssboBind.descriptorCount = 1; - ssboBind.pImmutableSamplers = nullptr; - ssboBind.stageFlags = VK_SHADER_STAGE_MESH_BIT_EXT; - - VkDescriptorSetLayoutCreateInfo ssboCreateInfo{}; - ssboCreateInfo.sType = VK_STRUCTURE_TYPE_DESCRIPTOR_SET_LAYOUT_CREATE_INFO; - ssboCreateInfo.bindingCount = 1; - ssboCreateInfo.pBindings = &ssboBind; - - if (vkCreateDescriptorSetLayout(objs.vkdevice.device, &ssboCreateInfo, nullptr, - &SSBOData.dlayout) != VK_SUCCESS) { - return false; - } - - VkDescriptorPoolSize poolSize{}; - poolSize.type = VK_DESCRIPTOR_TYPE_STORAGE_BUFFER; - poolSize.descriptorCount = 1; - - VkDescriptorPoolCreateInfo descriptorPool{}; - descriptorPool.sType = VK_STRUCTURE_TYPE_DESCRIPTOR_POOL_CREATE_INFO; - descriptorPool.poolSizeCount = 1; - descriptorPool.pPoolSizes = &poolSize; - descriptorPool.maxSets = 1; - - if (vkCreateDescriptorPool(objs.vkdevice.device, &descriptorPool, nullptr, &SSBOData.dpool) != - VK_SUCCESS) { - return false; - } - - VkDescriptorSetAllocateInfo descriptorAllocateInfo{}; - descriptorAllocateInfo.sType = VK_STRUCTURE_TYPE_DESCRIPTOR_SET_ALLOCATE_INFO; - descriptorAllocateInfo.descriptorPool = SSBOData.dpool; - descriptorAllocateInfo.descriptorSetCount = 1; - descriptorAllocateInfo.pSetLayouts = &SSBOData.dlayout; - - if (vkAllocateDescriptorSets(objs.vkdevice.device, &descriptorAllocateInfo, &SSBOData.dset) != - VK_SUCCESS) { - return false; - } - - VkDescriptorBufferInfo ssboInfo{}; - ssboInfo.buffer = SSBOData.buffer; - ssboInfo.offset = 0; - ssboInfo.range = 2; //////////////////////////////////////////////////////////////fix - - VkWriteDescriptorSet writeDescriptorSet{}; - writeDescriptorSet.sType = VK_STRUCTURE_TYPE_WRITE_DESCRIPTOR_SET; - writeDescriptorSet.descriptorType = VK_DESCRIPTOR_TYPE_STORAGE_BUFFER; - writeDescriptorSet.dstSet = SSBOData.dset; - writeDescriptorSet.dstBinding = 0; - writeDescriptorSet.descriptorCount = 1; - writeDescriptorSet.pBufferInfo = &ssboInfo; - - vkUpdateDescriptorSets(objs.vkdevice.device, 1, &writeDescriptorSet, 0, nullptr); - - SSBOData.size = 2; /////////////////////////////////////////////////////fix - return true; -} - -void ssbomesh::upload(vkobjs &objs, ssbodata &ssbodata, std::vector &mats) { - if (mats.size() == 0) { - return; - } - - void *data; - vmaMapMemory(objs.alloc, ssbodata.alloc, &data); - std::memcpy(data, mats.data(), ssbodata.size); - vmaUnmapMemory(objs.alloc, ssbodata.alloc); -} - -void ssbomesh::upload(vkobjs &objs, ssbodata &ssbodata, std::vector mats) { - if (mats.size() == 0) { - return; - } - - void *data; - vmaMapMemory(objs.alloc, ssbodata.alloc, &data); - std::memcpy(data, mats.data(), ssbodata.size); - vmaUnmapMemory(objs.alloc, ssbodata.alloc); -} - -void ssbomesh::cleanup(vkobjs &objs, ssbodata &ssbodata) { - vkDestroyDescriptorPool(objs.vkdevice.device, ssbodata.dpool, nullptr); - vkDestroyDescriptorSetLayout(objs.vkdevice.device, ssbodata.dlayout, nullptr); - vmaDestroyBuffer(objs.alloc, ssbodata.buffer, ssbodata.alloc); -} diff --git a/src/buffer/ubo.cpp b/src/buffer/ubo.cpp index 531a2e6..6c611cd 100644 --- a/src/buffer/ubo.cpp +++ b/src/buffer/ubo.cpp @@ -94,20 +94,13 @@ bool ubo::init(vkobjs &mvkobjs, std::vector &ubodata) { return true; } -void ubo::upload(vkobjs &mvkobjs, std::vector &ubodata, std::vector mats, unsigned int texidx) { +void ubo::upload(vkobjs &mvkobjs, std::vector &ubodata, std::vector mats) { void *data; vmaMapMemory(mvkobjs.alloc, ubodata[0].alloc, &data); std::memcpy(data, mats.data(), ubodata[0].size); vmaUnmapMemory(mvkobjs.alloc, ubodata[0].alloc); } -void ubo::upload(vkobjs &mvkobjs, std::vector &ubodata, unsigned int texidx) { - void *data; - vmaMapMemory(mvkobjs.alloc, ubodata[1].alloc, &data); - std::memcpy(data, &texidx, ubodata[1].size); - vmaUnmapMemory(mvkobjs.alloc, ubodata[1].alloc); -} - void ubo::cleanup(vkobjs &mvkobjs, std::vector &ubodata) { for (size_t i{0}; i < ubodata.size(); i++) { vkDestroyDescriptorPool(mvkobjs.vkdevice.device, ubodata[i].dpool, nullptr); diff --git a/src/playout/playoutgeneric.cpp b/src/playout/playoutgeneric.cpp index 199d5cc..6d2b1af 100644 --- a/src/playout/playoutgeneric.cpp +++ b/src/playout/playoutgeneric.cpp @@ -2,7 +2,7 @@ #include "modelsettings.hpp" #include "playout.hpp" #include "pline.hpp" -#include "ssbo.hpp" +#include "buffer/ssbo.hpp" #include "ubo.hpp" bool playoutgeneric::setup(vkobjs &objs, std::string fname, size_t count, std::string vfile, std::string ffile) { @@ -97,8 +97,7 @@ void playoutgeneric::uploadubossbo(vkobjs &objs, std::vector &cammats &rdperspviewmatrixubo[0].dset, 0, nullptr); vkCmdBindDescriptorSets(objs.cbuffers[0], VK_PIPELINE_BIND_POINT_GRAPHICS, rdgltfpipelinelayout, 2, 1, &rdjointmatrixssbo.dset, 0, nullptr); - - ubo::upload(objs, rdperspviewmatrixubo, cammats, 0); + ubo::upload(objs, rdperspviewmatrixubo, cammats); ssbo::upload(objs, rdjointmatrixssbo, jointmats); } From 93000cf25fe33e4dce1f628740516689ff320991 Mon Sep 17 00:00:00 2001 From: r Date: Sun, 1 Jun 2025 07:30:53 +0300 Subject: [PATCH 03/40] messy --- include/buffer/ssbo.hpp | 24 ++++++++---------------- include/vkobjs.hpp | 16 +++++++++++++--- shaders/gen.slang | 16 ++++++++++++++-- src/auxiliary/ui.cpp | 28 ++++++++++++++-------------- 4 files changed, 49 insertions(+), 35 deletions(-) diff --git a/include/buffer/ssbo.hpp b/include/buffer/ssbo.hpp index cc6452b..7e85de4 100644 --- a/include/buffer/ssbo.hpp +++ b/include/buffer/ssbo.hpp @@ -7,13 +7,18 @@ namespace ssbo { static inline bool init(vkobjs &objs, ssbodata &ssboData, size_t buffersize) { + + std::vector pool0{{VK_DESCRIPTOR_TYPE_STORAGE_BUFFER,1}}; + if(!rpool::create(pool0,objs.vkdevice.device,&ssboData.dpool))return false; + VkBufferCreateInfo bufferInfo{}; bufferInfo.sType = VK_STRUCTURE_TYPE_BUFFER_CREATE_INFO; bufferInfo.size = buffersize; - bufferInfo.usage = VK_BUFFER_USAGE_STORAGE_BUFFER_BIT; + bufferInfo.usage = VK_BUFFER_USAGE_2_STORAGE_BUFFER_BIT | VK_BUFFER_USAGE_2_TRANSFER_SRC_BIT; VmaAllocationCreateInfo vmaAllocInfo{}; - vmaAllocInfo.usage = VMA_MEMORY_USAGE_CPU_TO_GPU; + vmaAllocInfo.usage = VMA_MEMORY_USAGE_AUTO; + vmaAllocInfo.flags = VMA_ALLOCATION_CREATE_HOST_ACCESS_SEQUENTIAL_WRITE_BIT; if (vmaCreateBuffer(objs.alloc, &bufferInfo, &vmaAllocInfo, &ssboData.buffer, &ssboData.alloc, nullptr) != VK_SUCCESS) { @@ -36,19 +41,6 @@ namespace ssbo { return false; } - VkDescriptorPoolSize poolSize{}; - poolSize.type = VK_DESCRIPTOR_TYPE_STORAGE_BUFFER; - poolSize.descriptorCount = 1; - - VkDescriptorPoolCreateInfo descriptorPool{}; - descriptorPool.sType = VK_STRUCTURE_TYPE_DESCRIPTOR_POOL_CREATE_INFO; - descriptorPool.poolSizeCount = 1; - descriptorPool.pPoolSizes = &poolSize; - descriptorPool.maxSets = 1; - - if (vkCreateDescriptorPool(objs.vkdevice.device, &descriptorPool, nullptr, &ssboData.dpool) != VK_SUCCESS) { - return false; - } VkDescriptorSetAllocateInfo descriptorAllocateInfo{}; descriptorAllocateInfo.sType = VK_STRUCTURE_TYPE_DESCRIPTOR_SET_ALLOCATE_INFO; @@ -95,7 +87,7 @@ namespace ssbo { vmaUnmapMemory(objs.alloc, ssbodata.alloc); } static inline void cleanup(vkobjs &objs, ssbodata &ssbodata) { - vkDestroyDescriptorPool(objs.vkdevice.device, ssbodata.dpool, nullptr); + rpool::destroy(objs.vkdevice.device, ssbodata.dpool); vkDestroyDescriptorSetLayout(objs.vkdevice.device, ssbodata.dlayout, nullptr); vmaDestroyBuffer(objs.alloc, ssbodata.buffer, ssbodata.alloc); } diff --git a/include/vkobjs.hpp b/include/vkobjs.hpp index 3515e8c..35fae82 100644 --- a/include/vkobjs.hpp +++ b/include/vkobjs.hpp @@ -168,12 +168,22 @@ struct vkgltfobjs { texdatapls texpls{}; }; namespace rpool{ - static inline bool create(){ - return true; + static inline bool create(const std::vector& pools,const VkDevice& dev,VkDescriptorPool* dpool){ + VkDescriptorPoolCreateInfo descriptorPool{}; + descriptorPool.sType = VK_STRUCTURE_TYPE_DESCRIPTOR_POOL_CREATE_INFO; + descriptorPool.poolSizeCount = pools.size(); + descriptorPool.pPoolSizes = pools.data(); + descriptorPool.maxSets = 1024; //not sure + + return vkCreateDescriptorPool(dev, &descriptorPool, nullptr, dpool) == VK_SUCCESS; + } + static inline void destroy(const VkDevice& dev,VkDescriptorPool dpool){ + vkDestroyDescriptorPool(dev, dpool, nullptr); } }; namespace rbuffer{ - static inline bool create(vkobjs& objs, buffdata &bdata, size_t bsize, bool btype, size_t bstage,size_t ){ + static inline bool create(const VkDevice& dev,VmaAllocator alloc,std::vector binfos,std::vector buffs){ + // for() return true; } }; \ No newline at end of file diff --git a/shaders/gen.slang b/shaders/gen.slang index 74791e0..3198a26 100644 --- a/shaders/gen.slang +++ b/shaders/gen.slang @@ -19,6 +19,14 @@ struct VXin { // uint4 joi1 : JOINTS_1; // float4 wei1 : WEIGHTS_1; } +struct Particle { + float2 position; + float2 velocity; + float4 color; +}; + +StructuredBuffer pin; +RWStructuredBuffer pout; struct PXin { float3 normal; @@ -28,7 +36,11 @@ struct PXin { float32_t t2; float32_t dec; } +struct CXin { + uint3 tid : SV_DispatchThreadID; + Particle p; +} struct PXout { float4 color; } @@ -105,6 +117,6 @@ PXout pxmain(PXin pxin) { [shader("compute")] [[numthreads(256, 1, 1)]] -void cxmain(uint3 tid: SV_DispatchThreadID) { - +void cxmain(CXin cx) { + pout[cx.tid.x].position = pin[cx.tid.x].position + pin[cx.tid.x].velocity.xy * 0.0001; } \ No newline at end of file diff --git a/src/auxiliary/ui.cpp b/src/auxiliary/ui.cpp index c081932..a991c5d 100644 --- a/src/auxiliary/ui.cpp +++ b/src/auxiliary/ui.cpp @@ -23,25 +23,25 @@ bool ui::init(vkobjs &renderData) { io.Fonts->AddFontFromFileTTF("resources/comicbd.ttf", 29.0f); io.Fonts->AddFontFromFileTTF("resources/bruce.ttf", 52.0f); - VkDescriptorPoolSize imguiPoolSizes[] = {{VK_DESCRIPTOR_TYPE_SAMPLER, 1000}, - {VK_DESCRIPTOR_TYPE_COMBINED_IMAGE_SAMPLER, 1000}, - {VK_DESCRIPTOR_TYPE_SAMPLED_IMAGE, 1000}, - {VK_DESCRIPTOR_TYPE_STORAGE_IMAGE, 1000}, - {VK_DESCRIPTOR_TYPE_UNIFORM_TEXEL_BUFFER, 1000}, - {VK_DESCRIPTOR_TYPE_STORAGE_TEXEL_BUFFER, 1000}, - {VK_DESCRIPTOR_TYPE_UNIFORM_BUFFER, 1000}, - {VK_DESCRIPTOR_TYPE_STORAGE_BUFFER, 1000}, - {VK_DESCRIPTOR_TYPE_UNIFORM_BUFFER_DYNAMIC, 1000}, - {VK_DESCRIPTOR_TYPE_STORAGE_BUFFER_DYNAMIC, 1000}, - {VK_DESCRIPTOR_TYPE_INPUT_ATTACHMENT, 1000} + std::vector imguiPoolSizes = {{VK_DESCRIPTOR_TYPE_SAMPLER, 24}, + {VK_DESCRIPTOR_TYPE_COMBINED_IMAGE_SAMPLER, 24}, + {VK_DESCRIPTOR_TYPE_SAMPLED_IMAGE, 24}, + {VK_DESCRIPTOR_TYPE_STORAGE_IMAGE, 24}, + {VK_DESCRIPTOR_TYPE_UNIFORM_TEXEL_BUFFER, 24}, + {VK_DESCRIPTOR_TYPE_STORAGE_TEXEL_BUFFER, 24}, + {VK_DESCRIPTOR_TYPE_UNIFORM_BUFFER, 24}, + {VK_DESCRIPTOR_TYPE_STORAGE_BUFFER, 24}, + {VK_DESCRIPTOR_TYPE_UNIFORM_BUFFER_DYNAMIC, 24}, + {VK_DESCRIPTOR_TYPE_STORAGE_BUFFER_DYNAMIC, 24}, + {VK_DESCRIPTOR_TYPE_INPUT_ATTACHMENT, 24} }; VkDescriptorPoolCreateInfo imguiPoolInfo{}; imguiPoolInfo.sType = VK_STRUCTURE_TYPE_DESCRIPTOR_POOL_CREATE_INFO; imguiPoolInfo.flags = VK_DESCRIPTOR_POOL_CREATE_FREE_DESCRIPTOR_SET_BIT; - imguiPoolInfo.maxSets = 1000; - imguiPoolInfo.poolSizeCount = std::size(imguiPoolSizes); - imguiPoolInfo.pPoolSizes = imguiPoolSizes; + imguiPoolInfo.maxSets = 24; + imguiPoolInfo.poolSizeCount = imguiPoolSizes.size(); + imguiPoolInfo.pPoolSizes = imguiPoolSizes.data(); if (vkCreateDescriptorPool(renderData.vkdevice.device, &imguiPoolInfo, nullptr, &renderData.imguidpool)) { From e2ab585a45411e5f45103447e2547f3003c5665b Mon Sep 17 00:00:00 2001 From: r Date: Wed, 4 Jun 2025 09:12:58 +0200 Subject: [PATCH 04/40] half --- CMakeLists.txt | 7 +++-- include/buffer/ssbo.hpp | 2 +- include/exp/particle.hpp | 32 ++++++++++++++++++++++ shaders/particle.slang | 58 ++++++++++++++++++++++++++++++++++++++++ src/core/vkrenderer.cpp | 3 +++ src/exp/particle.cpp | 0 6 files changed, 99 insertions(+), 3 deletions(-) create mode 100644 include/exp/particle.hpp create mode 100644 shaders/particle.slang create mode 100644 src/exp/particle.cpp diff --git a/CMakeLists.txt b/CMakeLists.txt index ad40101..3d50140 100644 --- a/CMakeLists.txt +++ b/CMakeLists.txt @@ -209,13 +209,16 @@ list(LENGTH shaders shader_len) #manually adding shaders for now add_custom_command( - OUTPUT ${PROJECT_BINARY_DIR}/shaders/vx.spv ${PROJECT_BINARY_DIR}/shaders/px.spv ${PROJECT_BINARY_DIR}/shaders/cx.spv + OUTPUT ${PROJECT_BINARY_DIR}/shaders/vx.spv ${PROJECT_BINARY_DIR}/shaders/px.spv ${PROJECT_BINARY_DIR}/shaders/cx.spv ${PROJECT_BINARY_DIR}/shaders/pvx.spv ${PROJECT_BINARY_DIR}/shaders/ppx.spv ${PROJECT_BINARY_DIR}/shaders/pcx.spv COMMAND ${CMAKE_COMMAND} -E make_directory "${PROJECT_BINARY_DIR}/shaders" COMMAND ${SHELL_CMD} -c "$ENV{VULKAN_SDK}/bin/slangc -entry vxmain $<$:-g> $<$:-O3> -stage vertex -target spirv -capability SPIRV_1_6 ${PROJECT_SOURCE_DIR}/shaders/gen.slang -o ${PROJECT_BINARY_DIR}/shaders/vx.spv" DEPENDS ${PROJECT_SOURCE_DIR}/shaders/gen.slang COMMAND ${SHELL_CMD} -c "$ENV{VULKAN_SDK}/bin/slangc -entry pxmain $<$:-g> $<$:-O3> -stage pixel -target spirv -capability SPIRV_1_6 ${PROJECT_SOURCE_DIR}/shaders/gen.slang -o ${PROJECT_BINARY_DIR}/shaders/px.spv" DEPENDS ${PROJECT_SOURCE_DIR}/shaders/gen.slang COMMAND ${SHELL_CMD} -c "$ENV{VULKAN_SDK}/bin/slangc -entry cxmain $<$:-g> $<$:-O3> -stage compute -target spirv -capability SPIRV_1_6 ${PROJECT_SOURCE_DIR}/shaders/gen.slang -o ${PROJECT_BINARY_DIR}/shaders/cx.spv" DEPENDS ${PROJECT_SOURCE_DIR}/shaders/gen.slang + COMMAND ${SHELL_CMD} -c "$ENV{VULKAN_SDK}/bin/slangc -entry vxmain $<$:-g> $<$:-O3> -stage vertex -target spirv -capability SPIRV_1_6 ${PROJECT_SOURCE_DIR}/shaders/particle.slang -o ${PROJECT_BINARY_DIR}/shaders/pvx.spv" DEPENDS ${PROJECT_SOURCE_DIR}/shaders/particle.slang + COMMAND ${SHELL_CMD} -c "$ENV{VULKAN_SDK}/bin/slangc -entry pxmain $<$:-g> $<$:-O3> -stage pixel -target spirv -capability SPIRV_1_6 ${PROJECT_SOURCE_DIR}/shaders/particle.slang -o ${PROJECT_BINARY_DIR}/shaders/ppx.spv" DEPENDS ${PROJECT_SOURCE_DIR}/shaders/particle.slang + COMMAND ${SHELL_CMD} -c "$ENV{VULKAN_SDK}/bin/slangc -entry cxmain $<$:-g> $<$:-O3> -stage compute -target spirv -capability SPIRV_1_6 ${PROJECT_SOURCE_DIR}/shaders/particle.slang -o ${PROJECT_BINARY_DIR}/shaders/pcx.spv" DEPENDS ${PROJECT_SOURCE_DIR}/shaders/particle.slang ) - list(APPEND SPIRV_BINARY_FILES ${PROJECT_BINARY_DIR}/shaders/vx.spv ${PROJECT_BINARY_DIR}/shaders/px.spv ${PROJECT_BINARY_DIR}/shaders/cx.spv) + list(APPEND SPIRV_BINARY_FILES ${PROJECT_BINARY_DIR}/shaders/vx.spv ${PROJECT_BINARY_DIR}/shaders/px.spv ${PROJECT_BINARY_DIR}/shaders/cx.spv ${PROJECT_BINARY_DIR}/shaders/pvx.spv ${PROJECT_BINARY_DIR}/shaders/ppx.spv ${PROJECT_BINARY_DIR}/shaders/pcx.spv) set_source_files_properties(${SPIRV_BINARY_FILES} PROPERTIES GENERATED TRUE) add_custom_target(shaders ALL DEPENDS ${SPIRV_BINARY_FILES}) add_dependencies(rview2 shaders) diff --git a/include/buffer/ssbo.hpp b/include/buffer/ssbo.hpp index 7e85de4..b589ba6 100644 --- a/include/buffer/ssbo.hpp +++ b/include/buffer/ssbo.hpp @@ -14,7 +14,7 @@ namespace ssbo { VkBufferCreateInfo bufferInfo{}; bufferInfo.sType = VK_STRUCTURE_TYPE_BUFFER_CREATE_INFO; bufferInfo.size = buffersize; - bufferInfo.usage = VK_BUFFER_USAGE_2_STORAGE_BUFFER_BIT | VK_BUFFER_USAGE_2_TRANSFER_SRC_BIT; + bufferInfo.usage = VK_BUFFER_USAGE_STORAGE_BUFFER_BIT | VK_BUFFER_USAGE_TRANSFER_SRC_BIT; VmaAllocationCreateInfo vmaAllocInfo{}; vmaAllocInfo.usage = VMA_MEMORY_USAGE_AUTO; diff --git a/include/exp/particle.hpp b/include/exp/particle.hpp new file mode 100644 index 0000000..ae82a10 --- /dev/null +++ b/include/exp/particle.hpp @@ -0,0 +1,32 @@ +#include "vkobjs.hpp" +namespace particle{ + static inline create(vkobjs objs){ + + + size_t ssbobuffersize{256*sizeof(float)*6}; + VkBuffer ssbobuffer = VK_NULL_HANDLE; + VmaAllocation alloc = nullptr; + + VkDescriptorPool dpool = VK_NULL_HANDLE; + VkDescriptorSetLayout dlayout = VK_NULL_HANDLE; + VkDescriptorSet dset = VK_NULL_HANDLE; + + std::vector pool0{{VK_DESCRIPTOR_TYPE_STORAGE_BUFFER,1}}; + if(!rpool::create(pool0,objs.vkdevice.device,&dpool))return false; + + VkBufferCreateInfo bufferInfo{}; + bufferInfo.sType = VK_STRUCTURE_TYPE_BUFFER_CREATE_INFO; + bufferInfo.size = buffersize; + bufferInfo.usage = VK_BUFFER_USAGE_VERTEX_BUFFER_BIT | VK_BUFFER_USAGE_STORAGE_BUFFER_BIT | VK_BUFFER_USAGE_TRANSFER_DST_BIT; + + VmaAllocationCreateInfo vmaAllocInfo{}; + vmaAllocInfo.usage = VMA_MEMORY_USAGE_AUTO; + vmaAllocInfo.flags = VMA_ALLOCATION_CREATE_HOST_ACCESS_SEQUENTIAL_WRITE_BIT; + + if (vmaCreateBuffer(objs.alloc, &bufferInfo, &vmaAllocInfo, &ssboData.buffer, &ssboData.alloc, nullptr) != + VK_SUCCESS) { + return false; + } + + } +} \ No newline at end of file diff --git a/shaders/particle.slang b/shaders/particle.slang new file mode 100644 index 0000000..5678ea8 --- /dev/null +++ b/shaders/particle.slang @@ -0,0 +1,58 @@ + +struct Particle { + float2 position; + float2 velocity; + float4 color; +}; + +struct VXin { + float2 pos : POSITION; + float4 color; +} +struct PXin { + float3 normal; + float4 color; + float32_t t2; +} +struct CXin { + uint3 tid : SV_DispatchThreadID; + Particle p; + +} +struct PXout { + float4 color; +} + +struct VXout { + PXin pxin; + float4 sv_position : SV_Position; + float psize : SV_PointSize; +} + + +StructuredBuffer pin; +RWStructuredBuffer pout; + +[shader("vertex")] +VXout vxmain(VXin vxin) { + VXout out; + out.sv_position = float4(vxin.pos, 1.0f, 1.0f); + out.pxin.color = vxin.color; + out.psize = 20.0f; + return out; +} + + +[shader("pixel")] +PXout pxmain(PXin pxin) { + PXout out; + out.color = pxin.color; + return out; +} + +[shader("compute")] +[[numthreads(256, 1, 1)]] +void cxmain(uint3 tid : SV_DispatchThreadID) { + pout[tid.x].position = pin[tid.x].position + pin[tid.x].velocity.xy * 0.0001; + pout[tid.x].velocity = pin[tid.x].velocity; +} \ No newline at end of file diff --git a/src/core/vkrenderer.cpp b/src/core/vkrenderer.cpp index c9d3290..ab2ae62 100644 --- a/src/core/vkrenderer.cpp +++ b/src/core/vkrenderer.cpp @@ -28,6 +28,9 @@ #include // #include +#include "exp/particle.hpp" + + float map2(glm::vec3 x) { return std::max(x.y, 0.0f); } diff --git a/src/exp/particle.cpp b/src/exp/particle.cpp new file mode 100644 index 0000000..e69de29 From 5371c299401eb70dce14196856bfc667448f3171 Mon Sep 17 00:00:00 2001 From: r Date: Mon, 9 Jun 2025 15:47:22 +0300 Subject: [PATCH 05/40] compute particles test --- CMakeLists.txt | 16 +- include/commandpool.hpp | 1 + include/exp/particle.hpp | 456 +++++++++++++++++++++++++++++++++++++-- include/vkobjs.hpp | 4 +- shaders/gen.slang | 7 - shaders/particle.slang | 18 +- src/auxiliary/ui.cpp | 4 +- src/core/vkrenderer.cpp | 55 ++++- src/exp/particle.cpp | 0 src/vk/commandpool.cpp | 12 ++ 10 files changed, 510 insertions(+), 63 deletions(-) delete mode 100644 src/exp/particle.cpp diff --git a/CMakeLists.txt b/CMakeLists.txt index 3d50140..0900e89 100644 --- a/CMakeLists.txt +++ b/CMakeLists.txt @@ -1,10 +1,10 @@ -cmake_minimum_required(VERSION 3.31) +cmake_minimum_required(VERSION 4.0) project(rview2 LANGUAGES CXX) include(ExternalProject) -set(CMAKE_CXX_STANDARD 20) +set(CMAKE_CXX_STANDARD 23) set(CMAKE_CXX_STANDARD_REQUIRED ON) set(CMAKE_EXPORT_COMPILE_COMMANDS ON) @@ -211,12 +211,12 @@ list(LENGTH shaders shader_len) add_custom_command( OUTPUT ${PROJECT_BINARY_DIR}/shaders/vx.spv ${PROJECT_BINARY_DIR}/shaders/px.spv ${PROJECT_BINARY_DIR}/shaders/cx.spv ${PROJECT_BINARY_DIR}/shaders/pvx.spv ${PROJECT_BINARY_DIR}/shaders/ppx.spv ${PROJECT_BINARY_DIR}/shaders/pcx.spv COMMAND ${CMAKE_COMMAND} -E make_directory "${PROJECT_BINARY_DIR}/shaders" - COMMAND ${SHELL_CMD} -c "$ENV{VULKAN_SDK}/bin/slangc -entry vxmain $<$:-g> $<$:-O3> -stage vertex -target spirv -capability SPIRV_1_6 ${PROJECT_SOURCE_DIR}/shaders/gen.slang -o ${PROJECT_BINARY_DIR}/shaders/vx.spv" DEPENDS ${PROJECT_SOURCE_DIR}/shaders/gen.slang - COMMAND ${SHELL_CMD} -c "$ENV{VULKAN_SDK}/bin/slangc -entry pxmain $<$:-g> $<$:-O3> -stage pixel -target spirv -capability SPIRV_1_6 ${PROJECT_SOURCE_DIR}/shaders/gen.slang -o ${PROJECT_BINARY_DIR}/shaders/px.spv" DEPENDS ${PROJECT_SOURCE_DIR}/shaders/gen.slang - COMMAND ${SHELL_CMD} -c "$ENV{VULKAN_SDK}/bin/slangc -entry cxmain $<$:-g> $<$:-O3> -stage compute -target spirv -capability SPIRV_1_6 ${PROJECT_SOURCE_DIR}/shaders/gen.slang -o ${PROJECT_BINARY_DIR}/shaders/cx.spv" DEPENDS ${PROJECT_SOURCE_DIR}/shaders/gen.slang - COMMAND ${SHELL_CMD} -c "$ENV{VULKAN_SDK}/bin/slangc -entry vxmain $<$:-g> $<$:-O3> -stage vertex -target spirv -capability SPIRV_1_6 ${PROJECT_SOURCE_DIR}/shaders/particle.slang -o ${PROJECT_BINARY_DIR}/shaders/pvx.spv" DEPENDS ${PROJECT_SOURCE_DIR}/shaders/particle.slang - COMMAND ${SHELL_CMD} -c "$ENV{VULKAN_SDK}/bin/slangc -entry pxmain $<$:-g> $<$:-O3> -stage pixel -target spirv -capability SPIRV_1_6 ${PROJECT_SOURCE_DIR}/shaders/particle.slang -o ${PROJECT_BINARY_DIR}/shaders/ppx.spv" DEPENDS ${PROJECT_SOURCE_DIR}/shaders/particle.slang - COMMAND ${SHELL_CMD} -c "$ENV{VULKAN_SDK}/bin/slangc -entry cxmain $<$:-g> $<$:-O3> -stage compute -target spirv -capability SPIRV_1_6 ${PROJECT_SOURCE_DIR}/shaders/particle.slang -o ${PROJECT_BINARY_DIR}/shaders/pcx.spv" DEPENDS ${PROJECT_SOURCE_DIR}/shaders/particle.slang + COMMAND ${SHELL_CMD} -c "$ENV{VULKAN_SDK}/../../silver/usr/slang/slangc -entry vxmain $<$:-g> $<$:-O3> -stage vertex -target spirv -capability SPIRV_1_6 ${PROJECT_SOURCE_DIR}/shaders/gen.slang -o ${PROJECT_BINARY_DIR}/shaders/vx.spv" DEPENDS ${PROJECT_SOURCE_DIR}/shaders/gen.slang + COMMAND ${SHELL_CMD} -c "$ENV{VULKAN_SDK}/../../silver/usr/slang/slangc -entry pxmain $<$:-g> $<$:-O3> -stage pixel -target spirv -capability SPIRV_1_6 ${PROJECT_SOURCE_DIR}/shaders/gen.slang -o ${PROJECT_BINARY_DIR}/shaders/px.spv" DEPENDS ${PROJECT_SOURCE_DIR}/shaders/gen.slang + # COMMAND ${SHELL_CMD} -c "$ENV{VULKAN_SD/bin/slangc -entry cxmain $<$:-g> $<$:-O3> -stage compute -target spirv -capability SPIRV_1_6 ${PROJECT_SOURCE_DIR}/shaders/gen.slang -o ${PROJECT_BINARY_DIR}/shaders/cx.spv" DEPENDS ${PROJECT_SOURCE_DIR}/shaders/gen.slang + COMMAND ${SHELL_CMD} -c "$ENV{VULKAN_SDK}/../../silver/usr/slang/slangc -entry vxmain $<$:-g> $<$:-O3> -stage vertex -target spirv -capability SPIRV_1_6 ${PROJECT_SOURCE_DIR}/shaders/particle.slang -o ${PROJECT_BINARY_DIR}/shaders/pvx.spv" DEPENDS ${PROJECT_SOURCE_DIR}/shaders/particle.slang + COMMAND ${SHELL_CMD} -c "$ENV{VULKAN_SDK}/../../silver/usr/slang/slangc -entry pxmain $<$:-g> $<$:-O3> -stage pixel -target spirv -capability SPIRV_1_6 ${PROJECT_SOURCE_DIR}/shaders/particle.slang -o ${PROJECT_BINARY_DIR}/shaders/ppx.spv" DEPENDS ${PROJECT_SOURCE_DIR}/shaders/particle.slang + COMMAND ${SHELL_CMD} -c "$ENV{VULKAN_SDK}/../../silver/usr/slang/slangc -entry cxmain $<$:-g> $<$:-O3> -stage compute -target spirv -capability SPIRV_1_6 ${PROJECT_SOURCE_DIR}/shaders/particle.slang -o ${PROJECT_BINARY_DIR}/shaders/pcx.spv" DEPENDS ${PROJECT_SOURCE_DIR}/shaders/particle.slang ) list(APPEND SPIRV_BINARY_FILES ${PROJECT_BINARY_DIR}/shaders/vx.spv ${PROJECT_BINARY_DIR}/shaders/px.spv ${PROJECT_BINARY_DIR}/shaders/cx.spv ${PROJECT_BINARY_DIR}/shaders/pvx.spv ${PROJECT_BINARY_DIR}/shaders/ppx.spv ${PROJECT_BINARY_DIR}/shaders/pcx.spv) set_source_files_properties(${SPIRV_BINARY_FILES} PROPERTIES GENERATED TRUE) diff --git a/include/commandpool.hpp b/include/commandpool.hpp index 0d55988..e7d37e5 100644 --- a/include/commandpool.hpp +++ b/include/commandpool.hpp @@ -4,5 +4,6 @@ class commandpool { public: static bool init(vkobjs &rdata, VkCommandPool &vkpool); + static bool initcompute(vkobjs &rdata, VkCommandPool &vkpool); static void cleanup(vkobjs &rdata, VkCommandPool &vkpool); }; \ No newline at end of file diff --git a/include/exp/particle.hpp b/include/exp/particle.hpp index ae82a10..f6232c3 100644 --- a/include/exp/particle.hpp +++ b/include/exp/particle.hpp @@ -1,32 +1,442 @@ +#pragma once #include "vkobjs.hpp" -namespace particle{ - static inline create(vkobjs objs){ +#include "vkshader.hpp" +#include +#include +struct P { + glm::vec2 position; + glm::vec2 velocity; + glm::vec4 color; +}; +namespace particle { - size_t ssbobuffersize{256*sizeof(float)*6}; - VkBuffer ssbobuffer = VK_NULL_HANDLE; - VmaAllocation alloc = nullptr; +static VkPipeline gpline; +static VkPipeline cpline{}; +static VkPipelineLayout cplayout{}; +static VkPipelineLayout gplayout{}; +static VkDescriptorSetLayout cdlayout{}; +static VkDescriptorSet cdset{}; - VkDescriptorPool dpool = VK_NULL_HANDLE; - VkDescriptorSetLayout dlayout = VK_NULL_HANDLE; - VkDescriptorSet dset = VK_NULL_HANDLE; +static std::vector

Ps(8192); - std::vector pool0{{VK_DESCRIPTOR_TYPE_STORAGE_BUFFER,1}}; - if(!rpool::create(pool0,objs.vkdevice.device,&dpool))return false; +static std::vector computeFinishedSemaphores(1); +static std::vector computeInFlightFences(1); - VkBufferCreateInfo bufferInfo{}; - bufferInfo.sType = VK_STRUCTURE_TYPE_BUFFER_CREATE_INFO; - bufferInfo.size = buffersize; - bufferInfo.usage = VK_BUFFER_USAGE_VERTEX_BUFFER_BIT | VK_BUFFER_USAGE_STORAGE_BUFFER_BIT | VK_BUFFER_USAGE_TRANSFER_DST_BIT; - VmaAllocationCreateInfo vmaAllocInfo{}; - vmaAllocInfo.usage = VMA_MEMORY_USAGE_AUTO; - vmaAllocInfo.flags = VMA_ALLOCATION_CREATE_HOST_ACCESS_SEQUENTIAL_WRITE_BIT; - if (vmaCreateBuffer(objs.alloc, &bufferInfo, &vmaAllocInfo, &ssboData.buffer, &ssboData.alloc, nullptr) != - VK_SUCCESS) { - return false; - } +static std::vector> ssbobuffsnallocs(1); - } -} \ No newline at end of file + +static VkDescriptorPool dpool{VK_NULL_HANDLE}; + +static inline void createSyncObjects(vkobjs &objs) { + + // need inflight fences when using more than 1 for both queues + + VkSemaphoreCreateInfo semaphoreInfo{}; + semaphoreInfo.sType = VK_STRUCTURE_TYPE_SEMAPHORE_CREATE_INFO; + + VkFenceCreateInfo fenceInfo{}; + fenceInfo.sType = VK_STRUCTURE_TYPE_FENCE_CREATE_INFO; + fenceInfo.flags = VK_FENCE_CREATE_SIGNALED_BIT; + + if (vkCreateSemaphore(objs.vkdevice.device, &semaphoreInfo, nullptr, &computeFinishedSemaphores.at(0)) != + VK_SUCCESS || + vkCreateFence(objs.vkdevice.device, &fenceInfo, nullptr, &computeInFlightFences.at(0)) != VK_SUCCESS) { + throw std::runtime_error("failed to create compute synchronization objects for a frame!"); + } +} + +static inline bool createeverything(vkobjs &objs) { + + // random + std::default_random_engine randomengine((unsigned)time(nullptr)); + std::uniform_real_distribution randomfloatdistrib(0.0f, 1.0f); + + // particles + for (auto &p : Ps) { + float r = 0.25 * sqrt(randomfloatdistrib(randomengine)); + float theta = randomfloatdistrib(randomengine) * 2.0f * 3.14f; + float x = r * cos(theta) * 600 / 900; + float y = r * sin(theta); + p.position = glm::vec2(x, y); + p.velocity = glm::normalize(glm::vec2(x, y)) * 0.00025f; + p.color = glm::vec4(randomfloatdistrib(randomengine), randomfloatdistrib(randomengine), + randomfloatdistrib(randomengine), 1.0f); + // p.color = glm::vec4(0.6,0.1f,0.5f,1.0f); + // p.velocity = glm::vec2(0.002f,0.002); + // p.position = glm::vec2(-1.0f); + } + + // create buffers + size_t stagingbuffersize{sizeof(P) * Ps.size()}; + VkBuffer stagingbuffer = VK_NULL_HANDLE; + VmaAllocation stagingbufferalloc = nullptr; + + VkBufferCreateInfo bufferInfo{}; + bufferInfo.sType = VK_STRUCTURE_TYPE_BUFFER_CREATE_INFO; + bufferInfo.size = stagingbuffersize; + bufferInfo.usage = VK_BUFFER_USAGE_TRANSFER_SRC_BIT; + + VmaAllocationCreateInfo vmaAllocInfo{}; + vmaAllocInfo.usage = VMA_MEMORY_USAGE_AUTO; // auto + vmaAllocInfo.flags = VMA_ALLOCATION_CREATE_HOST_ACCESS_SEQUENTIAL_WRITE_BIT; // auto + + if (vmaCreateBuffer(objs.alloc, &bufferInfo, &vmaAllocInfo, &stagingbuffer, &stagingbufferalloc, nullptr) != + VK_SUCCESS) { + return false; + } + + void *data; + vmaMapMemory(objs.alloc, stagingbufferalloc, &data); + memcpy(data, Ps.data(), stagingbuffersize); + vmaUnmapMemory(objs.alloc, stagingbufferalloc); + + + for (auto &[x, y] : ssbobuffsnallocs) { + VkBufferCreateInfo bufferInfo2{}; + bufferInfo2.sType = VK_STRUCTURE_TYPE_BUFFER_CREATE_INFO; + bufferInfo2.size = stagingbuffersize; + bufferInfo2.usage = + VK_BUFFER_USAGE_VERTEX_BUFFER_BIT | VK_BUFFER_USAGE_STORAGE_BUFFER_BIT | VK_BUFFER_USAGE_TRANSFER_DST_BIT; + + VmaAllocationCreateInfo vmaAllocInfo2{}; + vmaAllocInfo2.usage = VMA_MEMORY_USAGE_AUTO; // auto + vmaAllocInfo2.flags = VMA_ALLOCATION_CREATE_HOST_ACCESS_SEQUENTIAL_WRITE_BIT; // auto + + if (vmaCreateBuffer(objs.alloc, &bufferInfo2, &vmaAllocInfo2, &x, &y, nullptr) != VK_SUCCESS) { + return false; + } + + VkBufferCopy2 copyRegion2 = { + .sType = VK_STRUCTURE_TYPE_BUFFER_COPY_2, + .pNext = NULL, + .srcOffset = 0, + .dstOffset = 0, + .size = stagingbuffersize, + }; + VkCopyBufferInfo2 copyInfo = { + .sType = VK_STRUCTURE_TYPE_COPY_BUFFER_INFO_2, + .pNext = NULL, + .srcBuffer = stagingbuffer, + .dstBuffer = x, + .regionCount = 1, + .pRegions = ©Region2, + }; + + // uploading buffer + VkCommandBufferBeginInfo beginInfo{}; + beginInfo.sType = VK_STRUCTURE_TYPE_COMMAND_BUFFER_BEGIN_INFO; + beginInfo.flags = VK_COMMAND_BUFFER_USAGE_ONE_TIME_SUBMIT_BIT; + vkResetCommandBuffer(objs.cbuffers[2], 0); + vkBeginCommandBuffer(objs.cbuffers[2], &beginInfo); + vkCmdCopyBuffer2(objs.cbuffers[2], ©Info); + vkEndCommandBuffer(objs.cbuffers[2]); + + VkSubmitInfo submitinfo{}; + submitinfo.sType = VK_STRUCTURE_TYPE_SUBMIT_INFO; + submitinfo.commandBufferCount = 1; + submitinfo.pCommandBuffers = &objs.cbuffers.at(2); + if (vkWaitForFences(objs.vkdevice.device, 1, &objs.renderfence, VK_TRUE, UINT64_MAX) != VK_SUCCESS) { + return false; + } + if (vkResetFences(objs.vkdevice.device, 1, &objs.renderfence) != VK_SUCCESS) + return false; + + objs.mtx2->lock(); + if (vkQueueSubmit(objs.graphicsQ, 1, &submitinfo, objs.renderfence) != VK_SUCCESS) { + return false; + } + vkQueueWaitIdle(objs.graphicsQ); + objs.mtx2->unlock(); + } + + vmaDestroyBuffer(objs.alloc, stagingbuffer, stagingbufferalloc); + + // shaders + VkShaderModule p = vkshader::loadshader(objs.vkdevice.device, "shaders/ppx.spv"); + VkShaderModule c = vkshader::loadshader(objs.vkdevice.device, "shaders/pcx.spv"); + VkShaderModule v = vkshader::loadshader(objs.vkdevice.device, "shaders/pvx.spv"); + + // descriptor pool + std::vector pool0{{VK_DESCRIPTOR_TYPE_STORAGE_BUFFER, 2}}; + if (!rpool::create(pool0, objs.vkdevice.device, &dpool)) + return false; + + // descriptor set layout + std::array dlayoutbinds{}; + dlayoutbinds.at(0).binding = 0; + dlayoutbinds.at(0).descriptorCount = 1; + dlayoutbinds.at(0).descriptorType = VK_DESCRIPTOR_TYPE_STORAGE_BUFFER; + dlayoutbinds.at(0).pImmutableSamplers = VK_NULL_HANDLE; + dlayoutbinds.at(0).stageFlags = VK_SHADER_STAGE_COMPUTE_BIT; + dlayoutbinds.at(1).binding = 1; + dlayoutbinds.at(1).descriptorCount = 1; + dlayoutbinds.at(1).descriptorType = VK_DESCRIPTOR_TYPE_STORAGE_BUFFER; + dlayoutbinds.at(1).pImmutableSamplers = VK_NULL_HANDLE; + dlayoutbinds.at(1).stageFlags = VK_SHADER_STAGE_COMPUTE_BIT; + + VkDescriptorSetLayoutCreateInfo dlayoutinfo{}; + dlayoutinfo.bindingCount = 2; + dlayoutinfo.sType = VK_STRUCTURE_TYPE_DESCRIPTOR_SET_LAYOUT_CREATE_INFO; + dlayoutinfo.pBindings = dlayoutbinds.data(); + if (vkCreateDescriptorSetLayout(objs.vkdevice.device, &dlayoutinfo, VK_NULL_HANDLE, &cdlayout) != VK_SUCCESS) { + return false; + } + + // graphics playout + VkPipelineLayoutCreateInfo playoutinfo{}; + playoutinfo.sType = VK_STRUCTURE_TYPE_PIPELINE_LAYOUT_CREATE_INFO; + playoutinfo.setLayoutCount = 0; + playoutinfo.pSetLayouts = VK_NULL_HANDLE; + if (vkCreatePipelineLayout(objs.vkdevice.device, &playoutinfo, VK_NULL_HANDLE, &gplayout) != VK_SUCCESS) + return false; + + // graphics pline + std::array gshaderinfos{}; + gshaderinfos.at(0).sType = VK_STRUCTURE_TYPE_PIPELINE_SHADER_STAGE_CREATE_INFO; + gshaderinfos.at(0).stage = VK_SHADER_STAGE_VERTEX_BIT; + gshaderinfos.at(0).module = v; + gshaderinfos.at(0).pName = "main"; + gshaderinfos.at(1).sType = VK_STRUCTURE_TYPE_PIPELINE_SHADER_STAGE_CREATE_INFO; + gshaderinfos.at(1).stage = VK_SHADER_STAGE_FRAGMENT_BIT; + gshaderinfos.at(1).module = p; + gshaderinfos.at(1).pName = "main"; + + VkVertexInputBindingDescription inp{}; + inp.binding = 0; + inp.stride = sizeof(P); + inp.inputRate = VK_VERTEX_INPUT_RATE_VERTEX; + std::array inpvx{}; + inpvx.at(0).binding = 0; + inpvx.at(0).location = 0; + inpvx.at(0).format = VK_FORMAT_R32G32_SFLOAT; + inpvx.at(0).offset = offsetof(P, position); + inpvx.at(1).binding = 0; + inpvx.at(1).location = 1; + inpvx.at(1).format = VK_FORMAT_R32G32B32A32_SFLOAT; + inpvx.at(1).offset = offsetof(P, color); + VkPipelineVertexInputStateCreateInfo vinputinfo{}; + vinputinfo.sType = VK_STRUCTURE_TYPE_PIPELINE_VERTEX_INPUT_STATE_CREATE_INFO; + vinputinfo.vertexBindingDescriptionCount = 1; + vinputinfo.vertexAttributeDescriptionCount = inpvx.size(); + vinputinfo.pVertexBindingDescriptions = &inp; + vinputinfo.pVertexAttributeDescriptions = inpvx.data(); + + VkPipelineInputAssemblyStateCreateInfo inputass{}; + inputass.sType = VK_STRUCTURE_TYPE_PIPELINE_INPUT_ASSEMBLY_STATE_CREATE_INFO; + inputass.topology = VK_PRIMITIVE_TOPOLOGY_POINT_LIST; /////////////////////////////////////////////////////// + inputass.primitiveRestartEnable = VK_FALSE; + + VkPipelineViewportStateCreateInfo viewportinfo{}; + viewportinfo.sType = VK_STRUCTURE_TYPE_PIPELINE_VIEWPORT_STATE_CREATE_INFO; + viewportinfo.viewportCount = 1; + viewportinfo.scissorCount = 1; + + VkPipelineRasterizationStateCreateInfo rasterinfo{}; + rasterinfo.sType = VK_STRUCTURE_TYPE_PIPELINE_RASTERIZATION_STATE_CREATE_INFO; + rasterinfo.depthClampEnable = VK_FALSE; + rasterinfo.rasterizerDiscardEnable = VK_FALSE; + rasterinfo.polygonMode = VK_POLYGON_MODE_FILL; + rasterinfo.lineWidth = 1.0f; + rasterinfo.cullMode = VK_CULL_MODE_BACK_BIT; + rasterinfo.frontFace = VK_FRONT_FACE_COUNTER_CLOCKWISE; + rasterinfo.depthBiasEnable = VK_FALSE; + + VkPipelineMultisampleStateCreateInfo multisinfo{}; + multisinfo.sType = VK_STRUCTURE_TYPE_PIPELINE_MULTISAMPLE_STATE_CREATE_INFO; + multisinfo.sampleShadingEnable = VK_FALSE; + multisinfo.rasterizationSamples = VK_SAMPLE_COUNT_1_BIT; + + VkPipelineColorBlendAttachmentState colorattach{}; + colorattach.colorWriteMask = + VK_COLOR_COMPONENT_R_BIT | VK_COLOR_COMPONENT_G_BIT | VK_COLOR_COMPONENT_B_BIT | VK_COLOR_COMPONENT_A_BIT; + colorattach.blendEnable = VK_TRUE; + colorattach.colorBlendOp = VK_BLEND_OP_ADD; + colorattach.srcColorBlendFactor = VK_BLEND_FACTOR_SRC_ALPHA; + colorattach.dstColorBlendFactor = VK_BLEND_FACTOR_ONE_MINUS_SRC_ALPHA; + colorattach.alphaBlendOp = VK_BLEND_OP_ADD; + colorattach.srcAlphaBlendFactor = VK_BLEND_FACTOR_ONE_MINUS_SRC_ALPHA; + colorattach.dstAlphaBlendFactor = VK_BLEND_FACTOR_ZERO; + VkPipelineColorBlendStateCreateInfo colorinfo{}; + colorinfo.sType = VK_STRUCTURE_TYPE_PIPELINE_COLOR_BLEND_STATE_CREATE_INFO; + colorinfo.logicOpEnable = VK_FALSE; + colorinfo.logicOp = VK_LOGIC_OP_COPY; + colorinfo.attachmentCount = 1; + colorinfo.pAttachments = &colorattach; + colorinfo.blendConstants[0] = 0.0f; + colorinfo.blendConstants[1] = 0.0f; + colorinfo.blendConstants[2] = 0.0f; + colorinfo.blendConstants[3] = 0.0f; + VkPipelineDepthStencilStateCreateInfo depthStencilInfo{}; + depthStencilInfo.sType = VK_STRUCTURE_TYPE_PIPELINE_DEPTH_STENCIL_STATE_CREATE_INFO; + depthStencilInfo.depthTestEnable = VK_TRUE; + depthStencilInfo.depthWriteEnable = VK_TRUE; + depthStencilInfo.depthCompareOp = VK_COMPARE_OP_LESS_OR_EQUAL; + depthStencilInfo.depthBoundsTestEnable = VK_FALSE; + depthStencilInfo.minDepthBounds = 0.0f; + depthStencilInfo.maxDepthBounds = 1.0f; + depthStencilInfo.stencilTestEnable = VK_FALSE; + + std::array dynstates{VK_DYNAMIC_STATE_VIEWPORT, VK_DYNAMIC_STATE_SCISSOR}; + VkPipelineDynamicStateCreateInfo dyninfo{}; + dyninfo.sType = VK_STRUCTURE_TYPE_PIPELINE_DYNAMIC_STATE_CREATE_INFO; + dyninfo.dynamicStateCount = dynstates.size(); + dyninfo.pDynamicStates = dynstates.data(); + + VkGraphicsPipelineCreateInfo plineinfo{}; + plineinfo.sType = VK_STRUCTURE_TYPE_GRAPHICS_PIPELINE_CREATE_INFO; + plineinfo.stageCount = 2; + plineinfo.pStages = gshaderinfos.data(); + plineinfo.pVertexInputState = &vinputinfo; + plineinfo.pInputAssemblyState = &inputass; + plineinfo.pViewportState = &viewportinfo; + plineinfo.pRasterizationState = &rasterinfo; + plineinfo.pMultisampleState = &multisinfo; + plineinfo.pColorBlendState = &colorinfo; + plineinfo.pDepthStencilState = &depthStencilInfo; + plineinfo.pDynamicState = &dyninfo; + plineinfo.layout = gplayout; + plineinfo.renderPass = objs.rdrenderpass; + plineinfo.subpass = 0; + plineinfo.basePipelineHandle = VK_NULL_HANDLE; + if (vkCreateGraphicsPipelines(objs.vkdevice.device, VK_NULL_HANDLE, 1, &plineinfo, nullptr, &gpline) != VK_SUCCESS) { + return false; + } + + vkDestroyShaderModule(objs.vkdevice.device, p, VK_NULL_HANDLE); + vkDestroyShaderModule(objs.vkdevice.device, v, VK_NULL_HANDLE); + + // descriptor sets + std::array clayouts({cdlayout}); + VkDescriptorSetAllocateInfo cdallocinfo{}; + cdallocinfo.sType = VK_STRUCTURE_TYPE_DESCRIPTOR_SET_ALLOCATE_INFO; + cdallocinfo.descriptorPool = dpool; + cdallocinfo.descriptorSetCount = 1; + cdallocinfo.pSetLayouts = clayouts.data(); + if (vkAllocateDescriptorSets(objs.vkdevice.device, &cdallocinfo, &cdset) != VK_SUCCESS) { + return false; + } + + VkDescriptorBufferInfo cssboinfo{}; // remake when switching to 2 frames + cssboinfo.buffer = ssbobuffsnallocs.at(0).first; + cssboinfo.offset = 0; + cssboinfo.range = sizeof(P) * Ps.size(); + + std::array cdwrites{}; + cdwrites.at(0).sType = VK_STRUCTURE_TYPE_WRITE_DESCRIPTOR_SET; + cdwrites.at(0).dstSet = cdset; + cdwrites.at(0).dstBinding = 0; + cdwrites.at(0).dstArrayElement = 0; + cdwrites.at(0).descriptorType = VK_DESCRIPTOR_TYPE_STORAGE_BUFFER; + cdwrites.at(0).descriptorCount = 1; + cdwrites.at(0).pBufferInfo = &cssboinfo; + cdwrites.at(1).sType = VK_STRUCTURE_TYPE_WRITE_DESCRIPTOR_SET; + cdwrites.at(1).dstSet = cdset; + cdwrites.at(1).dstBinding = 1; + cdwrites.at(1).dstArrayElement = 0; + cdwrites.at(1).descriptorType = VK_DESCRIPTOR_TYPE_STORAGE_BUFFER; + cdwrites.at(1).descriptorCount = 1; + cdwrites.at(1).pBufferInfo = &cssboinfo; + + vkUpdateDescriptorSets(objs.vkdevice.device, cdwrites.size(), cdwrites.data(), 0, VK_NULL_HANDLE); + + // compute playout + VkPipelineLayoutCreateInfo cplayoutinfo{}; + cplayoutinfo.sType = VK_STRUCTURE_TYPE_PIPELINE_LAYOUT_CREATE_INFO; + cplayoutinfo.setLayoutCount = 1; + cplayoutinfo.pSetLayouts = &cdlayout; + if (vkCreatePipelineLayout(objs.vkdevice.device, &cplayoutinfo, VK_NULL_HANDLE, &cplayout) != VK_SUCCESS) + return false; + + // compute pline + std::array cshaderinfos{}; + cshaderinfos.at(0).sType = VK_STRUCTURE_TYPE_PIPELINE_SHADER_STAGE_CREATE_INFO; + cshaderinfos.at(0).stage = VK_SHADER_STAGE_COMPUTE_BIT; + cshaderinfos.at(0).module = c; + cshaderinfos.at(0).pName = "main"; + + VkComputePipelineCreateInfo cplineinfo{}; + cplineinfo.sType = VK_STRUCTURE_TYPE_COMPUTE_PIPELINE_CREATE_INFO; + cplineinfo.layout = cplayout; + cplineinfo.stage = cshaderinfos.at(0); + + if (vkCreateComputePipelines(objs.vkdevice.device, VK_NULL_HANDLE, 1, &cplineinfo, VK_NULL_HANDLE, &cpline) != + VK_SUCCESS) { + return false; + } + + vkDestroyShaderModule(objs.vkdevice.device, c, VK_NULL_HANDLE); + + createSyncObjects(objs); + return true; +} + +static inline bool drawcomp(vkobjs &objs) { + + vkWaitForFences(objs.vkdevice.device,1,&computeInFlightFences.at(0),VK_TRUE,UINT64_MAX); + + vkResetFences(objs.vkdevice.device,1,&computeInFlightFences.at(0)); + + if (vkResetCommandBuffer(objs.cbuffers[3], 0) != VK_SUCCESS) + return false; + + VkCommandBufferBeginInfo cmdbgninfo{}; + cmdbgninfo.sType = VK_STRUCTURE_TYPE_COMMAND_BUFFER_BEGIN_INFO; + + if (vkBeginCommandBuffer(objs.cbuffers[3], &cmdbgninfo) != VK_SUCCESS) + return false; + + vkCmdBindPipeline(objs.cbuffers[3], VK_PIPELINE_BIND_POINT_COMPUTE, cpline); + + vkCmdBindDescriptorSets(objs.cbuffers[3],VK_PIPELINE_BIND_POINT_COMPUTE,cplayout,0,1,&cdset,0,VK_NULL_HANDLE); + // VkBindDescriptorSetsInfo dsetinfo{}; + // dsetinfo.sType = VK_STRUCTURE_TYPE_BIND_DESCRIPTOR_SETS_INFO; + // dsetinfo.layout = cplayout; + // dsetinfo.descriptorSetCount = 1; + // dsetinfo.firstSet = 0; + // dsetinfo.dynamicOffsetCount = 0; + // dsetinfo.pDynamicOffsets = VK_NULL_HANDLE; + // dsetinfo.pNext = VK_NULL_HANDLE; + // dsetinfo.stageFlags = ; + // dsetinfo.pDescriptorSets = &cdset; + // vkCmdBindDescriptorSets2(objs.cbuffers[2], &dsetinfo); + + vkCmdDispatch(objs.cbuffers[3], Ps.size() / 256, 1, 1); + + if (vkEndCommandBuffer(objs.cbuffers[3]) != VK_SUCCESS) + return false; + + VkSubmitInfo submitinfo{}; + submitinfo.sType = VK_STRUCTURE_TYPE_SUBMIT_INFO; + submitinfo.commandBufferCount = 1; + submitinfo.pCommandBuffers = &objs.cbuffers.at(3); + submitinfo.signalSemaphoreCount = 1; + submitinfo.pSignalSemaphores = computeFinishedSemaphores.data(); + + objs.mtx2->lock(); + if (vkQueueSubmit(objs.computeQ, 1, &submitinfo, computeInFlightFences.at(0)) != VK_SUCCESS) { + return false; + } + objs.mtx2->unlock(); + + return true; +} + +static inline void destroyeveryting(vkobjs &objs) { + vkDestroyPipeline(objs.vkdevice.device,gpline,VK_NULL_HANDLE); + vkDestroyPipelineLayout(objs.vkdevice.device,gplayout,VK_NULL_HANDLE); + vkDestroyPipeline(objs.vkdevice.device,cpline,VK_NULL_HANDLE); + vkDestroyPipelineLayout(objs.vkdevice.device,cplayout,VK_NULL_HANDLE); + + rpool::destroy(objs.vkdevice.device,dpool); + vkDestroyDescriptorSetLayout(objs.vkdevice.device,cdlayout,VK_NULL_HANDLE); + vmaDestroyBuffer(objs.alloc,ssbobuffsnallocs.at(0).first,ssbobuffsnallocs.at(0).second); + + vkDestroySemaphore(objs.vkdevice.device,computeFinishedSemaphores.at(0),VK_NULL_HANDLE); + vkDestroyFence(objs.vkdevice.device,computeInFlightFences.at(0),VK_NULL_HANDLE); + +} + +} // namespace particle \ No newline at end of file diff --git a/include/vkobjs.hpp b/include/vkobjs.hpp index 35fae82..b4bf94e 100644 --- a/include/vkobjs.hpp +++ b/include/vkobjs.hpp @@ -150,8 +150,8 @@ struct vkobjs { VkRenderPass rdrenderpass = VK_NULL_HANDLE; - std::vector cpools = {VK_NULL_HANDLE, VK_NULL_HANDLE, VK_NULL_HANDLE}; - std::vector cbuffers = {VK_NULL_HANDLE, VK_NULL_HANDLE, VK_NULL_HANDLE}; + std::vector cpools = {VK_NULL_HANDLE, VK_NULL_HANDLE, VK_NULL_HANDLE, VK_NULL_HANDLE}; + std::vector cbuffers = {VK_NULL_HANDLE, VK_NULL_HANDLE, VK_NULL_HANDLE, VK_NULL_HANDLE}; VkSemaphore presentsemaphore = VK_NULL_HANDLE; VkSemaphore rendersemaphore = VK_NULL_HANDLE; diff --git a/shaders/gen.slang b/shaders/gen.slang index 3198a26..4d2f3af 100644 --- a/shaders/gen.slang +++ b/shaders/gen.slang @@ -112,11 +112,4 @@ PXout pxmain(PXin pxin) { out.color = tex[pxin.txidx].Sample(float2(pxin.texCoord.x, pxin.texCoord.y - fract(pxin.t2 * pxin.txidx / 4.0))); return out; -} - - -[shader("compute")] -[[numthreads(256, 1, 1)]] -void cxmain(CXin cx) { - pout[cx.tid.x].position = pin[cx.tid.x].position + pin[cx.tid.x].velocity.xy * 0.0001; } \ No newline at end of file diff --git a/shaders/particle.slang b/shaders/particle.slang index 5678ea8..32bfbbb 100644 --- a/shaders/particle.slang +++ b/shaders/particle.slang @@ -11,8 +11,7 @@ struct VXin { } struct PXin { float3 normal; - float4 color; - float32_t t2; + float4 color; } struct CXin { uint3 tid : SV_DispatchThreadID; @@ -36,23 +35,22 @@ RWStructuredBuffer pout; [shader("vertex")] VXout vxmain(VXin vxin) { VXout out; - out.sv_position = float4(vxin.pos, 1.0f, 1.0f); - out.pxin.color = vxin.color; - out.psize = 20.0f; + out.sv_position = float4(vxin.pos, 1.0f, 1.0f); + out.pxin.color = vxin.color; + out.psize = 14.0f; return out; } - [shader("pixel")] -PXout pxmain(PXin pxin) { - PXout out; - out.color = pxin.color; +PXout pxmain(PXin pxin, float2 coord: SV_PointCoord) { + PXout out; + out.color = float4(pxin.color.xyz, 0.5 - length(coord - float2(0.5))); return out; } [shader("compute")] [[numthreads(256, 1, 1)]] void cxmain(uint3 tid : SV_DispatchThreadID) { - pout[tid.x].position = pin[tid.x].position + pin[tid.x].velocity.xy * 0.0001; + pout[tid.x].position = pin[tid.x].position + pin[tid.x].velocity.xy * 0.1; pout[tid.x].velocity = pin[tid.x].velocity; } \ No newline at end of file diff --git a/src/auxiliary/ui.cpp b/src/auxiliary/ui.cpp index a991c5d..0e6e3f3 100644 --- a/src/auxiliary/ui.cpp +++ b/src/auxiliary/ui.cpp @@ -66,7 +66,7 @@ bool ui::init(vkobjs &renderData) { VkCommandBuffer imguiCommandBuffer; - if (!commandbuffer::init(renderData, renderData.cpools[1], imguiCommandBuffer)) { + if (!commandbuffer::init(renderData, renderData.cpools[3], imguiCommandBuffer)) { return false; } @@ -125,7 +125,7 @@ bool ui::init(vkobjs &renderData) { } vkDestroyFence(renderData.vkdevice.device, imguiBufferFence, nullptr); - commandbuffer::cleanup(renderData, renderData.cpools[1], imguiCommandBuffer); + commandbuffer::cleanup(renderData, renderData.cpools[3], imguiCommandBuffer); ImGui::StyleColorsDark(); diff --git a/src/core/vkrenderer.cpp b/src/core/vkrenderer.cpp index ab2ae62..d112484 100644 --- a/src/core/vkrenderer.cpp +++ b/src/core/vkrenderer.cpp @@ -4,6 +4,7 @@ // #define _DEBUG #include "vkrenderer.hpp" +#include "exp/particle.hpp" #include #include @@ -94,6 +95,8 @@ bool vkrenderer::initscene() { playercount.clear(); playercount.shrink_to_fit(); + if(!particle::createeverything(mvkobjs))return false; + return true; } ui *vkrenderer::getuihandle() { @@ -110,7 +113,7 @@ bool vkrenderer::quicksetup() { bool vkrenderer::deviceinit() { vkb::InstanceBuilder instbuild{}; - auto instret = instbuild.use_default_debug_messenger().request_validation_layers().require_api_version(1, 4).build(); + auto instret = instbuild.use_default_debug_messenger().request_validation_layers().require_api_version(1, 3).build(); if(!instret){ std::cout << instret.full_error().type << std::endl; @@ -124,7 +127,7 @@ bool vkrenderer::deviceinit() { res = SDL_Vulkan_CreateSurface(mvkobjs.wind, mvkobjs.inst, nullptr, &msurface); vkb::PhysicalDeviceSelector physicaldevsel{mvkobjs.inst}; - auto firstphysicaldevselret = physicaldevsel.set_surface(msurface).set_minimum_version(1, 4).select(); + auto firstphysicaldevselret = physicaldevsel.set_surface(msurface).set_minimum_version(1, 3).select(); VkPhysicalDeviceVulkan14Features physfeatures14; VkPhysicalDeviceVulkan13Features physfeatures13; @@ -145,7 +148,7 @@ bool vkrenderer::deviceinit() { physfeatures14.pNext = VK_NULL_HANDLE; vkGetPhysicalDeviceFeatures2(firstphysicaldevselret.value(), &physfeatures); - auto secondphysicaldevselret = physicaldevsel.set_minimum_version(1, 4) + auto secondphysicaldevselret = physicaldevsel.set_minimum_version(1, 3) .set_surface(msurface) .set_required_features(physfeatures.features) .set_required_features_11(physfeatures11) @@ -287,16 +290,22 @@ bool vkrenderer::createframebuffer() { bool vkrenderer::createcommandpool() { if (!commandpool::init(mvkobjs, mvkobjs.cpools[0])) return false; - if (!commandpool::init(mvkobjs, mvkobjs.cpools[1])) + if (!commandpool::initcompute(mvkobjs, mvkobjs.cpools[1])) return false; if (!commandpool::init(mvkobjs, mvkobjs.cpools[2])) return false; + if (!commandpool::init(mvkobjs, mvkobjs.cpools[3])) + return false; return true; } bool vkrenderer::createcommandbuffer() { if (!commandbuffer::init(mvkobjs, mvkobjs.cpools[0], mvkobjs.cbuffers[0])) return false; - if (!commandbuffer::init(mvkobjs, mvkobjs.cpools[1], mvkobjs.cbuffers[1])) + if (!commandbuffer::init(mvkobjs, mvkobjs.cpools[0], mvkobjs.cbuffers[1])) + return false; + if (!commandbuffer::init(mvkobjs, mvkobjs.cpools[0], mvkobjs.cbuffers[2])) + return false; + if (!commandbuffer::init(mvkobjs, mvkobjs.cpools[1], mvkobjs.cbuffers[3])) return false; return true; } @@ -313,8 +322,8 @@ bool vkrenderer::initui() { void vkrenderer::cleanup() { vkDeviceWaitIdle(mvkobjs.vkdevice.device); - commandbuffer::cleanup(mvkobjs, mvkobjs.cpools[1], mvkobjs.cbuffers[1]); - commandpool::cleanup(mvkobjs, mvkobjs.cpools[1]); + particle::destroyeveryting(mvkobjs); + for (const auto &i : mplayer) i->cleanupmodels(mvkobjs); @@ -322,8 +331,13 @@ void vkrenderer::cleanup() { vksyncobjects::cleanup(mvkobjs); commandbuffer::cleanup(mvkobjs, mvkobjs.cpools[0], mvkobjs.cbuffers[0]); + commandbuffer::cleanup(mvkobjs, mvkobjs.cpools[0], mvkobjs.cbuffers[1]); + commandbuffer::cleanup(mvkobjs, mvkobjs.cpools[0], mvkobjs.cbuffers[2]); + commandbuffer::cleanup(mvkobjs, mvkobjs.cpools[1], mvkobjs.cbuffers[3]); commandpool::cleanup(mvkobjs, mvkobjs.cpools[0]); + commandpool::cleanup(mvkobjs, mvkobjs.cpools[1]); commandpool::cleanup(mvkobjs, mvkobjs.cpools[2]); + commandpool::cleanup(mvkobjs, mvkobjs.cpools[3]); framebuffer::cleanup(mvkobjs); for (const auto &i : mplayer) @@ -511,7 +525,7 @@ bool vkrenderer::uploadfordraw(std::shared_ptr &x) { presentinfo.pImageIndices = &imgidx; mvkobjs.mtx2->lock(); - size_t res2 = vkQueuePresentKHR(mvkobjs.presentQ, &presentinfo); + VkResult res2 = vkQueuePresentKHR(mvkobjs.presentQ, &presentinfo); mvkobjs.mtx2->unlock(); @@ -766,6 +780,13 @@ void vkrenderer::updateanims() { } bool vkrenderer::draw() { + + + + particle::drawcomp(mvkobjs); + + + double tick = static_cast(SDL_GetTicks()) / 1000.0; mvkobjs.tickdiff = tick - mlasttick; mvkobjs.frametime = mframetimer.stop(); @@ -874,6 +895,13 @@ bool vkrenderer::draw() { vkCmdSetViewport(mvkobjs.cbuffers[0], 0, 1, &viewport); vkCmdSetScissor(mvkobjs.cbuffers[0], 0, 1, &scissor); + + VkDeviceSize coffsets{0}; + vkCmdBindPipeline(mvkobjs.cbuffers[0], VK_PIPELINE_BIND_POINT_GRAPHICS, particle::gpline); + vkCmdBindVertexBuffers(mvkobjs.cbuffers[0],0,1,&particle::ssbobuffsnallocs.at(0).first,&coffsets); + vkCmdDraw(mvkobjs.cbuffers[0],8192,1,0,0); + + for (const auto &i : mplayer) i->draw(mvkobjs); @@ -882,6 +910,11 @@ bool vkrenderer::draw() { mui.createdbgframe(mvkobjs, selectiondata); + + + + + mui.render(mvkobjs, mvkobjs.cbuffers[0]); vkCmdEndRenderPass(mvkobjs.cbuffers[0]); @@ -906,9 +939,9 @@ bool vkrenderer::draw() { VkPipelineStageFlags waitstage = VK_PIPELINE_STAGE_COLOR_ATTACHMENT_OUTPUT_BIT; submitinfo.pWaitDstStageMask = &waitstage; - - submitinfo.waitSemaphoreCount = 1; - submitinfo.pWaitSemaphores = &mvkobjs.presentsemaphore; + std::array waitsemas{mvkobjs.presentsemaphore,particle::computeFinishedSemaphores.at(0)}; + submitinfo.waitSemaphoreCount = 2; + submitinfo.pWaitSemaphores = waitsemas.data(); submitinfo.signalSemaphoreCount = 1; submitinfo.pSignalSemaphores = &mvkobjs.rendersemaphore; diff --git a/src/exp/particle.cpp b/src/exp/particle.cpp deleted file mode 100644 index e69de29..0000000 diff --git a/src/vk/commandpool.cpp b/src/vk/commandpool.cpp index dc7053d..e590c52 100644 --- a/src/vk/commandpool.cpp +++ b/src/vk/commandpool.cpp @@ -14,6 +14,18 @@ bool commandpool::init(vkobjs &rdata, VkCommandPool &vkpool) { return true; } +bool commandpool::initcompute(vkobjs &rdata, VkCommandPool &vkpool) { + VkCommandPoolCreateInfo poolcreateinfo{}; + poolcreateinfo.sType = VK_STRUCTURE_TYPE_COMMAND_POOL_CREATE_INFO; + poolcreateinfo.queueFamilyIndex = rdata.vkdevice.get_queue_index(vkb::QueueType::compute).value(); + poolcreateinfo.flags = VK_COMMAND_POOL_CREATE_RESET_COMMAND_BUFFER_BIT; + + if (vkCreateCommandPool(rdata.vkdevice.device, &poolcreateinfo, nullptr, &vkpool) != VK_SUCCESS) { + return false; + } + + return true; +} void commandpool::cleanup(vkobjs &rdata, VkCommandPool &vkpool) { vkDestroyCommandPool(rdata.vkdevice.device, vkpool, nullptr); } From 67103dcabefeacc22da588f8424454fedd6c6937 Mon Sep 17 00:00:00 2001 From: r Date: Mon, 9 Jun 2025 19:51:32 +0300 Subject: [PATCH 06/40] compute particles test 2 & cleanup --- include/buffer/ssbo.hpp | 168 ++++++++++++++++----------------- include/commandbuffer.hpp | 8 -- include/commandpool.hpp | 9 -- include/exp/particle.hpp | 30 +++--- include/vk/commandbuffer.hpp | 24 +++++ include/vk/commandpool.hpp | 29 ++++++ include/vkobjs.hpp | 41 ++++---- src/auxiliary/ui.cpp | 16 ++-- src/core/vkrenderer.cpp | 114 ++++++++++------------ src/glue/vktexture.cpp | 42 ++++----- src/model/genericmodel.cpp | 14 +-- src/playout/playoutgeneric.cpp | 8 +- src/subcore/vkcam.cpp | 4 +- src/vk/commandbuffer.cpp | 19 ---- src/vk/commandpool.cpp | 31 ------ 15 files changed, 267 insertions(+), 290 deletions(-) delete mode 100644 include/commandbuffer.hpp delete mode 100644 include/commandpool.hpp create mode 100644 include/vk/commandbuffer.hpp create mode 100644 include/vk/commandpool.hpp delete mode 100644 src/vk/commandbuffer.cpp delete mode 100644 src/vk/commandpool.cpp diff --git a/include/buffer/ssbo.hpp b/include/buffer/ssbo.hpp index b589ba6..9b88bff 100644 --- a/include/buffer/ssbo.hpp +++ b/include/buffer/ssbo.hpp @@ -6,89 +6,89 @@ #include "vkobjs.hpp" namespace ssbo { - static inline bool init(vkobjs &objs, ssbodata &ssboData, size_t buffersize) { - - std::vector pool0{{VK_DESCRIPTOR_TYPE_STORAGE_BUFFER,1}}; - if(!rpool::create(pool0,objs.vkdevice.device,&ssboData.dpool))return false; - - VkBufferCreateInfo bufferInfo{}; - bufferInfo.sType = VK_STRUCTURE_TYPE_BUFFER_CREATE_INFO; - bufferInfo.size = buffersize; - bufferInfo.usage = VK_BUFFER_USAGE_STORAGE_BUFFER_BIT | VK_BUFFER_USAGE_TRANSFER_SRC_BIT; - - VmaAllocationCreateInfo vmaAllocInfo{}; - vmaAllocInfo.usage = VMA_MEMORY_USAGE_AUTO; - vmaAllocInfo.flags = VMA_ALLOCATION_CREATE_HOST_ACCESS_SEQUENTIAL_WRITE_BIT; - - if (vmaCreateBuffer(objs.alloc, &bufferInfo, &vmaAllocInfo, &ssboData.buffer, &ssboData.alloc, nullptr) != - VK_SUCCESS) { - return false; - } - - VkDescriptorSetLayoutBinding ssboBind{}; - ssboBind.descriptorType = VK_DESCRIPTOR_TYPE_STORAGE_BUFFER; - ssboBind.binding = 0; - ssboBind.descriptorCount = 1; - ssboBind.pImmutableSamplers = nullptr; - ssboBind.stageFlags = VK_SHADER_STAGE_VERTEX_BIT; - - VkDescriptorSetLayoutCreateInfo ssboCreateInfo{}; - ssboCreateInfo.sType = VK_STRUCTURE_TYPE_DESCRIPTOR_SET_LAYOUT_CREATE_INFO; - ssboCreateInfo.bindingCount = 1; - ssboCreateInfo.pBindings = &ssboBind; - - if (vkCreateDescriptorSetLayout(objs.vkdevice.device, &ssboCreateInfo, nullptr, &ssboData.dlayout) != VK_SUCCESS) { - return false; - } - - - VkDescriptorSetAllocateInfo descriptorAllocateInfo{}; - descriptorAllocateInfo.sType = VK_STRUCTURE_TYPE_DESCRIPTOR_SET_ALLOCATE_INFO; - descriptorAllocateInfo.descriptorPool = ssboData.dpool; - descriptorAllocateInfo.descriptorSetCount = 1; - descriptorAllocateInfo.pSetLayouts = &ssboData.dlayout; - - if (vkAllocateDescriptorSets(objs.vkdevice.device, &descriptorAllocateInfo, &ssboData.dset) != VK_SUCCESS) { - return false; - } - - VkDescriptorBufferInfo ssboInfo{}; - ssboInfo.buffer = ssboData.buffer; - ssboInfo.offset = 0; - ssboInfo.range = buffersize; - - VkWriteDescriptorSet writeDescriptorSet{}; - writeDescriptorSet.sType = VK_STRUCTURE_TYPE_WRITE_DESCRIPTOR_SET; - writeDescriptorSet.descriptorType = VK_DESCRIPTOR_TYPE_STORAGE_BUFFER; - writeDescriptorSet.dstSet = ssboData.dset; - writeDescriptorSet.dstBinding = 0; - writeDescriptorSet.descriptorCount = 1; - writeDescriptorSet.pBufferInfo = &ssboInfo; - - vkUpdateDescriptorSets(objs.vkdevice.device, 1, &writeDescriptorSet, 0, nullptr); - - ssboData.size = buffersize; - - return true; - } - // template - // concept vectoradjacent = requires(T x){ - // {x.size()} -> std::convertible_to; - // {x.data()}; - // }; - template - static inline void upload(const vkobjs &objs, const ssbodata &ssbodata, const std::vector &mats) { - if (mats.size() <= 0) { - return; - } - void *data; - vmaMapMemory(objs.alloc, ssbodata.alloc, &data); - std::memcpy(data, mats.data(), ssbodata.size); - vmaUnmapMemory(objs.alloc, ssbodata.alloc); - } +static inline bool init(vkobjs &objs, ssbodata &ssboData, size_t buffersize) { + + std::vector pool0{{VK_DESCRIPTOR_TYPE_STORAGE_BUFFER,1}}; + if(!rpool::create(pool0,objs.vkdevice.device,&ssboData.dpool))return false; + + VkBufferCreateInfo bufferInfo{}; + bufferInfo.sType = VK_STRUCTURE_TYPE_BUFFER_CREATE_INFO; + bufferInfo.size = buffersize; + bufferInfo.usage = VK_BUFFER_USAGE_STORAGE_BUFFER_BIT | VK_BUFFER_USAGE_TRANSFER_SRC_BIT; + + VmaAllocationCreateInfo vmaAllocInfo{}; + vmaAllocInfo.usage = VMA_MEMORY_USAGE_AUTO; + vmaAllocInfo.flags = VMA_ALLOCATION_CREATE_HOST_ACCESS_SEQUENTIAL_WRITE_BIT; + + if (vmaCreateBuffer(objs.alloc, &bufferInfo, &vmaAllocInfo, &ssboData.buffer, &ssboData.alloc, nullptr) != + VK_SUCCESS) { + return false; + } + + VkDescriptorSetLayoutBinding ssboBind{}; + ssboBind.descriptorType = VK_DESCRIPTOR_TYPE_STORAGE_BUFFER; + ssboBind.binding = 0; + ssboBind.descriptorCount = 1; + ssboBind.pImmutableSamplers = nullptr; + ssboBind.stageFlags = VK_SHADER_STAGE_VERTEX_BIT; + + VkDescriptorSetLayoutCreateInfo ssboCreateInfo{}; + ssboCreateInfo.sType = VK_STRUCTURE_TYPE_DESCRIPTOR_SET_LAYOUT_CREATE_INFO; + ssboCreateInfo.bindingCount = 1; + ssboCreateInfo.pBindings = &ssboBind; + + if (vkCreateDescriptorSetLayout(objs.vkdevice.device, &ssboCreateInfo, nullptr, &ssboData.dlayout) != VK_SUCCESS) { + return false; + } + + + VkDescriptorSetAllocateInfo descriptorAllocateInfo{}; + descriptorAllocateInfo.sType = VK_STRUCTURE_TYPE_DESCRIPTOR_SET_ALLOCATE_INFO; + descriptorAllocateInfo.descriptorPool = ssboData.dpool; + descriptorAllocateInfo.descriptorSetCount = 1; + descriptorAllocateInfo.pSetLayouts = &ssboData.dlayout; + + if (vkAllocateDescriptorSets(objs.vkdevice.device, &descriptorAllocateInfo, &ssboData.dset) != VK_SUCCESS) { + return false; + } + + VkDescriptorBufferInfo ssboInfo{}; + ssboInfo.buffer = ssboData.buffer; + ssboInfo.offset = 0; + ssboInfo.range = buffersize; + + VkWriteDescriptorSet writeDescriptorSet{}; + writeDescriptorSet.sType = VK_STRUCTURE_TYPE_WRITE_DESCRIPTOR_SET; + writeDescriptorSet.descriptorType = VK_DESCRIPTOR_TYPE_STORAGE_BUFFER; + writeDescriptorSet.dstSet = ssboData.dset; + writeDescriptorSet.dstBinding = 0; + writeDescriptorSet.descriptorCount = 1; + writeDescriptorSet.pBufferInfo = &ssboInfo; + + vkUpdateDescriptorSets(objs.vkdevice.device, 1, &writeDescriptorSet, 0, nullptr); + + ssboData.size = buffersize; + + return true; +} +// template +// concept vectoradjacent = requires(T x){ +// {x.size()} -> std::convertible_to; +// {x.data()}; +// }; +template +static inline void upload(const vkobjs &objs, const ssbodata &ssbodata, const std::vector &mats) { + if (mats.size() <= 0) { + return; + } + void *data; + vmaMapMemory(objs.alloc, ssbodata.alloc, &data); + std::memcpy(data, mats.data(), ssbodata.size); + vmaUnmapMemory(objs.alloc, ssbodata.alloc); +} static inline void cleanup(vkobjs &objs, ssbodata &ssbodata) { - rpool::destroy(objs.vkdevice.device, ssbodata.dpool); - vkDestroyDescriptorSetLayout(objs.vkdevice.device, ssbodata.dlayout, nullptr); - vmaDestroyBuffer(objs.alloc, ssbodata.buffer, ssbodata.alloc); - } + rpool::destroy(objs.vkdevice.device, ssbodata.dpool); + vkDestroyDescriptorSetLayout(objs.vkdevice.device, ssbodata.dlayout, nullptr); + vmaDestroyBuffer(objs.alloc, ssbodata.buffer, ssbodata.alloc); +} }; diff --git a/include/commandbuffer.hpp b/include/commandbuffer.hpp deleted file mode 100644 index 2502c71..0000000 --- a/include/commandbuffer.hpp +++ /dev/null @@ -1,8 +0,0 @@ -#pragma once -#include "vkobjs.hpp" -#include -class commandbuffer { -public: - static bool init(vkobjs &rdata, VkCommandPool &vkpool, VkCommandBuffer &incommandbuffer); - static void cleanup(vkobjs &rdata, VkCommandPool &vkpool, VkCommandBuffer &incommandbuffer); -}; \ No newline at end of file diff --git a/include/commandpool.hpp b/include/commandpool.hpp deleted file mode 100644 index e7d37e5..0000000 --- a/include/commandpool.hpp +++ /dev/null @@ -1,9 +0,0 @@ -#pragma once -#include "vkobjs.hpp" -#include -class commandpool { -public: - static bool init(vkobjs &rdata, VkCommandPool &vkpool); - static bool initcompute(vkobjs &rdata, VkCommandPool &vkpool); - static void cleanup(vkobjs &rdata, VkCommandPool &vkpool); -}; \ No newline at end of file diff --git a/include/exp/particle.hpp b/include/exp/particle.hpp index f6232c3..545f13c 100644 --- a/include/exp/particle.hpp +++ b/include/exp/particle.hpp @@ -129,15 +129,15 @@ static inline bool createeverything(vkobjs &objs) { VkCommandBufferBeginInfo beginInfo{}; beginInfo.sType = VK_STRUCTURE_TYPE_COMMAND_BUFFER_BEGIN_INFO; beginInfo.flags = VK_COMMAND_BUFFER_USAGE_ONE_TIME_SUBMIT_BIT; - vkResetCommandBuffer(objs.cbuffers[2], 0); - vkBeginCommandBuffer(objs.cbuffers[2], &beginInfo); - vkCmdCopyBuffer2(objs.cbuffers[2], ©Info); - vkEndCommandBuffer(objs.cbuffers[2]); + vkResetCommandBuffer(objs.cbuffers_graphics.at(2), 0); + vkBeginCommandBuffer(objs.cbuffers_graphics.at(2), &beginInfo); + vkCmdCopyBuffer2(objs.cbuffers_graphics.at(2), ©Info); + vkEndCommandBuffer(objs.cbuffers_graphics.at(2)); VkSubmitInfo submitinfo{}; submitinfo.sType = VK_STRUCTURE_TYPE_SUBMIT_INFO; submitinfo.commandBufferCount = 1; - submitinfo.pCommandBuffers = &objs.cbuffers.at(2); + submitinfo.pCommandBuffers = &objs.cbuffers_graphics.at(2); if (vkWaitForFences(objs.vkdevice.device, 1, &objs.renderfence, VK_TRUE, UINT64_MAX) != VK_SUCCESS) { return false; } @@ -366,7 +366,7 @@ static inline bool createeverything(vkobjs &objs) { VK_SUCCESS) { return false; } - + vkDestroyShaderModule(objs.vkdevice.device, c, VK_NULL_HANDLE); createSyncObjects(objs); @@ -379,18 +379,18 @@ static inline bool drawcomp(vkobjs &objs) { vkResetFences(objs.vkdevice.device,1,&computeInFlightFences.at(0)); - if (vkResetCommandBuffer(objs.cbuffers[3], 0) != VK_SUCCESS) + if (vkResetCommandBuffer(objs.cbuffers_compute.at(0), 0) != VK_SUCCESS) return false; VkCommandBufferBeginInfo cmdbgninfo{}; cmdbgninfo.sType = VK_STRUCTURE_TYPE_COMMAND_BUFFER_BEGIN_INFO; - if (vkBeginCommandBuffer(objs.cbuffers[3], &cmdbgninfo) != VK_SUCCESS) + if (vkBeginCommandBuffer(objs.cbuffers_compute.at(0), &cmdbgninfo) != VK_SUCCESS) return false; - vkCmdBindPipeline(objs.cbuffers[3], VK_PIPELINE_BIND_POINT_COMPUTE, cpline); + vkCmdBindPipeline(objs.cbuffers_compute.at(0), VK_PIPELINE_BIND_POINT_COMPUTE, cpline); - vkCmdBindDescriptorSets(objs.cbuffers[3],VK_PIPELINE_BIND_POINT_COMPUTE,cplayout,0,1,&cdset,0,VK_NULL_HANDLE); + vkCmdBindDescriptorSets(objs.cbuffers_compute.at(0),VK_PIPELINE_BIND_POINT_COMPUTE,cplayout,0,1,&cdset,0,VK_NULL_HANDLE); // VkBindDescriptorSetsInfo dsetinfo{}; // dsetinfo.sType = VK_STRUCTURE_TYPE_BIND_DESCRIPTOR_SETS_INFO; // dsetinfo.layout = cplayout; @@ -400,18 +400,18 @@ static inline bool drawcomp(vkobjs &objs) { // dsetinfo.pDynamicOffsets = VK_NULL_HANDLE; // dsetinfo.pNext = VK_NULL_HANDLE; // dsetinfo.stageFlags = ; - // dsetinfo.pDescriptorSets = &cdset; - // vkCmdBindDescriptorSets2(objs.cbuffers[2], &dsetinfo); + // dsetinfo.pDescriptorSets = &cdset; + // vkCmdBindDescriptorSets2(objs.cbuffers_graphics.at(2), &dsetinfo); - vkCmdDispatch(objs.cbuffers[3], Ps.size() / 256, 1, 1); + vkCmdDispatch(objs.cbuffers_compute.at(0), Ps.size() / 256, 1, 1); - if (vkEndCommandBuffer(objs.cbuffers[3]) != VK_SUCCESS) + if (vkEndCommandBuffer(objs.cbuffers_compute.at(0)) != VK_SUCCESS) return false; VkSubmitInfo submitinfo{}; submitinfo.sType = VK_STRUCTURE_TYPE_SUBMIT_INFO; submitinfo.commandBufferCount = 1; - submitinfo.pCommandBuffers = &objs.cbuffers.at(3); + submitinfo.pCommandBuffers = &objs.cbuffers_compute.at(0); submitinfo.signalSemaphoreCount = 1; submitinfo.pSignalSemaphores = computeFinishedSemaphores.data(); diff --git a/include/vk/commandbuffer.hpp b/include/vk/commandbuffer.hpp new file mode 100644 index 0000000..efd0a9f --- /dev/null +++ b/include/vk/commandbuffer.hpp @@ -0,0 +1,24 @@ +#pragma once +#include "vkobjs.hpp" +#include +#include +namespace commandbuffer { + +static inline bool create(vkobjs &rdata, VkCommandPool &vkpool,const std::span &cbuffs) { + VkCommandBufferAllocateInfo bufferallocinfo{ + .sType = VK_STRUCTURE_TYPE_COMMAND_BUFFER_ALLOCATE_INFO, + .commandPool = vkpool, + .level = VK_COMMAND_BUFFER_LEVEL_PRIMARY, //not sure + .commandBufferCount = cbuffs.size() + }; + if (vkAllocateCommandBuffers(rdata.vkdevice.device, &bufferallocinfo, cbuffs.data()) != VK_SUCCESS) { + return false; + } + return true; +} + +static inline void destroy(vkobjs &rdata, VkCommandPool &vkpool,const std::span &cbuffs) { + vkFreeCommandBuffers(rdata.vkdevice.device, vkpool, cbuffs.size(), cbuffs.data()); +} + +}; \ No newline at end of file diff --git a/include/vk/commandpool.hpp b/include/vk/commandpool.hpp new file mode 100644 index 0000000..7408de6 --- /dev/null +++ b/include/vk/commandpool.hpp @@ -0,0 +1,29 @@ +#pragma once +#include "vkobjs.hpp" +#include +#include + +namespace commandpool { + +static inline bool createsametype(vkobjs &rdata,const std::span &vkpools,const vkb::QueueType& qtype) { + for(auto& x:vkpools) { + VkCommandPoolCreateInfo poolcreateinfo{ + .sType = VK_STRUCTURE_TYPE_COMMAND_POOL_CREATE_INFO, + .flags = VK_COMMAND_POOL_CREATE_RESET_COMMAND_BUFFER_BIT, + .queueFamilyIndex = rdata.vkdevice.get_queue_index(qtype).value() + }; + + if (vkCreateCommandPool(rdata.vkdevice.device, &poolcreateinfo, nullptr, &x) != VK_SUCCESS) { + return false; + } + } + + return true; +} +static inline void destroy(vkobjs &rdata,const std::span &vkpools) { + for(auto& x:vkpools) { + vkDestroyCommandPool(rdata.vkdevice.device, x, nullptr); + } +} + +}; \ No newline at end of file diff --git a/include/vkobjs.hpp b/include/vkobjs.hpp index b4bf94e..de1e9fc 100644 --- a/include/vkobjs.hpp +++ b/include/vkobjs.hpp @@ -8,6 +8,7 @@ #include #include #include +#include @@ -88,7 +89,7 @@ struct vkobjs { inline static const std::shared_ptr mtx2{std::make_shared()}; SDL_Window *wind = nullptr; - + const SDL_DisplayMode *rdmode; bool fullscreen{false}; int width{0}; @@ -150,8 +151,10 @@ struct vkobjs { VkRenderPass rdrenderpass = VK_NULL_HANDLE; - std::vector cpools = {VK_NULL_HANDLE, VK_NULL_HANDLE, VK_NULL_HANDLE, VK_NULL_HANDLE}; - std::vector cbuffers = {VK_NULL_HANDLE, VK_NULL_HANDLE, VK_NULL_HANDLE, VK_NULL_HANDLE}; + std::array cpools_graphics = {VK_NULL_HANDLE, VK_NULL_HANDLE, VK_NULL_HANDLE}; + std::array cpools_compute = {VK_NULL_HANDLE}; + std::array cbuffers_graphics = {VK_NULL_HANDLE, VK_NULL_HANDLE, VK_NULL_HANDLE}; + std::array cbuffers_compute = {VK_NULL_HANDLE}; VkSemaphore presentsemaphore = VK_NULL_HANDLE; VkSemaphore rendersemaphore = VK_NULL_HANDLE; @@ -167,23 +170,23 @@ struct vkgltfobjs { std::vector texs{}; texdatapls texpls{}; }; -namespace rpool{ - static inline bool create(const std::vector& pools,const VkDevice& dev,VkDescriptorPool* dpool){ - VkDescriptorPoolCreateInfo descriptorPool{}; - descriptorPool.sType = VK_STRUCTURE_TYPE_DESCRIPTOR_POOL_CREATE_INFO; - descriptorPool.poolSizeCount = pools.size(); - descriptorPool.pPoolSizes = pools.data(); - descriptorPool.maxSets = 1024; //not sure - - return vkCreateDescriptorPool(dev, &descriptorPool, nullptr, dpool) == VK_SUCCESS; - } - static inline void destroy(const VkDevice& dev,VkDescriptorPool dpool){ - vkDestroyDescriptorPool(dev, dpool, nullptr); - } +namespace rpool { +static inline bool create(const std::vector& pools,const VkDevice& dev,VkDescriptorPool* dpool) { + VkDescriptorPoolCreateInfo descriptorPool{}; + descriptorPool.sType = VK_STRUCTURE_TYPE_DESCRIPTOR_POOL_CREATE_INFO; + descriptorPool.poolSizeCount = pools.size(); + descriptorPool.pPoolSizes = pools.data(); + descriptorPool.maxSets = 1024; //not sure + + return vkCreateDescriptorPool(dev, &descriptorPool, nullptr, dpool) == VK_SUCCESS; +} +static inline void destroy(const VkDevice& dev,VkDescriptorPool dpool) { + vkDestroyDescriptorPool(dev, dpool, nullptr); +} }; -namespace rbuffer{ - static inline bool create(const VkDevice& dev,VmaAllocator alloc,std::vector binfos,std::vector buffs){ +namespace rbuffer { +static inline bool create(const VkDevice& dev,VmaAllocator alloc,std::vector binfos,std::vector buffs) { // for() return true; - } +} }; \ No newline at end of file diff --git a/src/auxiliary/ui.cpp b/src/auxiliary/ui.cpp index 0e6e3f3..b2d15af 100644 --- a/src/auxiliary/ui.cpp +++ b/src/auxiliary/ui.cpp @@ -10,7 +10,7 @@ #include #include -#include "commandbuffer.hpp" +#include "vk/commandbuffer.hpp" #include "ui.hpp" bool ui::init(vkobjs &renderData) { @@ -64,13 +64,13 @@ bool ui::init(vkobjs &renderData) { ImGui_ImplVulkan_Init(&imguiIinitInfo); - VkCommandBuffer imguiCommandBuffer; + std::array imguiCommandBuffer; - if (!commandbuffer::init(renderData, renderData.cpools[3], imguiCommandBuffer)) { + if (!commandbuffer::create(renderData, renderData.cpools_graphics.at(2), imguiCommandBuffer)) { return false; } - if (vkResetCommandBuffer(imguiCommandBuffer, 0) != VK_SUCCESS) { + if (vkResetCommandBuffer(imguiCommandBuffer.at(0), 0) != VK_SUCCESS) { return false; } @@ -78,7 +78,7 @@ bool ui::init(vkobjs &renderData) { cmdBeginInfo.sType = VK_STRUCTURE_TYPE_COMMAND_BUFFER_BEGIN_INFO; cmdBeginInfo.flags = VK_COMMAND_BUFFER_USAGE_ONE_TIME_SUBMIT_BIT; - if (vkBeginCommandBuffer(imguiCommandBuffer, &cmdBeginInfo) != VK_SUCCESS) { + if (vkBeginCommandBuffer(imguiCommandBuffer.at(0), &cmdBeginInfo) != VK_SUCCESS) { return false; } @@ -86,7 +86,7 @@ bool ui::init(vkobjs &renderData) { ImGui_ImplVulkan_CreateFontsTexture(); renderData.mtx2->unlock(); - if (vkEndCommandBuffer(imguiCommandBuffer) != VK_SUCCESS) { + if (vkEndCommandBuffer(imguiCommandBuffer.at(0)) != VK_SUCCESS) { return false; } @@ -98,7 +98,7 @@ bool ui::init(vkobjs &renderData) { submitInfo.signalSemaphoreCount = 0; submitInfo.pSignalSemaphores = nullptr; submitInfo.commandBufferCount = 1; - submitInfo.pCommandBuffers = &imguiCommandBuffer; + submitInfo.pCommandBuffers = imguiCommandBuffer.data(); VkFence imguiBufferFence; @@ -125,7 +125,7 @@ bool ui::init(vkobjs &renderData) { } vkDestroyFence(renderData.vkdevice.device, imguiBufferFence, nullptr); - commandbuffer::cleanup(renderData, renderData.cpools[3], imguiCommandBuffer); + commandbuffer::destroy(renderData, renderData.cpools_graphics.at(2), imguiCommandBuffer); ImGui::StyleColorsDark(); diff --git a/src/core/vkrenderer.cpp b/src/core/vkrenderer.cpp index d112484..4e24bf1 100644 --- a/src/core/vkrenderer.cpp +++ b/src/core/vkrenderer.cpp @@ -18,8 +18,8 @@ #include #include -#include "commandbuffer.hpp" -#include "commandpool.hpp" +#include "vk/commandbuffer.hpp" +#include "vk/commandpool.hpp" #include "framebuffer.hpp" #include "renderpass.hpp" #include "vksyncobjects.hpp" @@ -115,7 +115,7 @@ bool vkrenderer::deviceinit() { auto instret = instbuild.use_default_debug_messenger().request_validation_layers().require_api_version(1, 3).build(); - if(!instret){ + if(!instret) { std::cout << instret.full_error().type << std::endl; std::cout << instret.full_error().vk_result << std::endl; return false; @@ -288,24 +288,16 @@ bool vkrenderer::createframebuffer() { return true; } bool vkrenderer::createcommandpool() { - if (!commandpool::init(mvkobjs, mvkobjs.cpools[0])) + if (!commandpool::createsametype(mvkobjs, mvkobjs.cpools_graphics,vkb::QueueType::graphics)) return false; - if (!commandpool::initcompute(mvkobjs, mvkobjs.cpools[1])) - return false; - if (!commandpool::init(mvkobjs, mvkobjs.cpools[2])) - return false; - if (!commandpool::init(mvkobjs, mvkobjs.cpools[3])) + if (!commandpool::createsametype(mvkobjs, mvkobjs.cpools_compute,vkb::QueueType::graphics)) return false; return true; } bool vkrenderer::createcommandbuffer() { - if (!commandbuffer::init(mvkobjs, mvkobjs.cpools[0], mvkobjs.cbuffers[0])) - return false; - if (!commandbuffer::init(mvkobjs, mvkobjs.cpools[0], mvkobjs.cbuffers[1])) + if (!commandbuffer::create(mvkobjs, mvkobjs.cpools_graphics.at(0), mvkobjs.cbuffers_graphics)) return false; - if (!commandbuffer::init(mvkobjs, mvkobjs.cpools[0], mvkobjs.cbuffers[2])) - return false; - if (!commandbuffer::init(mvkobjs, mvkobjs.cpools[1], mvkobjs.cbuffers[3])) + if (!commandbuffer::create(mvkobjs, mvkobjs.cpools_compute.at(0), mvkobjs.cbuffers_compute)) return false; return true; } @@ -330,14 +322,10 @@ void vkrenderer::cleanup() { mui.cleanup(mvkobjs); vksyncobjects::cleanup(mvkobjs); - commandbuffer::cleanup(mvkobjs, mvkobjs.cpools[0], mvkobjs.cbuffers[0]); - commandbuffer::cleanup(mvkobjs, mvkobjs.cpools[0], mvkobjs.cbuffers[1]); - commandbuffer::cleanup(mvkobjs, mvkobjs.cpools[0], mvkobjs.cbuffers[2]); - commandbuffer::cleanup(mvkobjs, mvkobjs.cpools[1], mvkobjs.cbuffers[3]); - commandpool::cleanup(mvkobjs, mvkobjs.cpools[0]); - commandpool::cleanup(mvkobjs, mvkobjs.cpools[1]); - commandpool::cleanup(mvkobjs, mvkobjs.cpools[2]); - commandpool::cleanup(mvkobjs, mvkobjs.cpools[3]); + commandbuffer::destroy(mvkobjs, mvkobjs.cpools_graphics.at(0), mvkobjs.cbuffers_graphics); + commandbuffer::destroy(mvkobjs, mvkobjs.cpools_compute.at(0), mvkobjs.cbuffers_compute); + commandpool::destroy(mvkobjs, mvkobjs.cpools_graphics); + commandpool::destroy(mvkobjs, mvkobjs.cpools_compute); framebuffer::cleanup(mvkobjs); for (const auto &i : mplayer) @@ -385,23 +373,23 @@ bool vkrenderer::uploadfordraw() { VkResult res = vkAcquireNextImageKHR(mvkobjs.vkdevice.device, mvkobjs.schain.swapchain, UINT64_MAX, mvkobjs.presentsemaphore, VK_NULL_HANDLE, &imgidx); - if (vkResetCommandBuffer(mvkobjs.cbuffers[0], 0) != VK_SUCCESS) + if (vkResetCommandBuffer(mvkobjs.cbuffers_graphics.at(0), 0) != VK_SUCCESS) return false; VkCommandBufferBeginInfo cmdbgninfo{}; cmdbgninfo.sType = VK_STRUCTURE_TYPE_COMMAND_BUFFER_BEGIN_INFO; cmdbgninfo.flags = VK_COMMAND_BUFFER_USAGE_ONE_TIME_SUBMIT_BIT; - if (vkBeginCommandBuffer(mvkobjs.cbuffers[0], &cmdbgninfo) != VK_SUCCESS) + if (vkBeginCommandBuffer(mvkobjs.cbuffers_graphics.at(0), &cmdbgninfo) != VK_SUCCESS) return false; manimupdatetimer.start(); for (const auto &i : mplayer) - i->uploadvboebo(mvkobjs, mvkobjs.cbuffers[0]); + i->uploadvboebo(mvkobjs, mvkobjs.cbuffers_graphics.at(0)); mvkobjs.uploadubossbotime = manimupdatetimer.stop(); - if (vkEndCommandBuffer(mvkobjs.cbuffers[0]) != VK_SUCCESS) + if (vkEndCommandBuffer(mvkobjs.cbuffers_graphics.at(0)) != VK_SUCCESS) return false; VkSubmitInfo submitinfo{}; @@ -417,7 +405,7 @@ bool vkrenderer::uploadfordraw() { submitinfo.pSignalSemaphores = &mvkobjs.rendersemaphore; submitinfo.commandBufferCount = 1; - submitinfo.pCommandBuffers = &mvkobjs.cbuffers.at(0); + submitinfo.pCommandBuffers = &mvkobjs.cbuffers_graphics.at(0); VkSemaphoreWaitInfo swinfo{}; swinfo.sType = VK_STRUCTURE_TYPE_SEMAPHORE_WAIT_INFO; @@ -470,22 +458,22 @@ bool vkrenderer::uploadfordraw(std::shared_ptr &x) { VkResult res = vkAcquireNextImageKHR(mvkobjs.vkdevice.device, mvkobjs.schain.swapchain, UINT64_MAX, mvkobjs.presentsemaphore, VK_NULL_HANDLE, &imgidx); - if (vkResetCommandBuffer(mvkobjs.cbuffers[0], 0) != VK_SUCCESS) + if (vkResetCommandBuffer(mvkobjs.cbuffers_graphics.at(0), 0) != VK_SUCCESS) return false; VkCommandBufferBeginInfo cmdbgninfo{}; cmdbgninfo.sType = VK_STRUCTURE_TYPE_COMMAND_BUFFER_BEGIN_INFO; cmdbgninfo.flags = VK_COMMAND_BUFFER_USAGE_ONE_TIME_SUBMIT_BIT; - if (vkBeginCommandBuffer(mvkobjs.cbuffers[0], &cmdbgninfo) != VK_SUCCESS) + if (vkBeginCommandBuffer(mvkobjs.cbuffers_graphics.at(0), &cmdbgninfo) != VK_SUCCESS) return false; manimupdatetimer.start(); - x->uploadvboebo(mvkobjs, mvkobjs.cbuffers[0]); + x->uploadvboebo(mvkobjs, mvkobjs.cbuffers_graphics.at(0)); mvkobjs.uploadubossbotime = manimupdatetimer.stop(); - if (vkEndCommandBuffer(mvkobjs.cbuffers[0]) != VK_SUCCESS) + if (vkEndCommandBuffer(mvkobjs.cbuffers_graphics.at(0)) != VK_SUCCESS) return false; VkSubmitInfo submitinfo{}; @@ -501,7 +489,7 @@ bool vkrenderer::uploadfordraw(std::shared_ptr &x) { submitinfo.pSignalSemaphores = &mvkobjs.rendersemaphore; submitinfo.commandBufferCount = 1; - submitinfo.pCommandBuffers = &mvkobjs.cbuffers.at(0); + submitinfo.pCommandBuffers = &mvkobjs.cbuffers_graphics.at(0); // VkSemaphoreWaitInfo swinfo{}; // swinfo.sType = VK_STRUCTURE_TYPE_SEMAPHORE_WAIT_INFO; @@ -879,7 +867,7 @@ bool vkrenderer::draw() { scissor.offset = {0, 0}; scissor.extent = mvkobjs.schain.extent; - if (vkResetCommandBuffer(mvkobjs.cbuffers[0], 0) != VK_SUCCESS) + if (vkResetCommandBuffer(mvkobjs.cbuffers_graphics.at(0), 0) != VK_SUCCESS) return false; sdlevent(mvkobjs.e); @@ -888,18 +876,18 @@ bool vkrenderer::draw() { cmdbgninfo.sType = VK_STRUCTURE_TYPE_COMMAND_BUFFER_BEGIN_INFO; cmdbgninfo.flags = VK_COMMAND_BUFFER_USAGE_ONE_TIME_SUBMIT_BIT; - if (vkBeginCommandBuffer(mvkobjs.cbuffers[0], &cmdbgninfo) != VK_SUCCESS) + if (vkBeginCommandBuffer(mvkobjs.cbuffers_graphics.at(0), &cmdbgninfo) != VK_SUCCESS) return false; - vkCmdBeginRenderPass(mvkobjs.cbuffers[0], &rpinfo, VK_SUBPASS_CONTENTS_INLINE); + vkCmdBeginRenderPass(mvkobjs.cbuffers_graphics.at(0), &rpinfo, VK_SUBPASS_CONTENTS_INLINE); - vkCmdSetViewport(mvkobjs.cbuffers[0], 0, 1, &viewport); - vkCmdSetScissor(mvkobjs.cbuffers[0], 0, 1, &scissor); + vkCmdSetViewport(mvkobjs.cbuffers_graphics.at(0), 0, 1, &viewport); + vkCmdSetScissor(mvkobjs.cbuffers_graphics.at(0), 0, 1, &scissor); VkDeviceSize coffsets{0}; - vkCmdBindPipeline(mvkobjs.cbuffers[0], VK_PIPELINE_BIND_POINT_GRAPHICS, particle::gpline); - vkCmdBindVertexBuffers(mvkobjs.cbuffers[0],0,1,&particle::ssbobuffsnallocs.at(0).first,&coffsets); - vkCmdDraw(mvkobjs.cbuffers[0],8192,1,0,0); + vkCmdBindPipeline(mvkobjs.cbuffers_graphics.at(0), VK_PIPELINE_BIND_POINT_GRAPHICS, particle::gpline); + vkCmdBindVertexBuffers(mvkobjs.cbuffers_graphics.at(0),0,1,&particle::ssbobuffsnallocs.at(0).first,&coffsets); + vkCmdDraw(mvkobjs.cbuffers_graphics.at(0),8192,1,0,0); for (const auto &i : mplayer) @@ -910,14 +898,14 @@ bool vkrenderer::draw() { mui.createdbgframe(mvkobjs, selectiondata); - - mui.render(mvkobjs, mvkobjs.cbuffers[0]); - vkCmdEndRenderPass(mvkobjs.cbuffers[0]); + mui.render(mvkobjs, mvkobjs.cbuffers_graphics.at(0)); + + vkCmdEndRenderPass(mvkobjs.cbuffers_graphics.at(0)); // animmtx.lock(); // updatemtx.lock(); @@ -929,7 +917,7 @@ bool vkrenderer::draw() { mvkobjs.uploadubossbotime = muploadubossbotimer.stop(); - if (vkEndCommandBuffer(mvkobjs.cbuffers[0]) != VK_SUCCESS) + if (vkEndCommandBuffer(mvkobjs.cbuffers_graphics.at(0)) != VK_SUCCESS) return false; movecam(); @@ -947,7 +935,7 @@ bool vkrenderer::draw() { submitinfo.pSignalSemaphores = &mvkobjs.rendersemaphore; submitinfo.commandBufferCount = 1; - submitinfo.pCommandBuffers = &mvkobjs.cbuffers.at(0); + submitinfo.pCommandBuffers = &mvkobjs.cbuffers_graphics.at(0); mvkobjs.mtx2->lock(); if (vkQueueSubmit(mvkobjs.graphicsQ, 1, &submitinfo, mvkobjs.renderfence) != VK_SUCCESS) { @@ -1032,27 +1020,27 @@ bool vkrenderer::drawloading() { scissor.offset = {0, 0}; scissor.extent = mvkobjs.schain.extent; - if (vkResetCommandBuffer(mvkobjs.cbuffers[1], 0) != VK_SUCCESS) + if (vkResetCommandBuffer(mvkobjs.cbuffers_compute.at(0), 0) != VK_SUCCESS) return false; VkCommandBufferBeginInfo cmdbgninfo{}; cmdbgninfo.sType = VK_STRUCTURE_TYPE_COMMAND_BUFFER_BEGIN_INFO; cmdbgninfo.flags = VK_COMMAND_BUFFER_USAGE_ONE_TIME_SUBMIT_BIT; - if (vkBeginCommandBuffer(mvkobjs.cbuffers[1], &cmdbgninfo) != VK_SUCCESS) + if (vkBeginCommandBuffer(mvkobjs.cbuffers_compute.at(0), &cmdbgninfo) != VK_SUCCESS) return false; - vkCmdBeginRenderPass(mvkobjs.cbuffers[1], &rpinfo, VK_SUBPASS_CONTENTS_INLINE); + vkCmdBeginRenderPass(mvkobjs.cbuffers_compute.at(0), &rpinfo, VK_SUBPASS_CONTENTS_INLINE); - vkCmdSetViewport(mvkobjs.cbuffers[1], 0, 1, &viewport); - vkCmdSetScissor(mvkobjs.cbuffers[1], 0, 1, &scissor); + vkCmdSetViewport(mvkobjs.cbuffers_compute.at(0), 0, 1, &viewport); + vkCmdSetScissor(mvkobjs.cbuffers_compute.at(0), 0, 1, &scissor); rdscene = mui.createloadingscreen(mvkobjs); - mui.render(mvkobjs, mvkobjs.cbuffers[1]); + mui.render(mvkobjs, mvkobjs.cbuffers_compute.at(0)); - vkCmdEndRenderPass(mvkobjs.cbuffers[1]); + vkCmdEndRenderPass(mvkobjs.cbuffers_compute.at(0)); - if (vkEndCommandBuffer(mvkobjs.cbuffers[1]) != VK_SUCCESS) + if (vkEndCommandBuffer(mvkobjs.cbuffers_compute.at(0)) != VK_SUCCESS) return false; VkSubmitInfo submitinfo{}; @@ -1068,7 +1056,7 @@ bool vkrenderer::drawloading() { submitinfo.pSignalSemaphores = &mvkobjs.rendersemaphore; submitinfo.commandBufferCount = 1; - submitinfo.pCommandBuffers = &mvkobjs.cbuffers[1]; + submitinfo.pCommandBuffers = &mvkobjs.cbuffers_compute.at(0); mvkobjs.mtx2->lock(); if (vkQueueSubmit(mvkobjs.graphicsQ, 1, &submitinfo, mvkobjs.renderfence) != VK_SUCCESS) { @@ -1149,24 +1137,24 @@ bool vkrenderer::drawblank() { scissor.offset = {0, 0}; scissor.extent = mvkobjs.schain.extent; - if (vkResetCommandBuffer(mvkobjs.cbuffers[0], 0) != VK_SUCCESS) + if (vkResetCommandBuffer(mvkobjs.cbuffers_graphics.at(0), 0) != VK_SUCCESS) return false; VkCommandBufferBeginInfo cmdbgninfo{}; cmdbgninfo.sType = VK_STRUCTURE_TYPE_COMMAND_BUFFER_BEGIN_INFO; cmdbgninfo.flags = VK_COMMAND_BUFFER_USAGE_ONE_TIME_SUBMIT_BIT; - if (vkBeginCommandBuffer(mvkobjs.cbuffers[0], &cmdbgninfo) != VK_SUCCESS) + if (vkBeginCommandBuffer(mvkobjs.cbuffers_graphics.at(0), &cmdbgninfo) != VK_SUCCESS) return false; - vkCmdBeginRenderPass(mvkobjs.cbuffers[0], &rpinfo, VK_SUBPASS_CONTENTS_INLINE); + vkCmdBeginRenderPass(mvkobjs.cbuffers_graphics.at(0), &rpinfo, VK_SUBPASS_CONTENTS_INLINE); - vkCmdSetViewport(mvkobjs.cbuffers[0], 0, 1, &viewport); - vkCmdSetScissor(mvkobjs.cbuffers[0], 0, 1, &scissor); + vkCmdSetViewport(mvkobjs.cbuffers_graphics.at(0), 0, 1, &viewport); + vkCmdSetScissor(mvkobjs.cbuffers_graphics.at(0), 0, 1, &scissor); - vkCmdEndRenderPass(mvkobjs.cbuffers[0]); + vkCmdEndRenderPass(mvkobjs.cbuffers_graphics.at(0)); - if (vkEndCommandBuffer(mvkobjs.cbuffers[0]) != VK_SUCCESS) + if (vkEndCommandBuffer(mvkobjs.cbuffers_graphics.at(0)) != VK_SUCCESS) return false; VkSubmitInfo submitinfo{}; @@ -1182,7 +1170,7 @@ bool vkrenderer::drawblank() { submitinfo.pSignalSemaphores = &mvkobjs.rendersemaphore; submitinfo.commandBufferCount = 1; - submitinfo.pCommandBuffers = &mvkobjs.cbuffers[0]; + submitinfo.pCommandBuffers = &mvkobjs.cbuffers_graphics.at(0); mvkobjs.mtx2->lock(); if (vkQueueSubmit(mvkobjs.graphicsQ, 1, &submitinfo, mvkobjs.renderfence) != VK_SUCCESS) { diff --git a/src/glue/vktexture.cpp b/src/glue/vktexture.cpp index 71b8241..fc9e020 100644 --- a/src/glue/vktexture.cpp +++ b/src/glue/vktexture.cpp @@ -1,6 +1,6 @@ #define STB_IMAGE_IMPLEMENTATION #include "vktexture.hpp" -#include "commandbuffer.hpp" +#include "vk/commandbuffer.hpp" #include "logger.hpp" #include #include @@ -107,13 +107,13 @@ bool vktexture::loadtexturefile(vkobjs &rdata, texdata &texdata, texdatapls &tex stagingbuffershaderbarrier.srcAccessMask = VK_ACCESS_TRANSFER_WRITE_BIT; stagingbuffershaderbarrier.dstAccessMask = VK_ACCESS_SHADER_READ_BIT; - VkCommandBuffer stagingcommandbuffer; - if (!commandbuffer::init(rdata, rdata.cpools[2], stagingcommandbuffer)) { + std::array stagingcommandbuffer; + if (!commandbuffer::create(rdata, rdata.cpools_graphics.at(1), stagingcommandbuffer)) { logger::log(0, "crashed in texture at commandbuffer::init"); return false; } - if (vkResetCommandBuffer(stagingcommandbuffer, 0) != VK_SUCCESS) { + if (vkResetCommandBuffer(stagingcommandbuffer.at(0), 0) != VK_SUCCESS) { logger::log(0, "crashed in texture at vkResetCommandBuffer"); return false; } @@ -122,19 +122,19 @@ bool vktexture::loadtexturefile(vkobjs &rdata, texdata &texdata, texdatapls &tex cmdbegininfo.sType = VK_STRUCTURE_TYPE_COMMAND_BUFFER_BEGIN_INFO; cmdbegininfo.flags = VK_COMMAND_BUFFER_USAGE_ONE_TIME_SUBMIT_BIT; - if (vkBeginCommandBuffer(stagingcommandbuffer, &cmdbegininfo) != VK_SUCCESS) { + if (vkBeginCommandBuffer(stagingcommandbuffer.at(0), &cmdbegininfo) != VK_SUCCESS) { logger::log(0, "crashed in texture at vkBeginCommandBuffer"); return false; } - vkCmdPipelineBarrier(stagingcommandbuffer, VK_PIPELINE_STAGE_TOP_OF_PIPE_BIT, VK_PIPELINE_STAGE_TRANSFER_BIT, 0, 0, + vkCmdPipelineBarrier(stagingcommandbuffer.at(0), VK_PIPELINE_STAGE_TOP_OF_PIPE_BIT, VK_PIPELINE_STAGE_TRANSFER_BIT, 0, 0, nullptr, 0, nullptr, 1, &stagingbuffertransferbarrier); - vkCmdCopyBufferToImage(stagingcommandbuffer, stagingbuffer, texdata.img, VK_IMAGE_LAYOUT_TRANSFER_DST_OPTIMAL, 1, + vkCmdCopyBufferToImage(stagingcommandbuffer.at(0), stagingbuffer, texdata.img, VK_IMAGE_LAYOUT_TRANSFER_DST_OPTIMAL, 1, &stagingbuffercopy); - vkCmdPipelineBarrier(stagingcommandbuffer, VK_PIPELINE_STAGE_TRANSFER_BIT, VK_PIPELINE_STAGE_FRAGMENT_SHADER_BIT, 0, + vkCmdPipelineBarrier(stagingcommandbuffer.at(0), VK_PIPELINE_STAGE_TRANSFER_BIT, VK_PIPELINE_STAGE_FRAGMENT_SHADER_BIT, 0, 0, nullptr, 0, nullptr, 1, &stagingbuffershaderbarrier); - if (vkEndCommandBuffer(stagingcommandbuffer) != VK_SUCCESS) { + if (vkEndCommandBuffer(stagingcommandbuffer.at(0)) != VK_SUCCESS) { logger::log(0, "crashed in texture at vkEndCommandBuffer"); return false; } @@ -147,7 +147,7 @@ bool vktexture::loadtexturefile(vkobjs &rdata, texdata &texdata, texdatapls &tex submitinfo.signalSemaphoreCount = 0; submitinfo.pSignalSemaphores = nullptr; submitinfo.commandBufferCount = 1; - submitinfo.pCommandBuffers = &stagingcommandbuffer; + submitinfo.pCommandBuffers = stagingcommandbuffer.data(); VkFence stagingbufferfence; @@ -175,7 +175,7 @@ bool vktexture::loadtexturefile(vkobjs &rdata, texdata &texdata, texdatapls &tex } vkDestroyFence(rdata.vkdevice.device, stagingbufferfence, nullptr); - commandbuffer::cleanup(rdata, rdata.cpools[2], stagingcommandbuffer); + commandbuffer::destroy(rdata, rdata.cpools_graphics.at(1), stagingcommandbuffer); vmaDestroyBuffer(rdata.alloc, stagingbuffer, stagingbufferalloc); VkImageViewCreateInfo texviewinfo{}; @@ -397,13 +397,13 @@ bool vktexture::loadtexture(vkobjs &rdata, std::vector &texdata, fastgl stagingbuffershaderbarrier.srcAccessMask = VK_ACCESS_TRANSFER_WRITE_BIT; stagingbuffershaderbarrier.dstAccessMask = VK_ACCESS_SHADER_READ_BIT; - VkCommandBuffer stagingcommandbuffer; - if (!commandbuffer::init(rdata, rdata.cpools[2], stagingcommandbuffer)) { + std::array stagingcommandbuffer; + if (!commandbuffer::create(rdata, rdata.cpools_graphics.at(1), stagingcommandbuffer)) { logger::log(0, "crashed in texture at commandbuffer::init"); return false; } - if (vkResetCommandBuffer(stagingcommandbuffer, 0) != VK_SUCCESS) { + if (vkResetCommandBuffer(stagingcommandbuffer.at(0), 0) != VK_SUCCESS) { logger::log(0, "crashed in texture at vkResetCommandBuffer"); return false; } @@ -412,19 +412,19 @@ bool vktexture::loadtexture(vkobjs &rdata, std::vector &texdata, fastgl cmdbegininfo.sType = VK_STRUCTURE_TYPE_COMMAND_BUFFER_BEGIN_INFO; cmdbegininfo.flags = VK_COMMAND_BUFFER_USAGE_ONE_TIME_SUBMIT_BIT; - if (vkBeginCommandBuffer(stagingcommandbuffer, &cmdbegininfo) != VK_SUCCESS) { + if (vkBeginCommandBuffer(stagingcommandbuffer.at(0), &cmdbegininfo) != VK_SUCCESS) { logger::log(0, "crashed in texture at vkBeginCommandBuffer"); return false; } - vkCmdPipelineBarrier(stagingcommandbuffer, VK_PIPELINE_STAGE_TOP_OF_PIPE_BIT, VK_PIPELINE_STAGE_TRANSFER_BIT, 0, 0, + vkCmdPipelineBarrier(stagingcommandbuffer.at(0), VK_PIPELINE_STAGE_TOP_OF_PIPE_BIT, VK_PIPELINE_STAGE_TRANSFER_BIT, 0, 0, nullptr, 0, nullptr, 1, &stagingbuffertransferbarrier); - vkCmdCopyBufferToImage(stagingcommandbuffer, stagingbuffer, texdata[i].img, VK_IMAGE_LAYOUT_TRANSFER_DST_OPTIMAL, + vkCmdCopyBufferToImage(stagingcommandbuffer.at(0), stagingbuffer, texdata[i].img, VK_IMAGE_LAYOUT_TRANSFER_DST_OPTIMAL, 1, &stagingbuffercopy); - vkCmdPipelineBarrier(stagingcommandbuffer, VK_PIPELINE_STAGE_TRANSFER_BIT, VK_PIPELINE_STAGE_FRAGMENT_SHADER_BIT, 0, + vkCmdPipelineBarrier(stagingcommandbuffer.at(0), VK_PIPELINE_STAGE_TRANSFER_BIT, VK_PIPELINE_STAGE_FRAGMENT_SHADER_BIT, 0, 0, nullptr, 0, nullptr, 1, &stagingbuffershaderbarrier); - if (vkEndCommandBuffer(stagingcommandbuffer) != VK_SUCCESS) { + if (vkEndCommandBuffer(stagingcommandbuffer.at(0)) != VK_SUCCESS) { logger::log(0, "crashed in texture at vkEndCommandBuffer"); return false; } @@ -437,7 +437,7 @@ bool vktexture::loadtexture(vkobjs &rdata, std::vector &texdata, fastgl submitinfo.signalSemaphoreCount = 0; submitinfo.pSignalSemaphores = nullptr; submitinfo.commandBufferCount = 1; - submitinfo.pCommandBuffers = &stagingcommandbuffer; + submitinfo.pCommandBuffers = stagingcommandbuffer.data(); VkFence stagingbufferfence; @@ -468,7 +468,7 @@ bool vktexture::loadtexture(vkobjs &rdata, std::vector &texdata, fastgl } vkDestroyFence(rdata.vkdevice.device, stagingbufferfence, nullptr); - commandbuffer::cleanup(rdata, rdata.cpools[2], stagingcommandbuffer); + commandbuffer::destroy(rdata, rdata.cpools_graphics.at(1), stagingcommandbuffer); vmaDestroyBuffer(rdata.alloc, stagingbuffer, stagingbufferalloc); VkImageViewCreateInfo texviewinfo{}; diff --git a/src/model/genericmodel.cpp b/src/model/genericmodel.cpp index 099c4e6..27da469 100644 --- a/src/model/genericmodel.cpp +++ b/src/model/genericmodel.cpp @@ -323,15 +323,15 @@ void genericmodel::drawinstanced(vkobjs &objs, VkPipelineLayout &vkplayout, VkPi VkDeviceSize offset = 0; std::vector> pushes(mgltfobjs.vbos.size()); - vkCmdBindDescriptorSets(objs.cbuffers[0], VK_PIPELINE_BIND_POINT_GRAPHICS, vkplayout, 0, 1, + vkCmdBindDescriptorSets(objs.cbuffers_graphics.at(0), VK_PIPELINE_BIND_POINT_GRAPHICS, vkplayout, 0, 1, &mgltfobjs.texpls.dset, 0, nullptr); for (size_t i{0}; i < mgltfobjs.vbos.size(); i++) { pushes[i].reserve(mgltfobjs.vbos.at(i).size()); pushes[i].resize(mgltfobjs.vbos.at(i).size()); - meshjointtype[i] ? vkCmdBindPipeline(objs.cbuffers[0], VK_PIPELINE_BIND_POINT_GRAPHICS, vkplineuint) - : vkCmdBindPipeline(objs.cbuffers[0], VK_PIPELINE_BIND_POINT_GRAPHICS, vkpline); + meshjointtype[i] ? vkCmdBindPipeline(objs.cbuffers_graphics.at(0), VK_PIPELINE_BIND_POINT_GRAPHICS, vkplineuint) + : vkCmdBindPipeline(objs.cbuffers_graphics.at(0), VK_PIPELINE_BIND_POINT_GRAPHICS, vkpline); for (size_t j{0}; j < mgltfobjs.vbos.at(i).size(); j++) { pushes[i][j].stride = stride; @@ -348,16 +348,16 @@ void genericmodel::drawinstanced(vkobjs &objs, VkPipelineLayout &vkplayout, VkPi } pushes[i][j].t = static_cast(SDL_GetTicks()) / 1000.0f; - vkCmdPushConstants(objs.cbuffers[0], vkplayout, VK_SHADER_STAGE_VERTEX_BIT, 0, sizeof(vkpushconstants), + vkCmdPushConstants(objs.cbuffers_graphics.at(0), vkplayout, VK_SHADER_STAGE_VERTEX_BIT, 0, sizeof(vkpushconstants), &pushes.at(i).at(j)); // rework bindings for (size_t k{0}; k < mgltfobjs.vbos.at(i).at(j).size(); k++) { if (mgltfobjs.vbos.at(i).at(j).at(k).buffer != VK_NULL_HANDLE) - vkCmdBindVertexBuffers(objs.cbuffers[0], k, 1, &mgltfobjs.vbos.at(i).at(j).at(k).buffer, + vkCmdBindVertexBuffers(objs.cbuffers_graphics.at(0), k, 1, &mgltfobjs.vbos.at(i).at(j).at(k).buffer, &offset); } - vkCmdBindIndexBuffer(objs.cbuffers[0], mgltfobjs.ebos.at(i).at(j).buffer, 0, VK_INDEX_TYPE_UINT16); - vkCmdDrawIndexed(objs.cbuffers[0], static_cast(gettricount(i, j) * 3), instancecount, 0, 0, 0); + vkCmdBindIndexBuffer(objs.cbuffers_graphics.at(0), mgltfobjs.ebos.at(i).at(j).buffer, 0, VK_INDEX_TYPE_UINT16); + vkCmdDrawIndexed(objs.cbuffers_graphics.at(0), static_cast(gettricount(i, j) * 3), instancecount, 0, 0, 0); } } } diff --git a/src/playout/playoutgeneric.cpp b/src/playout/playoutgeneric.cpp index 6d2b1af..4f833e2 100644 --- a/src/playout/playoutgeneric.cpp +++ b/src/playout/playoutgeneric.cpp @@ -93,9 +93,9 @@ void playoutgeneric::uploadvboebo(vkobjs &objs, VkCommandBuffer &cbuffer) { } void playoutgeneric::uploadubossbo(vkobjs &objs, std::vector &cammats) { - vkCmdBindDescriptorSets(objs.cbuffers[0], VK_PIPELINE_BIND_POINT_GRAPHICS, rdgltfpipelinelayout, 1, 1, + vkCmdBindDescriptorSets(objs.cbuffers_graphics.at(0), VK_PIPELINE_BIND_POINT_GRAPHICS, rdgltfpipelinelayout, 1, 1, &rdperspviewmatrixubo[0].dset, 0, nullptr); - vkCmdBindDescriptorSets(objs.cbuffers[0], VK_PIPELINE_BIND_POINT_GRAPHICS, rdgltfpipelinelayout, 2, 1, + vkCmdBindDescriptorSets(objs.cbuffers_graphics.at(0), VK_PIPELINE_BIND_POINT_GRAPHICS, rdgltfpipelinelayout, 2, 1, &rdjointmatrixssbo.dset, 0, nullptr); ubo::upload(objs, rdperspviewmatrixubo, cammats); ssbo::upload(objs, rdjointmatrixssbo, jointmats); @@ -151,9 +151,9 @@ void playoutgeneric::draw(vkobjs &objs) { if (minstances[0]->getinstancesettings().msdrawmodel) { stride = minstances.at(0)->getjointmatrixsize(); - vkCmdBindDescriptorSets(objs.cbuffers[0], VK_PIPELINE_BIND_POINT_GRAPHICS, rdgltfpipelinelayout, 1, 1, + vkCmdBindDescriptorSets(objs.cbuffers_graphics.at(0), VK_PIPELINE_BIND_POINT_GRAPHICS, rdgltfpipelinelayout, 1, 1, &rdperspviewmatrixubo[0].dset, 0, nullptr); - vkCmdBindDescriptorSets(objs.cbuffers[0], VK_PIPELINE_BIND_POINT_GRAPHICS, rdgltfpipelinelayout, 2, 1, + vkCmdBindDescriptorSets(objs.cbuffers_graphics.at(0), VK_PIPELINE_BIND_POINT_GRAPHICS, rdgltfpipelinelayout, 2, 1, &rdjointmatrixssbo.dset, 0, nullptr); mgltf->drawinstanced(objs, rdgltfpipelinelayout, rdgltfgpupipeline, rdgltfgpupipelineuint, numinstancess, stride); diff --git a/src/subcore/vkcam.cpp b/src/subcore/vkcam.cpp index 0505601..436d12d 100644 --- a/src/subcore/vkcam.cpp +++ b/src/subcore/vkcam.cpp @@ -16,8 +16,8 @@ glm::mat4 vkcam::getview(vkobjs &mvkobjs) { mup = glm::normalize(glm::cross(mright, mforward)); mvkobjs.camwpos += mvkobjs.camfor * static_cast(mvkobjs.tickdiff) * mforward + - mvkobjs.camright * static_cast(mvkobjs.tickdiff) * mright + - mvkobjs.camup * static_cast(mvkobjs.tickdiff) * mup; + mvkobjs.camright * static_cast(mvkobjs.tickdiff) * mright + + mvkobjs.camup * static_cast(mvkobjs.tickdiff) * mup; return glm::lookAt(mvkobjs.camwpos, mvkobjs.camwpos + mforward, mup); } diff --git a/src/vk/commandbuffer.cpp b/src/vk/commandbuffer.cpp deleted file mode 100644 index 6b5c57d..0000000 --- a/src/vk/commandbuffer.cpp +++ /dev/null @@ -1,19 +0,0 @@ -#include "commandbuffer.hpp" -#include - -bool commandbuffer::init(vkobjs &rdata, VkCommandPool &vkpool, VkCommandBuffer &incommandbuffer) { - VkCommandBufferAllocateInfo bufferallocinfo{}; - bufferallocinfo.sType = VK_STRUCTURE_TYPE_COMMAND_BUFFER_ALLOCATE_INFO; - bufferallocinfo.commandPool = vkpool; - bufferallocinfo.level = VK_COMMAND_BUFFER_LEVEL_PRIMARY; - bufferallocinfo.commandBufferCount = 1; - if (vkAllocateCommandBuffers(rdata.vkdevice.device, &bufferallocinfo, &incommandbuffer) != VK_SUCCESS) { - return false; - } - - return true; -} - -void commandbuffer::cleanup(vkobjs &rdata, VkCommandPool &vkpool, VkCommandBuffer &incommandbuffer) { - vkFreeCommandBuffers(rdata.vkdevice.device, vkpool, 1, &incommandbuffer); -} diff --git a/src/vk/commandpool.cpp b/src/vk/commandpool.cpp deleted file mode 100644 index e590c52..0000000 --- a/src/vk/commandpool.cpp +++ /dev/null @@ -1,31 +0,0 @@ -#include "commandpool.hpp" -#include - -bool commandpool::init(vkobjs &rdata, VkCommandPool &vkpool) { - VkCommandPoolCreateInfo poolcreateinfo{}; - poolcreateinfo.sType = VK_STRUCTURE_TYPE_COMMAND_POOL_CREATE_INFO; - poolcreateinfo.queueFamilyIndex = rdata.vkdevice.get_queue_index(vkb::QueueType::graphics).value(); - poolcreateinfo.flags = VK_COMMAND_POOL_CREATE_RESET_COMMAND_BUFFER_BIT; - - if (vkCreateCommandPool(rdata.vkdevice.device, &poolcreateinfo, nullptr, &vkpool) != VK_SUCCESS) { - return false; - } - - return true; -} - -bool commandpool::initcompute(vkobjs &rdata, VkCommandPool &vkpool) { - VkCommandPoolCreateInfo poolcreateinfo{}; - poolcreateinfo.sType = VK_STRUCTURE_TYPE_COMMAND_POOL_CREATE_INFO; - poolcreateinfo.queueFamilyIndex = rdata.vkdevice.get_queue_index(vkb::QueueType::compute).value(); - poolcreateinfo.flags = VK_COMMAND_POOL_CREATE_RESET_COMMAND_BUFFER_BIT; - - if (vkCreateCommandPool(rdata.vkdevice.device, &poolcreateinfo, nullptr, &vkpool) != VK_SUCCESS) { - return false; - } - - return true; -} -void commandpool::cleanup(vkobjs &rdata, VkCommandPool &vkpool) { - vkDestroyCommandPool(rdata.vkdevice.device, vkpool, nullptr); -} From d34f5f2d9d1262526e9adcdfe99b27796c619015 Mon Sep 17 00:00:00 2001 From: r Date: Thu, 12 Jun 2025 10:09:11 +0300 Subject: [PATCH 07/40] fix depth buffer --- src/core/vkrenderer.cpp | 25 ++++++++++--------------- src/vk/renderpass.cpp | 26 +++++++++----------------- 2 files changed, 19 insertions(+), 32 deletions(-) diff --git a/src/core/vkrenderer.cpp b/src/core/vkrenderer.cpp index 4e24bf1..525ef32 100644 --- a/src/core/vkrenderer.cpp +++ b/src/core/vkrenderer.cpp @@ -125,6 +125,10 @@ bool vkrenderer::deviceinit() { bool res{false}; res = SDL_Vulkan_CreateSurface(mvkobjs.wind, mvkobjs.inst, nullptr, &msurface); + if(!res) { + std::cout << "SDL failed to create surface" << std::endl; + return false; + } vkb::PhysicalDeviceSelector physicaldevsel{mvkobjs.inst}; auto firstphysicaldevselret = physicaldevsel.set_surface(msurface).set_minimum_version(1, 3).select(); @@ -290,7 +294,7 @@ bool vkrenderer::createframebuffer() { bool vkrenderer::createcommandpool() { if (!commandpool::createsametype(mvkobjs, mvkobjs.cpools_graphics,vkb::QueueType::graphics)) return false; - if (!commandpool::createsametype(mvkobjs, mvkobjs.cpools_compute,vkb::QueueType::graphics)) + if (!commandpool::createsametype(mvkobjs, mvkobjs.cpools_compute,vkb::QueueType::compute)) return false; return true; } @@ -491,11 +495,6 @@ bool vkrenderer::uploadfordraw(std::shared_ptr &x) { submitinfo.commandBufferCount = 1; submitinfo.pCommandBuffers = &mvkobjs.cbuffers_graphics.at(0); - // VkSemaphoreWaitInfo swinfo{}; - // swinfo.sType = VK_STRUCTURE_TYPE_SEMAPHORE_WAIT_INFO; - // swinfo.pSemaphores = &mvkobjs.rdpresentsemaphore; - // swinfo.semaphoreCount = 1; - mvkobjs.mtx2->lock(); if (vkQueueSubmit(mvkobjs.graphicsQ, 1, &submitinfo, mvkobjs.renderfence) != VK_SUCCESS) { return false; @@ -835,14 +834,10 @@ bool vkrenderer::draw() { } } - VkClearValue colorclearvalue; - colorclearvalue.color = {{0.0f, 0.0f, 0.0f, 0.0f}}; - - VkClearValue depthvalue; - depthvalue.depthStencil.depth = 1.0f; - - VkClearValue clearvals[] = {colorclearvalue, depthvalue}; - + std::array colorclearvalue{ + VkClearValue{.color={0.0f, 0.0f, 0.0f, 1.0f}},//no idea why i have to put VkClearValue here but not in the secon one, doesnt work without it + {.depthStencil={1.0f,0}} + }; VkRenderPassBeginInfo rpinfo{}; rpinfo.sType = VK_STRUCTURE_TYPE_RENDER_PASS_BEGIN_INFO; rpinfo.renderPass = mvkobjs.rdrenderpass; @@ -853,7 +848,7 @@ bool vkrenderer::draw() { rpinfo.framebuffer = mvkobjs.fbuffers[imgidx]; rpinfo.clearValueCount = 2; - rpinfo.pClearValues = clearvals; + rpinfo.pClearValues = colorclearvalue.data(); VkViewport viewport{}; viewport.x = 0.0f; diff --git a/src/vk/renderpass.cpp b/src/vk/renderpass.cpp index 6ced97b..32747db 100644 --- a/src/vk/renderpass.cpp +++ b/src/vk/renderpass.cpp @@ -37,23 +37,15 @@ bool renderpass::init(vkobjs &rdata) { subpassdesc.pColorAttachments = &coloraref; subpassdesc.pDepthStencilAttachment = &deptharef; - VkSubpassDependency subpassdep{}; - subpassdep.srcSubpass = VK_SUBPASS_EXTERNAL; - subpassdep.dstSubpass = 0; - subpassdep.srcStageMask = VK_PIPELINE_STAGE_COLOR_ATTACHMENT_OUTPUT_BIT; - subpassdep.srcAccessMask = 0; - subpassdep.dstStageMask = VK_PIPELINE_STAGE_COLOR_ATTACHMENT_OUTPUT_BIT; - subpassdep.dstAccessMask = VK_ACCESS_COLOR_ATTACHMENT_READ_BIT | VK_ACCESS_COLOR_ATTACHMENT_WRITE_BIT; + VkSubpassDependency dependency{}; + dependency.srcSubpass = VK_SUBPASS_EXTERNAL; + dependency.dstSubpass = 0; + dependency.srcStageMask = VK_PIPELINE_STAGE_COLOR_ATTACHMENT_OUTPUT_BIT | VK_PIPELINE_STAGE_LATE_FRAGMENT_TESTS_BIT; + dependency.srcAccessMask = VK_ACCESS_DEPTH_STENCIL_ATTACHMENT_WRITE_BIT; + dependency.dstStageMask = VK_PIPELINE_STAGE_COLOR_ATTACHMENT_OUTPUT_BIT | VK_PIPELINE_STAGE_EARLY_FRAGMENT_TESTS_BIT; + dependency.dstAccessMask = VK_ACCESS_COLOR_ATTACHMENT_WRITE_BIT | VK_ACCESS_DEPTH_STENCIL_ATTACHMENT_WRITE_BIT; - VkSubpassDependency depthdep{}; - depthdep.srcSubpass = VK_SUBPASS_EXTERNAL; - depthdep.dstSubpass = 0; - depthdep.srcStageMask = VK_PIPELINE_STAGE_EARLY_FRAGMENT_TESTS_BIT | VK_PIPELINE_STAGE_LATE_FRAGMENT_TESTS_BIT; - depthdep.srcAccessMask = 0; - depthdep.dstStageMask = VK_PIPELINE_STAGE_EARLY_FRAGMENT_TESTS_BIT | VK_PIPELINE_STAGE_LATE_FRAGMENT_TESTS_BIT; - depthdep.dstAccessMask = VK_ACCESS_DEPTH_STENCIL_ATTACHMENT_WRITE_BIT; - - VkSubpassDependency deps[] = {subpassdep, depthdep}; + VkSubpassDependency deps[] = {dependency}; VkAttachmentDescription descs[] = {colora, deptha}; VkRenderPassCreateInfo renderpassinfo{}; @@ -62,7 +54,7 @@ bool renderpass::init(vkobjs &rdata) { renderpassinfo.pAttachments = descs; renderpassinfo.subpassCount = 1; renderpassinfo.pSubpasses = &subpassdesc; - renderpassinfo.dependencyCount = 2; + renderpassinfo.dependencyCount = 1; renderpassinfo.pDependencies = deps; if (vkCreateRenderPass(rdata.vkdevice.device, &renderpassinfo, nullptr, &rdata.rdrenderpass) != VK_SUCCESS) { From 70c5a6f70bc803fcb9406abdc410ca324a0f1c02 Mon Sep 17 00:00:00 2001 From: r Date: Thu, 12 Jun 2025 14:39:59 +0300 Subject: [PATCH 08/40] empty --- src/core/vkrenderer.cpp | 8 ++++++++ src/glue/pline.cpp | 2 +- 2 files changed, 9 insertions(+), 1 deletion(-) diff --git a/src/core/vkrenderer.cpp b/src/core/vkrenderer.cpp index 525ef32..fe3d498 100644 --- a/src/core/vkrenderer.cpp +++ b/src/core/vkrenderer.cpp @@ -838,6 +838,12 @@ bool vkrenderer::draw() { VkClearValue{.color={0.0f, 0.0f, 0.0f, 1.0f}},//no idea why i have to put VkClearValue here but not in the secon one, doesnt work without it {.depthStencil={1.0f,0}} }; + + // VkRenderingInfo rinfo{}; + // rinfo.sType = VK_STRUCTURE_TYPE_PIPELINE_RENDERING_CREATE_INFO; + // rinfo.renderArea.extent = mvkobjs.schain.extent; + // rinfo.renderArea.offset = {0, 0}; + VkRenderPassBeginInfo rpinfo{}; rpinfo.sType = VK_STRUCTURE_TYPE_RENDER_PASS_BEGIN_INFO; rpinfo.renderPass = mvkobjs.rdrenderpass; @@ -875,6 +881,8 @@ bool vkrenderer::draw() { return false; vkCmdBeginRenderPass(mvkobjs.cbuffers_graphics.at(0), &rpinfo, VK_SUBPASS_CONTENTS_INLINE); + // try switching to rendering instead of renderpass + // vkCmdBeginRendering() vkCmdSetViewport(mvkobjs.cbuffers_graphics.at(0), 0, 1, &viewport); vkCmdSetScissor(mvkobjs.cbuffers_graphics.at(0), 0, 1, &scissor); diff --git a/src/glue/pline.cpp b/src/glue/pline.cpp index e516a01..836f818 100644 --- a/src/glue/pline.cpp +++ b/src/glue/pline.cpp @@ -119,7 +119,7 @@ bool pline::init(vkobjs &objs, VkPipelineLayout &playout, VkPipeline &pipeline, colorBlendAttachment.srcColorBlendFactor = VK_BLEND_FACTOR_SRC_ALPHA; colorBlendAttachment.dstColorBlendFactor = VK_BLEND_FACTOR_ONE_MINUS_SRC_ALPHA; colorBlendAttachment.colorBlendOp = VK_BLEND_OP_ADD; - colorBlendAttachment.srcAlphaBlendFactor = VK_BLEND_FACTOR_ONE; + colorBlendAttachment.srcAlphaBlendFactor = VK_BLEND_FACTOR_ONE_MINUS_SRC_ALPHA; colorBlendAttachment.dstAlphaBlendFactor = VK_BLEND_FACTOR_ZERO; colorBlendAttachment.alphaBlendOp = VK_BLEND_OP_ADD; From 786b50e78e80649f97d5f69cb9318d4c20d33603 Mon Sep 17 00:00:00 2001 From: r Date: Sun, 15 Jun 2025 08:40:02 +0300 Subject: [PATCH 09/40] namespace framebuffer --- include/framebuffer.hpp | 9 --------- include/vk/framebuffer.hpp | 39 ++++++++++++++++++++++++++++++++++++++ include/vkobjs.hpp | 2 +- src/core/vkrenderer.cpp | 14 ++++++++++---- src/vk/framebuffer.cpp | 33 -------------------------------- 5 files changed, 50 insertions(+), 47 deletions(-) delete mode 100644 include/framebuffer.hpp create mode 100644 include/vk/framebuffer.hpp delete mode 100644 src/vk/framebuffer.cpp diff --git a/include/framebuffer.hpp b/include/framebuffer.hpp deleted file mode 100644 index a6c921a..0000000 --- a/include/framebuffer.hpp +++ /dev/null @@ -1,9 +0,0 @@ -#pragma once -#include "vkobjs.hpp" -#include - -class framebuffer { -public: - static bool init(vkobjs &rdata); - static void cleanup(vkobjs &rdata); -}; diff --git a/include/vk/framebuffer.hpp b/include/vk/framebuffer.hpp new file mode 100644 index 0000000..873b140 --- /dev/null +++ b/include/vk/framebuffer.hpp @@ -0,0 +1,39 @@ +#pragma once + +#include "vkobjs.hpp" +#include + +namespace framebuffer { +static inline bool create(vkobjs &rdata) { + rdata.schainimgs = rdata.schain.get_images().value(); + rdata.schainimgviews = rdata.schain.get_image_views().value(); + + rdata.fbuffers.reserve(rdata.schainimgviews.size()); + rdata.fbuffers.resize(rdata.schainimgviews.size()); + + for (size_t i = 0; i < rdata.schainimgviews.size(); ++i) { + VkImageView a[] = {rdata.schainimgviews[i], rdata.rddepthimageview}; + + VkFramebufferCreateInfo fbinfo{ + .sType = VK_STRUCTURE_TYPE_FRAMEBUFFER_CREATE_INFO, + .renderPass = rdata.rdrenderpass, + .attachmentCount = 2, + .pAttachments = a, + .width = rdata.schain.extent.width, + .height = rdata.schain.extent.height, + .layers = 1 + }; + + if (vkCreateFramebuffer(rdata.vkdevice.device, &fbinfo, nullptr, &rdata.fbuffers[i]) != VK_SUCCESS) { + return false; + } + } + return true; +} +static inline void destroy(const VkDevice &dev,const std::span& fbs) { + for (auto &fb : fbs) { + vkDestroyFramebuffer(dev, fb, nullptr); + } +} + +}; diff --git a/include/vkobjs.hpp b/include/vkobjs.hpp index de1e9fc..c044232 100644 --- a/include/vkobjs.hpp +++ b/include/vkobjs.hpp @@ -133,7 +133,7 @@ struct vkobjs { std::vector schainimgs; std::vector schainimgviews; - std::vector fbuffers; + std::vector fbuffers = {VK_NULL_HANDLE,VK_NULL_HANDLE,VK_NULL_HANDLE}; VkQueue graphicsQ = VK_NULL_HANDLE; VkQueue presentQ = VK_NULL_HANDLE; diff --git a/src/core/vkrenderer.cpp b/src/core/vkrenderer.cpp index fe3d498..c8d598f 100644 --- a/src/core/vkrenderer.cpp +++ b/src/core/vkrenderer.cpp @@ -20,7 +20,7 @@ #include "vk/commandbuffer.hpp" #include "vk/commandpool.hpp" -#include "framebuffer.hpp" +#include "vk/framebuffer.hpp" #include "renderpass.hpp" #include "vksyncobjects.hpp" // #ifdef _DEBUG @@ -263,7 +263,7 @@ bool vkrenderer::recreateswapchain() { SDL_GetWindowSize(mvkobjs.wind, &mvkobjs.width, &mvkobjs.height); vkDeviceWaitIdle(mvkobjs.vkdevice.device); - framebuffer::cleanup(mvkobjs); + framebuffer::destroy(mvkobjs.vkdevice.device,mvkobjs.fbuffers); vkDestroyImageView(mvkobjs.vkdevice.device, mvkobjs.rddepthimageview, nullptr); vmaDestroyImage(mvkobjs.alloc, mvkobjs.rddepthimage, mvkobjs.rddepthimagealloc); @@ -287,7 +287,7 @@ bool vkrenderer::createrenderpass() { return true; } bool vkrenderer::createframebuffer() { - if (!framebuffer::init(mvkobjs)) + if (!framebuffer::create(mvkobjs)) return false; return true; } @@ -330,7 +330,13 @@ void vkrenderer::cleanup() { commandbuffer::destroy(mvkobjs, mvkobjs.cpools_compute.at(0), mvkobjs.cbuffers_compute); commandpool::destroy(mvkobjs, mvkobjs.cpools_graphics); commandpool::destroy(mvkobjs, mvkobjs.cpools_compute); - framebuffer::cleanup(mvkobjs); + // for(auto& x:mvkobjs.fbuffers){ + // vkDestroyFramebuffer(mvkobjs.vkdevice.device,x,nullptr); + // } + // vkDestroyFramebuffer(mvkobjs.vkdevice.device,mvkobjs.fbuffers.at(0),nullptr); + // vkDestroyFramebuffer(mvkobjs.vkdevice.device,mvkobjs.fbuffers.at(1),nullptr); + // vkDestroyFramebuffer(mvkobjs.vkdevice.device,mvkobjs.fbuffers.at(2),nullptr); + framebuffer::destroy(mvkobjs.vkdevice.device,mvkobjs.fbuffers); for (const auto &i : mplayer) i->cleanuplines(mvkobjs); diff --git a/src/vk/framebuffer.cpp b/src/vk/framebuffer.cpp deleted file mode 100644 index 3302255..0000000 --- a/src/vk/framebuffer.cpp +++ /dev/null @@ -1,33 +0,0 @@ -#include "framebuffer.hpp" -#include - -bool framebuffer::init(vkobjs &rdata) { - rdata.schainimgs = rdata.schain.get_images().value(); - rdata.schainimgviews = rdata.schain.get_image_views().value(); - - rdata.fbuffers.reserve(rdata.schainimgviews.size()); - rdata.fbuffers.resize(rdata.schainimgviews.size()); - - for (unsigned int i = 0; i < rdata.schainimgviews.size(); ++i) { - VkImageView a[] = {rdata.schainimgviews.at(i), rdata.rddepthimageview}; - - VkFramebufferCreateInfo fbinfo{}; - fbinfo.sType = VK_STRUCTURE_TYPE_FRAMEBUFFER_CREATE_INFO; - fbinfo.renderPass = rdata.rdrenderpass; - fbinfo.attachmentCount = 2; - fbinfo.pAttachments = a; - fbinfo.width = rdata.schain.extent.width; - fbinfo.height = rdata.schain.extent.height; - fbinfo.layers = 1; - - if (vkCreateFramebuffer(rdata.vkdevice.device, &fbinfo, nullptr, &rdata.fbuffers[i]) != VK_SUCCESS) { - return false; - } - } - return true; -} -void framebuffer::cleanup(vkobjs &rdata) { - for (auto &fb : rdata.fbuffers) { - vkDestroyFramebuffer(rdata.vkdevice.device, fb, nullptr); - } -} From 697e41e6000629ff1f5512ffebb9aff6c3f4201e Mon Sep 17 00:00:00 2001 From: r Date: Sat, 21 Jun 2025 18:17:02 +0300 Subject: [PATCH 10/40] idk --- .gitignore | 2 +- CMakeLists.txt | 1 - include/exp/particle.hpp | 2 +- shaders/gen.slang | 4 ++-- shaders/skin.slang | 22 ++++++++++++++++++++++ src/auxiliary/ui.cpp | 12 ------------ sub/absl | 2 +- sub/fastgltf | 2 +- sub/imgui | 2 +- sub/protobuf | 2 +- sub/sdl | 2 +- sub/sdlimg | 2 +- sub/simdjson | 2 +- sub/stb | 2 +- sub/vk_boot | 2 +- 15 files changed, 35 insertions(+), 26 deletions(-) create mode 100644 shaders/skin.slang diff --git a/.gitignore b/.gitignore index 0c02eab..74c6860 100644 --- a/.gitignore +++ b/.gitignore @@ -1,5 +1,6 @@ build build_static +build_corrupted cmake_more_cache resources vsbuild @@ -17,4 +18,3 @@ dist .vscode *.swp out -# .gitmodules diff --git a/CMakeLists.txt b/CMakeLists.txt index 0900e89..b2c6253 100644 --- a/CMakeLists.txt +++ b/CMakeLists.txt @@ -327,7 +327,6 @@ target_link_libraries(rview2 absl_log_internal_structured_proto absl_log_severity absl_log_sink - absl_low_level_hash absl_malloc_internal absl_periodic_sampler absl_poison diff --git a/include/exp/particle.hpp b/include/exp/particle.hpp index 545f13c..1b7246d 100644 --- a/include/exp/particle.hpp +++ b/include/exp/particle.hpp @@ -18,7 +18,7 @@ static VkPipelineLayout gplayout{}; static VkDescriptorSetLayout cdlayout{}; static VkDescriptorSet cdset{}; -static std::vector

Ps(8192); +static std::vector

Ps(7999); static std::vector computeFinishedSemaphores(1); static std::vector computeInFlightFences(1); diff --git a/shaders/gen.slang b/shaders/gen.slang index 4d2f3af..179fb95 100644 --- a/shaders/gen.slang +++ b/shaders/gen.slang @@ -12,12 +12,12 @@ struct VXin { uint4 joi0 : JOINTS_0; float4 wei0 : WEIGHTS_0; // float2 tex1 : TEXCOORD_1; + // uint4 joi1 : JOINTS_1; + // float4 wei1 : WEIGHTS_1; // float2 tex2 : TEXCOORD_2; // float2 tex3 : TEXCOORD_3; // float2 tex4 : TEXCOORD_4; // float2 tex5 : TEXCOORD_5; - // uint4 joi1 : JOINTS_1; - // float4 wei1 : WEIGHTS_1; } struct Particle { float2 position; diff --git a/shaders/skin.slang b/shaders/skin.slang new file mode 100644 index 0000000..91d3ac1 --- /dev/null +++ b/shaders/skin.slang @@ -0,0 +1,22 @@ + +// struct jmats { +// float4x4 jointmats; +// } + +// [[vk_binding(0, 0)]] +// StructuredBuffer jmatbuffer; +// [[vk_binding(0, 1)]] +// StructuredBuffer jois; +// [[vk_binding(0, 2)]] +// StructuredBuffer weis; + +// RWStructuredBuffer verts; + +// [shader("compute")] +// [[numthreads(256, 1, 1)]] +// void cxmain(uint3 tid: SV_DispatchThreadID) { +// verts[tid.x] = jmatbuffer[jois[tid.x].x].jointmats * weis[tid.x].x + +// jmatbuffer[jois[tid.x].y].jointmats * weis[tid.x].y + +// jmatbuffer[jois[tid.x].z].jointmats * weis[tid.x].z + +// jmatbuffer[jois[tid.x].w].jointmats * weis[tid.x].w; +// } diff --git a/src/auxiliary/ui.cpp b/src/auxiliary/ui.cpp index b2d15af..51f3810 100644 --- a/src/auxiliary/ui.cpp +++ b/src/auxiliary/ui.cpp @@ -78,18 +78,6 @@ bool ui::init(vkobjs &renderData) { cmdBeginInfo.sType = VK_STRUCTURE_TYPE_COMMAND_BUFFER_BEGIN_INFO; cmdBeginInfo.flags = VK_COMMAND_BUFFER_USAGE_ONE_TIME_SUBMIT_BIT; - if (vkBeginCommandBuffer(imguiCommandBuffer.at(0), &cmdBeginInfo) != VK_SUCCESS) { - return false; - } - - renderData.mtx2->lock(); - ImGui_ImplVulkan_CreateFontsTexture(); - renderData.mtx2->unlock(); - - if (vkEndCommandBuffer(imguiCommandBuffer.at(0)) != VK_SUCCESS) { - return false; - } - VkSubmitInfo submitInfo{}; submitInfo.sType = VK_STRUCTURE_TYPE_SUBMIT_INFO; submitInfo.pWaitDstStageMask = nullptr; diff --git a/sub/absl b/sub/absl index e4c4385..f60bfd8 160000 --- a/sub/absl +++ b/sub/absl @@ -1 +1 @@ -Subproject commit e4c43850ad008b362b53622cb3c88fd915d8f714 +Subproject commit f60bfd822e5be101269561043eeea5f1937392cb diff --git a/sub/fastgltf b/sub/fastgltf index 9c8a6ef..68b749b 160000 --- a/sub/fastgltf +++ b/sub/fastgltf @@ -1 +1 @@ -Subproject commit 9c8a6ef8909b0f0a38aac5f2aa96ac6503f9ddea +Subproject commit 68b749bde0d6049193458266e771fbd74e5ad1f4 diff --git a/sub/imgui b/sub/imgui index 407a0b9..afe20dc 160000 --- a/sub/imgui +++ b/sub/imgui @@ -1 +1 @@ -Subproject commit 407a0b972eac6166095d2b5b5b0896bad6e9687a +Subproject commit afe20dc9b608e29b2e75964327287cf5588c1d2d diff --git a/sub/protobuf b/sub/protobuf index 8543a71..c02a5fc 160000 --- a/sub/protobuf +++ b/sub/protobuf @@ -1 +1 @@ -Subproject commit 8543a716690c03102d3dfcfd98c579001a799a77 +Subproject commit c02a5fcbd5718380caa942994f6e7cb1455ce405 diff --git a/sub/sdl b/sub/sdl index f625723..e80d084 160000 --- a/sub/sdl +++ b/sub/sdl @@ -1 +1 @@ -Subproject commit f62572344ff6106b78d0665b2720fbb8b9c0ba86 +Subproject commit e80d084766fa9ae3e86177e213e9497591e0935d diff --git a/sub/sdlimg b/sub/sdlimg index 18486b1..e28c7c7 160000 --- a/sub/sdlimg +++ b/sub/sdlimg @@ -1 +1 @@ -Subproject commit 18486b134e7e753935b0e66556d2e9f7634e44a7 +Subproject commit e28c7c7623ed447c10977849013c6e3c815f0788 diff --git a/sub/simdjson b/sub/simdjson index b717136..0c0ce1b 160000 --- a/sub/simdjson +++ b/sub/simdjson @@ -1 +1 @@ -Subproject commit b717136fd9151422acf78995cb27ec6d43bed7cf +Subproject commit 0c0ce1bd48baa0677dc7c0945ea7cd1e8b52b297 diff --git a/sub/stb b/sub/stb index 802cd45..f58f558 160000 --- a/sub/stb +++ b/sub/stb @@ -1 +1 @@ -Subproject commit 802cd454f25469d3123e678af41364153c132c2a +Subproject commit f58f558c120e9b32c217290b80bad1a0729fbb2c diff --git a/sub/vk_boot b/sub/vk_boot index f9f1aa1..341fbe7 160000 --- a/sub/vk_boot +++ b/sub/vk_boot @@ -1 +1 @@ -Subproject commit f9f1aa112a8f46d30aa8755ccf24e644580298d4 +Subproject commit 341fbe7c4aae89133ba8b27bed0f7fd523ae126b From 482957976610d6a34109e43dd4d6a950d556f608 Mon Sep 17 00:00:00 2001 From: r Date: Thu, 26 Jun 2025 20:12:39 +0300 Subject: [PATCH 11/40] pre_update --- include/vkobjs.hpp | 2 +- src/buffer/ubo.cpp | 17 ++++------------- 2 files changed, 5 insertions(+), 14 deletions(-) diff --git a/include/vkobjs.hpp b/include/vkobjs.hpp index c044232..5f51d83 100644 --- a/include/vkobjs.hpp +++ b/include/vkobjs.hpp @@ -171,7 +171,7 @@ struct vkgltfobjs { texdatapls texpls{}; }; namespace rpool { -static inline bool create(const std::vector& pools,const VkDevice& dev,VkDescriptorPool* dpool) { +static inline bool create(const std::span& pools,const VkDevice& dev,VkDescriptorPool* dpool) { VkDescriptorPoolCreateInfo descriptorPool{}; descriptorPool.sType = VK_STRUCTURE_TYPE_DESCRIPTOR_POOL_CREATE_INFO; descriptorPool.poolSizeCount = pools.size(); diff --git a/src/buffer/ubo.cpp b/src/buffer/ubo.cpp index 6c611cd..ae15d53 100644 --- a/src/buffer/ubo.cpp +++ b/src/buffer/ubo.cpp @@ -43,20 +43,11 @@ bool ubo::init(vkobjs &mvkobjs, std::vector &ubodata) { if (vkCreateDescriptorSetLayout(mvkobjs.vkdevice.device, &uboinfo, nullptr, &ubodata[0].dlayout) != VK_SUCCESS) return false; + std::array poolsize{}; + poolsize[0].type = VK_DESCRIPTOR_TYPE_UNIFORM_BUFFER; + poolsize[0].descriptorCount = 1 * (ubodata.size() * sizeof(glm::mat4) + sizeof(unsigned int)); - VkDescriptorPoolSize poolsize{}; - poolsize.type = VK_DESCRIPTOR_TYPE_UNIFORM_BUFFER; - poolsize.descriptorCount = 1 * (ubodata.size() * sizeof(glm::mat4) + sizeof(unsigned int)); - - VkDescriptorPoolCreateInfo dpoolinfo{}; - dpoolinfo.sType = VK_STRUCTURE_TYPE_DESCRIPTOR_POOL_CREATE_INFO; - dpoolinfo.poolSizeCount = 1; - dpoolinfo.pPoolSizes = &poolsize; - dpoolinfo.maxSets = 1; - - if (vkCreateDescriptorPool(mvkobjs.vkdevice.device, &dpoolinfo, nullptr, &ubodata[0].dpool) != - VK_SUCCESS) - return false; + rpool::create(poolsize,mvkobjs.vkdevice.device, &ubodata[0].dpool); VkDescriptorSetAllocateInfo dallocinfo{}; dallocinfo.sType = VK_STRUCTURE_TYPE_DESCRIPTOR_SET_ALLOCATE_INFO; From cdcd33b97eb2a9904bbd3dfe166d70076d20b69a Mon Sep 17 00:00:00 2001 From: r Date: Sat, 28 Jun 2025 19:17:42 +0300 Subject: [PATCH 12/40] moving pools --- CMakeLists.txt | 10 +++---- include/buffer/ssbo.hpp | 6 ++-- include/exp/particle.hpp | 10 +++---- include/genericmodel.hpp | 12 ++++---- include/playout.hpp | 4 +-- include/playoutgeneric.hpp | 26 ++++++++--------- include/pline.hpp | 4 +-- include/renderpass.hpp | 4 +-- include/ubo.hpp | 6 ++-- include/ui.hpp | 12 ++++---- include/vk/commandbuffer.hpp | 4 +-- include/vk/commandpool.hpp | 4 +-- include/vk/framebuffer.hpp | 2 +- include/vkcam.hpp | 2 +- include/vkebo.hpp | 8 +++--- include/vkobjs.hpp | 9 ++++-- include/vkrenderer.hpp | 4 +-- include/vksyncobjects.hpp | 4 +-- include/vktexture.hpp | 10 +++---- include/vkvbo.hpp | 12 ++++---- src/auxiliary/ui.cpp | 12 ++++---- src/buffer/ubo.cpp | 6 ++-- src/buffer/vkebo.cpp | 8 +++--- src/buffer/vkvbo.cpp | 12 ++++---- src/core/vkrenderer.cpp | 2 +- src/glue/playout.cpp | 4 +-- src/glue/pline.cpp | 4 +-- src/glue/vktexture.cpp | 52 +++++++++++----------------------- src/model/genericmodel.cpp | 10 +++---- src/playout/playoutgeneric.cpp | 26 ++++++++--------- src/subcore/vkcam.cpp | 2 +- src/vk/renderpass.cpp | 4 +-- src/vk/vksyncobjects.cpp | 4 +-- 33 files changed, 142 insertions(+), 157 deletions(-) diff --git a/CMakeLists.txt b/CMakeLists.txt index b2c6253..ce513b6 100644 --- a/CMakeLists.txt +++ b/CMakeLists.txt @@ -211,12 +211,12 @@ list(LENGTH shaders shader_len) add_custom_command( OUTPUT ${PROJECT_BINARY_DIR}/shaders/vx.spv ${PROJECT_BINARY_DIR}/shaders/px.spv ${PROJECT_BINARY_DIR}/shaders/cx.spv ${PROJECT_BINARY_DIR}/shaders/pvx.spv ${PROJECT_BINARY_DIR}/shaders/ppx.spv ${PROJECT_BINARY_DIR}/shaders/pcx.spv COMMAND ${CMAKE_COMMAND} -E make_directory "${PROJECT_BINARY_DIR}/shaders" - COMMAND ${SHELL_CMD} -c "$ENV{VULKAN_SDK}/../../silver/usr/slang/slangc -entry vxmain $<$:-g> $<$:-O3> -stage vertex -target spirv -capability SPIRV_1_6 ${PROJECT_SOURCE_DIR}/shaders/gen.slang -o ${PROJECT_BINARY_DIR}/shaders/vx.spv" DEPENDS ${PROJECT_SOURCE_DIR}/shaders/gen.slang - COMMAND ${SHELL_CMD} -c "$ENV{VULKAN_SDK}/../../silver/usr/slang/slangc -entry pxmain $<$:-g> $<$:-O3> -stage pixel -target spirv -capability SPIRV_1_6 ${PROJECT_SOURCE_DIR}/shaders/gen.slang -o ${PROJECT_BINARY_DIR}/shaders/px.spv" DEPENDS ${PROJECT_SOURCE_DIR}/shaders/gen.slang + COMMAND ${SHELL_CMD} -c "slangc -entry vxmain $<$:-g> $<$:-O3> -stage vertex -target spirv -capability SPIRV_1_6 ${PROJECT_SOURCE_DIR}/shaders/gen.slang -o ${PROJECT_BINARY_DIR}/shaders/vx.spv" DEPENDS ${PROJECT_SOURCE_DIR}/shaders/gen.slang + COMMAND ${SHELL_CMD} -c "slangc -entry pxmain $<$:-g> $<$:-O3> -stage pixel -target spirv -capability SPIRV_1_6 ${PROJECT_SOURCE_DIR}/shaders/gen.slang -o ${PROJECT_BINARY_DIR}/shaders/px.spv" DEPENDS ${PROJECT_SOURCE_DIR}/shaders/gen.slang # COMMAND ${SHELL_CMD} -c "$ENV{VULKAN_SD/bin/slangc -entry cxmain $<$:-g> $<$:-O3> -stage compute -target spirv -capability SPIRV_1_6 ${PROJECT_SOURCE_DIR}/shaders/gen.slang -o ${PROJECT_BINARY_DIR}/shaders/cx.spv" DEPENDS ${PROJECT_SOURCE_DIR}/shaders/gen.slang - COMMAND ${SHELL_CMD} -c "$ENV{VULKAN_SDK}/../../silver/usr/slang/slangc -entry vxmain $<$:-g> $<$:-O3> -stage vertex -target spirv -capability SPIRV_1_6 ${PROJECT_SOURCE_DIR}/shaders/particle.slang -o ${PROJECT_BINARY_DIR}/shaders/pvx.spv" DEPENDS ${PROJECT_SOURCE_DIR}/shaders/particle.slang - COMMAND ${SHELL_CMD} -c "$ENV{VULKAN_SDK}/../../silver/usr/slang/slangc -entry pxmain $<$:-g> $<$:-O3> -stage pixel -target spirv -capability SPIRV_1_6 ${PROJECT_SOURCE_DIR}/shaders/particle.slang -o ${PROJECT_BINARY_DIR}/shaders/ppx.spv" DEPENDS ${PROJECT_SOURCE_DIR}/shaders/particle.slang - COMMAND ${SHELL_CMD} -c "$ENV{VULKAN_SDK}/../../silver/usr/slang/slangc -entry cxmain $<$:-g> $<$:-O3> -stage compute -target spirv -capability SPIRV_1_6 ${PROJECT_SOURCE_DIR}/shaders/particle.slang -o ${PROJECT_BINARY_DIR}/shaders/pcx.spv" DEPENDS ${PROJECT_SOURCE_DIR}/shaders/particle.slang + COMMAND ${SHELL_CMD} -c "slangc -entry vxmain $<$:-g> $<$:-O3> -stage vertex -target spirv -capability SPIRV_1_6 ${PROJECT_SOURCE_DIR}/shaders/particle.slang -o ${PROJECT_BINARY_DIR}/shaders/pvx.spv" DEPENDS ${PROJECT_SOURCE_DIR}/shaders/particle.slang + COMMAND ${SHELL_CMD} -c "slangc -entry pxmain $<$:-g> $<$:-O3> -stage pixel -target spirv -capability SPIRV_1_6 ${PROJECT_SOURCE_DIR}/shaders/particle.slang -o ${PROJECT_BINARY_DIR}/shaders/ppx.spv" DEPENDS ${PROJECT_SOURCE_DIR}/shaders/particle.slang + COMMAND ${SHELL_CMD} -c "slangc -entry cxmain $<$:-g> $<$:-O3> -stage compute -target spirv -capability SPIRV_1_6 ${PROJECT_SOURCE_DIR}/shaders/particle.slang -o ${PROJECT_BINARY_DIR}/shaders/pcx.spv" DEPENDS ${PROJECT_SOURCE_DIR}/shaders/particle.slang ) list(APPEND SPIRV_BINARY_FILES ${PROJECT_BINARY_DIR}/shaders/vx.spv ${PROJECT_BINARY_DIR}/shaders/px.spv ${PROJECT_BINARY_DIR}/shaders/cx.spv ${PROJECT_BINARY_DIR}/shaders/pvx.spv ${PROJECT_BINARY_DIR}/shaders/ppx.spv ${PROJECT_BINARY_DIR}/shaders/pcx.spv) set_source_files_properties(${SPIRV_BINARY_FILES} PROPERTIES GENERATED TRUE) diff --git a/include/buffer/ssbo.hpp b/include/buffer/ssbo.hpp index 9b88bff..ab30223 100644 --- a/include/buffer/ssbo.hpp +++ b/include/buffer/ssbo.hpp @@ -6,7 +6,7 @@ #include "vkobjs.hpp" namespace ssbo { -static inline bool init(vkobjs &objs, ssbodata &ssboData, size_t buffersize) { +static inline bool init(rvk &objs, ssbodata &ssboData, size_t buffersize) { std::vector pool0{{VK_DESCRIPTOR_TYPE_STORAGE_BUFFER,1}}; if(!rpool::create(pool0,objs.vkdevice.device,&ssboData.dpool))return false; @@ -77,7 +77,7 @@ static inline bool init(vkobjs &objs, ssbodata &ssboData, size_t buffersize) { // {x.data()}; // }; template -static inline void upload(const vkobjs &objs, const ssbodata &ssbodata, const std::vector &mats) { +static inline void upload(const rvk &objs, const ssbodata &ssbodata, const std::vector &mats) { if (mats.size() <= 0) { return; } @@ -86,7 +86,7 @@ static inline void upload(const vkobjs &objs, const ssbodata &ssbodata, const st std::memcpy(data, mats.data(), ssbodata.size); vmaUnmapMemory(objs.alloc, ssbodata.alloc); } -static inline void cleanup(vkobjs &objs, ssbodata &ssbodata) { +static inline void cleanup(rvk &objs, ssbodata &ssbodata) { rpool::destroy(objs.vkdevice.device, ssbodata.dpool); vkDestroyDescriptorSetLayout(objs.vkdevice.device, ssbodata.dlayout, nullptr); vmaDestroyBuffer(objs.alloc, ssbodata.buffer, ssbodata.alloc); diff --git a/include/exp/particle.hpp b/include/exp/particle.hpp index 1b7246d..d8e59dd 100644 --- a/include/exp/particle.hpp +++ b/include/exp/particle.hpp @@ -30,7 +30,7 @@ static std::vector> ssbobuffsnallocs(1); static VkDescriptorPool dpool{VK_NULL_HANDLE}; -static inline void createSyncObjects(vkobjs &objs) { +static inline void createSyncObjects(rvk &objs) { // need inflight fences when using more than 1 for both queues @@ -48,7 +48,7 @@ static inline void createSyncObjects(vkobjs &objs) { } } -static inline bool createeverything(vkobjs &objs) { +static inline bool createeverything(rvk &objs) { // random std::default_random_engine randomengine((unsigned)time(nullptr)); @@ -373,7 +373,7 @@ static inline bool createeverything(vkobjs &objs) { return true; } -static inline bool drawcomp(vkobjs &objs) { +static inline bool drawcomp(rvk &objs) { vkWaitForFences(objs.vkdevice.device,1,&computeInFlightFences.at(0),VK_TRUE,UINT64_MAX); @@ -424,7 +424,7 @@ static inline bool drawcomp(vkobjs &objs) { return true; } -static inline void destroyeveryting(vkobjs &objs) { +static inline void destroyeveryting(rvk &objs) { vkDestroyPipeline(objs.vkdevice.device,gpline,VK_NULL_HANDLE); vkDestroyPipelineLayout(objs.vkdevice.device,gplayout,VK_NULL_HANDLE); vkDestroyPipeline(objs.vkdevice.device,cpline,VK_NULL_HANDLE); @@ -439,4 +439,4 @@ static inline void destroyeveryting(vkobjs &objs) { } -} // namespace particle \ No newline at end of file +} \ No newline at end of file diff --git a/include/genericmodel.hpp b/include/genericmodel.hpp index 72eff6a..cb399d1 100644 --- a/include/genericmodel.hpp +++ b/include/genericmodel.hpp @@ -18,12 +18,12 @@ struct gltfnodedata { class genericmodel { public: - bool loadmodel(vkobjs &objs, std::string fname); - void draw(vkobjs &objs); - void drawinstanced(vkobjs &objs, VkPipelineLayout &vkplayout, VkPipeline &vkpline, VkPipeline &vkplineuint, + bool loadmodel(rvk &objs, std::string fname); + void draw(rvk &objs); + void drawinstanced(rvk &objs, VkPipelineLayout &vkplayout, VkPipeline &vkpline, VkPipeline &vkplineuint, int instancecount, int stride); - void cleanup(vkobjs &objs); - void uploadvboebo(vkobjs &objs, VkCommandBuffer &cbuffer); + void cleanup(rvk &objs); + void uploadvboebo(rvk &objs, VkCommandBuffer &cbuffer); std::vector gettexdata(); texdatapls gettexdatapls(); std::string getmodelfname(); @@ -43,7 +43,7 @@ class genericmodel { std::vector jointuintofx{0}; - void createvboebo(vkobjs &objs); + void createvboebo(rvk &objs); void getjointdata(); void getweightdata(); diff --git a/include/playout.hpp b/include/playout.hpp index 18a0420..f3bbb7e 100644 --- a/include/playout.hpp +++ b/include/playout.hpp @@ -4,7 +4,7 @@ class playout { public: - static bool init(vkobjs &mvkobjs, VkPipelineLayout &vkplayout, std::vector layoutz, + static bool init(rvk &mvkobjs, VkPipelineLayout &vkplayout, std::vector layoutz, size_t pushc_size); - static void cleanup(vkobjs &mvkobjs, VkPipelineLayout &vkplayout); + static void cleanup(rvk &mvkobjs, VkPipelineLayout &vkplayout); }; \ No newline at end of file diff --git a/include/playoutgeneric.hpp b/include/playoutgeneric.hpp index 091b970..0c8a157 100644 --- a/include/playoutgeneric.hpp +++ b/include/playoutgeneric.hpp @@ -8,21 +8,21 @@ class playoutgeneric { public: - bool loadmodel(vkobjs &objs, std::string fname); - bool createinstances(vkobjs &objs, size_t count, bool rand); - bool createubo(vkobjs &objs); - bool createssbomat(vkobjs &objs); - bool createplayout(vkobjs &objs); - bool createpline(vkobjs &objs, std::string vfile, std::string ffile); - bool setup(vkobjs &objs, std::string fname, size_t count, std::string vfile, std::string ffile); - void draw(vkobjs &objs); + bool loadmodel(rvk &objs, std::string fname); + bool createinstances(rvk &objs, size_t count, bool rand); + bool createubo(rvk &objs); + bool createssbomat(rvk &objs); + bool createplayout(rvk &objs); + bool createpline(rvk &objs, std::string vfile, std::string ffile); + bool setup(rvk &objs, std::string fname, size_t count, std::string vfile, std::string ffile); + void draw(rvk &objs); void updateanims(); void updatemats(); - void cleanuplines(vkobjs &objs); - void cleanupbuffers(vkobjs &objs); - void cleanupmodels(vkobjs &objs); - void uploadvboebo(vkobjs &objs, VkCommandBuffer &cbuffer); - void uploadubossbo(vkobjs &objs,std::vector &cammats); + void cleanuplines(rvk &objs); + void cleanupbuffers(rvk &objs); + void cleanupmodels(rvk &objs); + void uploadvboebo(rvk &objs, VkCommandBuffer &cbuffer); + void uploadubossbo(rvk &objs,std::vector &cammats); std::shared_ptr getinst(int i); diff --git a/include/pline.hpp b/include/pline.hpp index 3628852..5cb4917 100644 --- a/include/pline.hpp +++ b/include/pline.hpp @@ -5,7 +5,7 @@ class pline { public: - static bool init(vkobjs &objs, VkPipelineLayout &playout, VkPipeline &pipeline, VkPrimitiveTopology topology, + static bool init(rvk &objs, VkPipelineLayout &playout, VkPipeline &pipeline, VkPrimitiveTopology topology, unsigned int v_in, unsigned int atts, std::vector sfiles, bool char_or_short = false); - static void cleanup(vkobjs &objs, VkPipeline &pipeline); + static void cleanup(rvk &objs, VkPipeline &pipeline); }; diff --git a/include/renderpass.hpp b/include/renderpass.hpp index acc5bb6..e2b1cc2 100644 --- a/include/renderpass.hpp +++ b/include/renderpass.hpp @@ -3,6 +3,6 @@ #include class renderpass { public: - static bool init(vkobjs &rdata); - static void cleanup(vkobjs &rdata); + static bool init(rvk &rdata); + static void cleanup(rvk &rdata); }; diff --git a/include/ubo.hpp b/include/ubo.hpp index 780eaf7..94c1dff 100644 --- a/include/ubo.hpp +++ b/include/ubo.hpp @@ -4,7 +4,7 @@ #include class ubo { public: - static bool init(vkobjs &mvkobjs, std::vector &ubodata); - static void upload(vkobjs &mvkobjs, std::vector &ubodata, std::vector mats); - static void cleanup(vkobjs &mvkobjs, std::vector &ubodata); + static bool init(rvk &mvkobjs, std::vector &ubodata); + static void upload(rvk &mvkobjs, std::vector &ubodata, std::vector mats); + static void cleanup(rvk &mvkobjs, std::vector &ubodata); }; diff --git a/include/ui.hpp b/include/ui.hpp index f1eac35..e762428 100644 --- a/include/ui.hpp +++ b/include/ui.hpp @@ -15,13 +15,13 @@ struct selection { class ui { public: - bool init(vkobjs &mvkobjs); - void createdbgframe(vkobjs &mvkobjs, selection &settingsz); - bool createloadingscreen(vkobjs &mvkobjs); - bool createpausebuttons(vkobjs &mvkobjs); + bool init(rvk &mvkobjs); + void createdbgframe(rvk &mvkobjs, selection &settingsz); + bool createloadingscreen(rvk &mvkobjs); + bool createpausebuttons(rvk &mvkobjs); void addchat(std::string s); - void render(vkobjs &mvkobjs, VkCommandBuffer &cbuffer); - void cleanup(vkobjs &mvkobjs); + void render(rvk &mvkobjs, VkCommandBuffer &cbuffer); + void cleanup(rvk &mvkobjs); bool setnetwork{false}; void backspace(); bool chatfocus{false}; diff --git a/include/vk/commandbuffer.hpp b/include/vk/commandbuffer.hpp index efd0a9f..3c6a6b3 100644 --- a/include/vk/commandbuffer.hpp +++ b/include/vk/commandbuffer.hpp @@ -4,7 +4,7 @@ #include namespace commandbuffer { -static inline bool create(vkobjs &rdata, VkCommandPool &vkpool,const std::span &cbuffs) { +static inline bool create(rvk &rdata, VkCommandPool &vkpool,const std::span &cbuffs) { VkCommandBufferAllocateInfo bufferallocinfo{ .sType = VK_STRUCTURE_TYPE_COMMAND_BUFFER_ALLOCATE_INFO, .commandPool = vkpool, @@ -17,7 +17,7 @@ static inline bool create(vkobjs &rdata, VkCommandPool &vkpool,const std::span &cbuffs) { +static inline void destroy(rvk &rdata, VkCommandPool &vkpool,const std::span &cbuffs) { vkFreeCommandBuffers(rdata.vkdevice.device, vkpool, cbuffs.size(), cbuffs.data()); } diff --git a/include/vk/commandpool.hpp b/include/vk/commandpool.hpp index 7408de6..4de85f0 100644 --- a/include/vk/commandpool.hpp +++ b/include/vk/commandpool.hpp @@ -5,7 +5,7 @@ namespace commandpool { -static inline bool createsametype(vkobjs &rdata,const std::span &vkpools,const vkb::QueueType& qtype) { +static inline bool createsametype(rvk &rdata,const std::span &vkpools,const vkb::QueueType& qtype) { for(auto& x:vkpools) { VkCommandPoolCreateInfo poolcreateinfo{ .sType = VK_STRUCTURE_TYPE_COMMAND_POOL_CREATE_INFO, @@ -20,7 +20,7 @@ static inline bool createsametype(vkobjs &rdata,const std::span & return true; } -static inline void destroy(vkobjs &rdata,const std::span &vkpools) { +static inline void destroy(rvk &rdata,const std::span &vkpools) { for(auto& x:vkpools) { vkDestroyCommandPool(rdata.vkdevice.device, x, nullptr); } diff --git a/include/vk/framebuffer.hpp b/include/vk/framebuffer.hpp index 873b140..f2c5a7c 100644 --- a/include/vk/framebuffer.hpp +++ b/include/vk/framebuffer.hpp @@ -4,7 +4,7 @@ #include namespace framebuffer { -static inline bool create(vkobjs &rdata) { +static inline bool create(rvk &rdata) { rdata.schainimgs = rdata.schain.get_images().value(); rdata.schainimgviews = rdata.schain.get_image_views().value(); diff --git a/include/vkcam.hpp b/include/vkcam.hpp index 5bb57f9..e0d57dd 100644 --- a/include/vkcam.hpp +++ b/include/vkcam.hpp @@ -6,7 +6,7 @@ class vkcam { public: - glm::mat4 getview(vkobjs &mvkobjs); + glm::mat4 getview(rvk &mvkobjs); glm::vec3 mforward{0.0f}; glm::vec3 mright{0.0f}; glm::vec3 mup{0.0f}; diff --git a/include/vkebo.hpp b/include/vkebo.hpp index 8104d45..82bce54 100644 --- a/include/vkebo.hpp +++ b/include/vkebo.hpp @@ -5,10 +5,10 @@ #include class vkebo { public: - static bool init(vkobjs &objs, ebodata &indexbufferdata, size_t buffersize); - static bool upload(vkobjs &objs, VkCommandBuffer &cbuffer, ebodata &indexbufferdata, const fastgltf::Buffer &buffer, + static bool init(rvk &objs, ebodata &indexbufferdata, size_t buffersize); + static bool upload(rvk &objs, VkCommandBuffer &cbuffer, ebodata &indexbufferdata, const fastgltf::Buffer &buffer, const fastgltf::BufferView &bufferview, const size_t &count); - static bool upload(vkobjs &objs, VkCommandBuffer &cbuffer, ebodata &indexbufferdata, + static bool upload(rvk &objs, VkCommandBuffer &cbuffer, ebodata &indexbufferdata, std::vector indicez); - static void cleanup(vkobjs &objs, ebodata &indexbufferdata); + static void cleanup(rvk &objs, ebodata &indexbufferdata); }; diff --git a/include/vkobjs.hpp b/include/vkobjs.hpp index 5f51d83..9fcb5d8 100644 --- a/include/vkobjs.hpp +++ b/include/vkobjs.hpp @@ -49,7 +49,7 @@ struct ebodata { VmaAllocation salloc = nullptr; }; -struct ubodata { +struct ubodata { size_t size{0}; VkBuffer buffer = VK_NULL_HANDLE; VmaAllocation alloc = nullptr; @@ -84,7 +84,7 @@ struct vkpushconstants { float t{0.0f}; }; -struct vkobjs { +struct rvk { inline static const std::shared_ptr mtx2{std::make_shared()}; @@ -160,7 +160,12 @@ struct vkobjs { VkSemaphore rendersemaphore = VK_NULL_HANDLE; VkFence renderfence = VK_NULL_HANDLE; VkFence uploadfence = VK_NULL_HANDLE; + + inline static constexpr size_t idxubopool{0}; + inline static constexpr size_t idxtexpool{1}; + inline static constexpr size_t idxssbopool{2}; + std::array dpools = {VK_NULL_HANDLE, VK_NULL_HANDLE, VK_NULL_HANDLE}; VkDescriptorPool imguidpool = VK_NULL_HANDLE; }; diff --git a/include/vkrenderer.hpp b/include/vkrenderer.hpp index c1b2055..9a1da5e 100644 --- a/include/vkrenderer.hpp +++ b/include/vkrenderer.hpp @@ -49,7 +49,7 @@ class vkrenderer { bool quicksetup(); - vkobjs &getvkobjs(); + rvk &getvkobjs(); bool newconnection{false}; @@ -65,7 +65,7 @@ class vkrenderer { std::mutex getinstsettingsmtx{}; - vkobjs mvkobjs{}; + rvk mvkobjs{}; double dummy{0.0}; diff --git a/include/vksyncobjects.hpp b/include/vksyncobjects.hpp index 7ae7384..cae2b15 100644 --- a/include/vksyncobjects.hpp +++ b/include/vksyncobjects.hpp @@ -4,6 +4,6 @@ #include class vksyncobjects { public: - static bool init(vkobjs &rdata); - static void cleanup(vkobjs &rdata); + static bool init(rvk &rdata); + static void cleanup(rvk &rdata); }; diff --git a/include/vktexture.hpp b/include/vktexture.hpp index 5636820..52a9ff2 100644 --- a/include/vktexture.hpp +++ b/include/vktexture.hpp @@ -5,10 +5,10 @@ #include class vktexture { public: - static bool loadtexturefile(vkobjs &rdata, texdata &texdata, texdatapls &texdatapls, std::string texfile); - static bool loadtexture(vkobjs &rdata, std::vector &texdata, fastgltf::Asset &mmodel); - static bool loadtexlayoutpool(vkobjs &rdata, std::vector &texdata, texdatapls &texdatapls, + static bool loadtexturefile(rvk &rdata, texdata &texdata, texdatapls &texdatapls, std::string texfile); + static bool loadtexture(rvk &rdata, std::vector &texdata, fastgltf::Asset &mmodel); + static bool loadtexlayoutpool(rvk &rdata, std::vector &texdata, texdatapls &texdatapls, fastgltf::Asset &mmodel); - static void cleanup(vkobjs &rdata, texdata &texdata); - static void cleanuppls(vkobjs &rdata, texdatapls &texdatapls); + static void cleanup(rvk &rdata, texdata &texdata); + static void cleanuppls(rvk &rdata, texdatapls &texdatapls); }; diff --git a/include/vkvbo.hpp b/include/vkvbo.hpp index 4afd27e..344e061 100644 --- a/include/vkvbo.hpp +++ b/include/vkvbo.hpp @@ -4,15 +4,15 @@ #include class vkvbo { public: - static bool init(vkobjs &mvkobjs, vbodata &vbdata, size_t bsize); - static bool upload(vkobjs &mvkobjs, VkCommandBuffer &cbuffer, vbodata &vbdata, + static bool init(rvk &mvkobjs, vbodata &vbdata, size_t bsize); + static bool upload(rvk &mvkobjs, VkCommandBuffer &cbuffer, vbodata &vbdata, std::vector vertexdata); - static bool upload(vkobjs &mvkobjs, VkCommandBuffer &cbuffer, vbodata &vbdata, + static bool upload(rvk &mvkobjs, VkCommandBuffer &cbuffer, vbodata &vbdata, std::vector vertexdata); - static bool upload(vkobjs &mvkobjs, VkCommandBuffer &cbuffer, vbodata &vbdata, + static bool upload(rvk &mvkobjs, VkCommandBuffer &cbuffer, vbodata &vbdata, const fastgltf::Buffer &buffer, const fastgltf::BufferView &bufferview, const fastgltf::Accessor &acc); - static bool upload(vkobjs &mvkobjs, VkCommandBuffer &cbuffer, vbodata &vbdata, + static bool upload(rvk &mvkobjs, VkCommandBuffer &cbuffer, vbodata &vbdata, const std::vector &jointz, const unsigned int count, const unsigned int ofx); - static void cleanup(vkobjs &mvkobjs, vbodata &vbdata); + static void cleanup(rvk &mvkobjs, vbodata &vbdata); }; diff --git a/src/auxiliary/ui.cpp b/src/auxiliary/ui.cpp index 51f3810..4537672 100644 --- a/src/auxiliary/ui.cpp +++ b/src/auxiliary/ui.cpp @@ -13,7 +13,7 @@ #include "vk/commandbuffer.hpp" #include "ui.hpp" -bool ui::init(vkobjs &renderData) { +bool ui::init(rvk &renderData) { IMGUI_CHECKVERSION(); ImGui::CreateContext(); // std::shared_ptr x=std::make_shared(ImGui::CreateContext()); @@ -140,7 +140,7 @@ bool ui::init(vkobjs &renderData) { return true; } -void ui::createdbgframe(vkobjs &renderData, selection &settings) { +void ui::createdbgframe(rvk &renderData, selection &settings) { ImGui_ImplVulkan_NewFrame(); ImGui_ImplSDL3_NewFrame(); ImGui::NewFrame(); @@ -750,7 +750,7 @@ void ui::createdbgframe(vkobjs &renderData, selection &settings) { } } -bool ui::createloadingscreen(vkobjs &mvkobjs) { +bool ui::createloadingscreen(rvk &mvkobjs) { ImGui_ImplVulkan_NewFrame(); ImGui_ImplSDL3_NewFrame(); @@ -780,7 +780,7 @@ bool ui::createloadingscreen(vkobjs &mvkobjs) { return true; } -bool ui::createpausebuttons(vkobjs &mvkobjs) { +bool ui::createpausebuttons(rvk &mvkobjs) { ImGui_ImplVulkan_NewFrame(); ImGui_ImplSDL3_NewFrame(); @@ -857,7 +857,7 @@ void ui::addchat(std::string s) { chattxts.push_back(s); } -void ui::render(vkobjs &renderData, VkCommandBuffer &cbuffer) { +void ui::render(rvk &renderData, VkCommandBuffer &cbuffer) { ImGui::Render(); // renderData.mtx2.lock(); @@ -865,7 +865,7 @@ void ui::render(vkobjs &renderData, VkCommandBuffer &cbuffer) { // renderData.mtx2.unlock(); } -void ui::cleanup(vkobjs &mvkobjs) { +void ui::cleanup(rvk &mvkobjs) { ImGui_ImplVulkan_Shutdown(); vkDestroyDescriptorPool(mvkobjs.vkdevice.device, mvkobjs.imguidpool, nullptr); ImGui_ImplSDL3_Shutdown(); diff --git a/src/buffer/ubo.cpp b/src/buffer/ubo.cpp index ae15d53..66f2c2f 100644 --- a/src/buffer/ubo.cpp +++ b/src/buffer/ubo.cpp @@ -1,7 +1,7 @@ #include "ubo.hpp" #include -bool ubo::init(vkobjs &mvkobjs, std::vector &ubodata) { +bool ubo::init(rvk &mvkobjs, std::vector &ubodata) { ubodata.reserve(2); ubodata.resize(2); @@ -85,14 +85,14 @@ bool ubo::init(vkobjs &mvkobjs, std::vector &ubodata) { return true; } -void ubo::upload(vkobjs &mvkobjs, std::vector &ubodata, std::vector mats) { +void ubo::upload(rvk &mvkobjs, std::vector &ubodata, std::vector mats) { void *data; vmaMapMemory(mvkobjs.alloc, ubodata[0].alloc, &data); std::memcpy(data, mats.data(), ubodata[0].size); vmaUnmapMemory(mvkobjs.alloc, ubodata[0].alloc); } -void ubo::cleanup(vkobjs &mvkobjs, std::vector &ubodata) { +void ubo::cleanup(rvk &mvkobjs, std::vector &ubodata) { for (size_t i{0}; i < ubodata.size(); i++) { vkDestroyDescriptorPool(mvkobjs.vkdevice.device, ubodata[i].dpool, nullptr); vkDestroyDescriptorSetLayout(mvkobjs.vkdevice.device, ubodata[i].dlayout, nullptr); diff --git a/src/buffer/vkebo.cpp b/src/buffer/vkebo.cpp index ee5cb96..b914510 100644 --- a/src/buffer/vkebo.cpp +++ b/src/buffer/vkebo.cpp @@ -1,7 +1,7 @@ #include "vkebo.hpp" #include -bool vkebo::init(vkobjs &objs, ebodata &indexbufferdata, size_t buffersize) { +bool vkebo::init(rvk &objs, ebodata &indexbufferdata, size_t buffersize) { VkBufferCreateInfo binfo{}; binfo.sType = VK_STRUCTURE_TYPE_BUFFER_CREATE_INFO; binfo.size = buffersize; @@ -32,7 +32,7 @@ bool vkebo::init(vkobjs &objs, ebodata &indexbufferdata, size_t buffersize) { return true; } -bool vkebo::upload(vkobjs &objs, VkCommandBuffer &cbuffer, ebodata &indexbufferdata, +bool vkebo::upload(rvk &objs, VkCommandBuffer &cbuffer, ebodata &indexbufferdata, std::vector indicez) { void *d; @@ -62,7 +62,7 @@ bool vkebo::upload(vkobjs &objs, VkCommandBuffer &cbuffer, ebodata &indexbufferd return true; } -bool vkebo::upload(vkobjs &objs, VkCommandBuffer &cbuffer, ebodata &indexbufferdata, const fastgltf::Buffer &buffer, +bool vkebo::upload(rvk &objs, VkCommandBuffer &cbuffer, ebodata &indexbufferdata, const fastgltf::Buffer &buffer, const fastgltf::BufferView &bufferview, const size_t &count) { std::visit(fastgltf::visitor{[](auto &arg) {}, @@ -97,7 +97,7 @@ bool vkebo::upload(vkobjs &objs, VkCommandBuffer &cbuffer, ebodata &indexbufferd return true; } -void vkebo::cleanup(vkobjs &objs, ebodata &indexbufferdata) { +void vkebo::cleanup(rvk &objs, ebodata &indexbufferdata) { vmaDestroyBuffer(objs.alloc, indexbufferdata.sbuffer, indexbufferdata.salloc); vmaDestroyBuffer(objs.alloc, indexbufferdata.buffer, indexbufferdata.alloc); } diff --git a/src/buffer/vkvbo.cpp b/src/buffer/vkvbo.cpp index 658be74..1e6d0c0 100644 --- a/src/buffer/vkvbo.cpp +++ b/src/buffer/vkvbo.cpp @@ -1,6 +1,6 @@ #include "vkvbo.hpp" -bool vkvbo::init(vkobjs &mvkobjs, vbodata &vbdata, size_t bsize) { +bool vkvbo::init(rvk &mvkobjs, vbodata &vbdata, size_t bsize) { VkBufferCreateInfo binfo{}; binfo.sType = VK_STRUCTURE_TYPE_BUFFER_CREATE_INFO; binfo.size = bsize; @@ -30,7 +30,7 @@ bool vkvbo::init(vkobjs &mvkobjs, vbodata &vbdata, size_t bsize) { return true; } -bool vkvbo::upload(vkobjs &mvkobjs, VkCommandBuffer &cbuffer, vbodata &vbdata, +bool vkvbo::upload(rvk &mvkobjs, VkCommandBuffer &cbuffer, vbodata &vbdata, std::vector vertexData) { /* copy data to staging buffer*/ @@ -61,7 +61,7 @@ bool vkvbo::upload(vkobjs &mvkobjs, VkCommandBuffer &cbuffer, vbodata &vbdata, return true; } -bool vkvbo::upload(vkobjs &mvkobjs, VkCommandBuffer &cbuffer, vbodata &vbdata, +bool vkvbo::upload(rvk &mvkobjs, VkCommandBuffer &cbuffer, vbodata &vbdata, std::vector vertexData) { void *data; @@ -91,7 +91,7 @@ bool vkvbo::upload(vkobjs &mvkobjs, VkCommandBuffer &cbuffer, vbodata &vbdata, return true; } -bool vkvbo::upload(vkobjs &mvkobjs, VkCommandBuffer &cbuffer, vbodata &vbdata, +bool vkvbo::upload(rvk &mvkobjs, VkCommandBuffer &cbuffer, vbodata &vbdata, const fastgltf::Buffer &buffer, const fastgltf::BufferView &bufferview, const fastgltf::Accessor &acc) { @@ -127,7 +127,7 @@ bool vkvbo::upload(vkobjs &mvkobjs, VkCommandBuffer &cbuffer, vbodata &vbdata, return true; } -bool vkvbo::upload(vkobjs &mvkobjs, VkCommandBuffer &cbuffer, vbodata &vbdata, +bool vkvbo::upload(rvk &mvkobjs, VkCommandBuffer &cbuffer, vbodata &vbdata, const std::vector &jointz, const unsigned int count, const unsigned int ofx) { void *d; @@ -158,7 +158,7 @@ bool vkvbo::upload(vkobjs &mvkobjs, VkCommandBuffer &cbuffer, vbodata &vbdata, return true; } -void vkvbo::cleanup(vkobjs &mvkobjs, vbodata &vbdata) { +void vkvbo::cleanup(rvk &mvkobjs, vbodata &vbdata) { vmaDestroyBuffer(mvkobjs.alloc, vbdata.sbuffer, vbdata.salloc); vmaDestroyBuffer(mvkobjs.alloc, vbdata.buffer, vbdata.alloc); } diff --git a/src/core/vkrenderer.cpp b/src/core/vkrenderer.cpp index c8d598f..6637e40 100644 --- a/src/core/vkrenderer.cpp +++ b/src/core/vkrenderer.cpp @@ -102,7 +102,7 @@ bool vkrenderer::initscene() { ui *vkrenderer::getuihandle() { return &mui; } -vkobjs &vkrenderer::getvkobjs() { +rvk &vkrenderer::getvkobjs() { return mvkobjs; } bool vkrenderer::quicksetup() { diff --git a/src/glue/playout.cpp b/src/glue/playout.cpp index e019823..3b3b8bf 100644 --- a/src/glue/playout.cpp +++ b/src/glue/playout.cpp @@ -2,7 +2,7 @@ #include "VkBootstrap.h" -bool playout::init(vkobjs &mvkobjs, VkPipelineLayout &vkplayout, std::vector layoutz, +bool playout::init(rvk &mvkobjs, VkPipelineLayout &vkplayout, std::vector layoutz, size_t pushc_size) { @@ -22,6 +22,6 @@ bool playout::init(vkobjs &mvkobjs, VkPipelineLayout &vkplayout, std::vector #include -bool pline::init(vkobjs &objs, VkPipelineLayout &playout, VkPipeline &pipeline, VkPrimitiveTopology topology, +bool pline::init(rvk &objs, VkPipelineLayout &playout, VkPipeline &pipeline, VkPrimitiveTopology topology, unsigned int v_in, unsigned int atts, std::vector sfiles, bool char_or_short) { if (sfiles.size() < 2) return false; @@ -183,6 +183,6 @@ bool pline::init(vkobjs &objs, VkPipelineLayout &playout, VkPipeline &pipeline, return true; } -void pline::cleanup(vkobjs &objs, VkPipeline &pipeline) { +void pline::cleanup(rvk &objs, VkPipeline &pipeline) { vkDestroyPipeline(objs.vkdevice.device, pipeline, nullptr); } diff --git a/src/glue/vktexture.cpp b/src/glue/vktexture.cpp index fc9e020..4d41df1 100644 --- a/src/glue/vktexture.cpp +++ b/src/glue/vktexture.cpp @@ -6,7 +6,7 @@ #include #include -bool vktexture::loadtexturefile(vkobjs &rdata, texdata &texdata, texdatapls &texdatapls, std::string filename) { +bool vktexture::loadtexturefile(rvk &rdata, texdata &texdata, texdatapls &texdatapls, std::string filename) { int w; int h; @@ -235,25 +235,14 @@ bool vktexture::loadtexturefile(vkobjs &rdata, texdata &texdata, texdatapls &tex return false; } - VkDescriptorPoolSize poolsize{}; - poolsize.type = VK_DESCRIPTOR_TYPE_COMBINED_IMAGE_SAMPLER; - poolsize.descriptorCount = imgsize; - - VkDescriptorPoolCreateInfo descriptorpool{}; - descriptorpool.sType = VK_STRUCTURE_TYPE_DESCRIPTOR_POOL_CREATE_INFO; - descriptorpool.poolSizeCount = 1; - descriptorpool.pPoolSizes = &poolsize; - descriptorpool.maxSets = 16; - - if (vkCreateDescriptorPool(rdata.vkdevice.device, &descriptorpool, nullptr, &texdatapls.dpool) != - VK_SUCCESS) { - logger::log(0, "crashed in texture at vkCreateDescriptorPool"); - return false; - } + std::array poolsize{}; + poolsize[0].type = VK_DESCRIPTOR_TYPE_COMBINED_IMAGE_SAMPLER; + poolsize[0].descriptorCount = imgsize; + rpool::create(poolsize,rdata.vkdevice.device,&rdata.dpools[rvk::idxtexpool]); VkDescriptorSetAllocateInfo descallocinfo{}; descallocinfo.sType = VK_STRUCTURE_TYPE_DESCRIPTOR_SET_ALLOCATE_INFO; - descallocinfo.descriptorPool = texdatapls.dpool; + descallocinfo.descriptorPool = rdata.dpools[rvk::idxtexpool]; descallocinfo.descriptorSetCount = 1; descallocinfo.pSetLayouts = &texdatapls.dlayout; @@ -280,7 +269,7 @@ bool vktexture::loadtexturefile(vkobjs &rdata, texdata &texdata, texdatapls &tex return true; } -bool vktexture::loadtexture(vkobjs &rdata, std::vector &texdata, fastgltf::Asset &mmodel) { +bool vktexture::loadtexture(rvk &rdata, std::vector &texdata, fastgltf::Asset &mmodel) { texdata.reserve(mmodel.images.size()); texdata.resize(mmodel.images.size()); @@ -513,7 +502,7 @@ bool vktexture::loadtexture(vkobjs &rdata, std::vector &texdata, fastgl return true; } -bool vktexture::loadtexlayoutpool(vkobjs &rdata, std::vector &texdata, texdatapls &texdatapls, +bool vktexture::loadtexlayoutpool(rvk &rdata, std::vector &texdata, texdatapls &texdatapls, fastgltf::Asset &mmodel) { VkDescriptorSetLayoutBinding texturebind; @@ -545,25 +534,16 @@ bool vktexture::loadtexlayoutpool(vkobjs &rdata, std::vector &texdata, return false; } - VkDescriptorPoolSize poolsize{}; - poolsize.type = VK_DESCRIPTOR_TYPE_COMBINED_IMAGE_SAMPLER; - poolsize.descriptorCount = mmodel.images.size() * 1024 * 1024 * 4; + std::array poolsize{}; + poolsize[0].type = VK_DESCRIPTOR_TYPE_COMBINED_IMAGE_SAMPLER; + poolsize[0].descriptorCount = mmodel.images.size() * 1024 * 1024 * 4; - VkDescriptorPoolCreateInfo descriptorpool{}; - descriptorpool.sType = VK_STRUCTURE_TYPE_DESCRIPTOR_POOL_CREATE_INFO; - descriptorpool.poolSizeCount = 1; - descriptorpool.pPoolSizes = &poolsize; - descriptorpool.maxSets = 16; - if (vkCreateDescriptorPool(rdata.vkdevice.device, &descriptorpool, nullptr, &texdatapls.dpool) != - VK_SUCCESS) { - logger::log(0, "crashed in texture at vkCreateDescriptorPool"); - return false; - } + rpool::create(poolsize,rdata.vkdevice.device,&rdata.dpools[rvk::idxtexpool]); VkDescriptorSetAllocateInfo descallocinfo{}; descallocinfo.sType = VK_STRUCTURE_TYPE_DESCRIPTOR_SET_ALLOCATE_INFO; - descallocinfo.descriptorPool = texdatapls.dpool; + descallocinfo.descriptorPool = rdata.dpools[rvk::idxtexpool]; descallocinfo.descriptorSetCount = 1; descallocinfo.pSetLayouts = &texdatapls.dlayout; @@ -586,13 +566,13 @@ bool vktexture::loadtexlayoutpool(vkobjs &rdata, std::vector &texdata, return true; } -void vktexture::cleanup(vkobjs &rdata, texdata &texdata) { +void vktexture::cleanup(rvk &rdata, texdata &texdata) { vkDestroySampler(rdata.vkdevice.device, texdata.imgsampler, nullptr); vkDestroyImageView(rdata.vkdevice.device, texdata.imgview, nullptr); vmaDestroyImage(rdata.alloc, texdata.img, texdata.alloc); } -void vktexture::cleanuppls(vkobjs &rdata, texdatapls &texdatapls) { - vkDestroyDescriptorPool(rdata.vkdevice.device, texdatapls.dpool, nullptr); +void vktexture::cleanuppls(rvk &rdata, texdatapls &texdatapls) { + vkDestroyDescriptorPool(rdata.vkdevice.device, rdata.dpools[rvk::idxtexpool], nullptr); vkDestroyDescriptorSetLayout(rdata.vkdevice.device, texdatapls.dlayout, nullptr); } diff --git a/src/model/genericmodel.cpp b/src/model/genericmodel.cpp index 27da469..97bf24b 100644 --- a/src/model/genericmodel.cpp +++ b/src/model/genericmodel.cpp @@ -15,7 +15,7 @@ #include "vkebo.hpp" #include "vkvbo.hpp" -bool genericmodel::loadmodel(vkobjs &objs, std::string fname) { +bool genericmodel::loadmodel(rvk &objs, std::string fname) { fastgltf::Parser fastparser{}; auto buff = fastgltf::MappedGltfFile::FromPath(fname); @@ -164,7 +164,7 @@ std::vector genericmodel::getnodetojoint() { return mnodetojoint; } -void genericmodel::createvboebo(vkobjs &objs) { //& joint vector +void genericmodel::createvboebo(rvk &objs) { //& joint vector jointuintofx.reserve(mmodel2.meshes.size()); jointuintofx.resize(mmodel2.meshes.size()); @@ -265,7 +265,7 @@ void genericmodel::createvboebo(vkobjs &objs) { //& joint vector } } -void genericmodel::uploadvboebo(vkobjs &objs, VkCommandBuffer &cbuffer) { +void genericmodel::uploadvboebo(rvk &objs, VkCommandBuffer &cbuffer) { for (size_t i{0}; i < mmodel2.meshes.size(); i++) { for (auto it = mmodel2.meshes[i].primitives.begin(); it < mmodel2.meshes[i].primitives.end(); it++) { @@ -318,7 +318,7 @@ size_t genericmodel::gettricount(size_t i, size_t j) { return c; } -void genericmodel::drawinstanced(vkobjs &objs, VkPipelineLayout &vkplayout, VkPipeline &vkpline, +void genericmodel::drawinstanced(rvk &objs, VkPipelineLayout &vkplayout, VkPipeline &vkpline, VkPipeline &vkplineuint, int instancecount, int stride) { VkDeviceSize offset = 0; std::vector> pushes(mgltfobjs.vbos.size()); @@ -362,7 +362,7 @@ void genericmodel::drawinstanced(vkobjs &objs, VkPipelineLayout &vkplayout, VkPi } } -void genericmodel::cleanup(vkobjs &objs) { +void genericmodel::cleanup(rvk &objs) { for (size_t i{0}; i < mgltfobjs.vbos.size(); i++) { for (size_t j{0}; j < mgltfobjs.vbos.at(i).size(); j++) { diff --git a/src/playout/playoutgeneric.cpp b/src/playout/playoutgeneric.cpp index 4f833e2..2a466ac 100644 --- a/src/playout/playoutgeneric.cpp +++ b/src/playout/playoutgeneric.cpp @@ -5,7 +5,7 @@ #include "buffer/ssbo.hpp" #include "ubo.hpp" -bool playoutgeneric::setup(vkobjs &objs, std::string fname, size_t count, std::string vfile, std::string ffile) { +bool playoutgeneric::setup(rvk &objs, std::string fname, size_t count, std::string vfile, std::string ffile) { if (!createubo(objs)) return false; if (!loadmodel(objs, fname)) @@ -25,14 +25,14 @@ bool playoutgeneric::setup(vkobjs &objs, std::string fname, size_t count, std::s return true; } -bool playoutgeneric::loadmodel(vkobjs &objs, std::string fname) { +bool playoutgeneric::loadmodel(rvk &objs, std::string fname) { mgltf = std::make_shared(); if (!mgltf->loadmodel(objs, fname)) return false; return true; } -bool playoutgeneric::createinstances(vkobjs &objs, size_t count, bool rand) { +bool playoutgeneric::createinstances(rvk &objs, size_t count, bool rand) { size_t numTriangles{}; for (size_t i{0}; i < count; ++i) { minstances.emplace_back(std::make_shared(mgltf, glm::vec3{0.0f, 0.0f, 0.0f}, rand)); @@ -45,14 +45,14 @@ bool playoutgeneric::createinstances(vkobjs &objs, size_t count, bool rand) { return false; return true; } -bool playoutgeneric::createubo(vkobjs &objs) { +bool playoutgeneric::createubo(rvk &objs) { if (!ubo::init(objs, rdperspviewmatrixubo)) return false; desclayouts.push_back(rdperspviewmatrixubo[0].dlayout); return true; } -bool playoutgeneric::createssbomat(vkobjs &objs) { +bool playoutgeneric::createssbomat(rvk &objs) { size_t size = numinstancess * SDL_clamp(minstances[0]->getjointmatrixsize(), 1, minstances[0]->getjointmatrixsize()) * sizeof(glm::mat4); if (!ssbo::init(objs, rdjointmatrixssbo, size)) @@ -60,7 +60,7 @@ bool playoutgeneric::createssbomat(vkobjs &objs) { desclayouts.push_back(rdjointmatrixssbo.dlayout); return true; } -bool playoutgeneric::createplayout(vkobjs &objs) { +bool playoutgeneric::createplayout(rvk &objs) { texdatapls texdatapls0 = mgltf->gettexdatapls(); desclayouts.insert(desclayouts.begin(), texdatapls0.dlayout); if (!playout::init(objs, rdgltfpipelinelayout, desclayouts, sizeof(vkpushconstants))) @@ -68,7 +68,7 @@ bool playoutgeneric::createplayout(vkobjs &objs) { return true; } -bool playoutgeneric::createpline(vkobjs &objs, std::string vfile, std::string ffile) { +bool playoutgeneric::createpline(rvk &objs, std::string vfile, std::string ffile) { if (!pline::init(objs, rdgltfpipelinelayout, rdgltfgpupipeline, VK_PRIMITIVE_TOPOLOGY_TRIANGLE_LIST, 5, 31, std::vector {vfile, ffile})) return false; @@ -85,14 +85,14 @@ void playoutgeneric::updateanims() { } } -void playoutgeneric::uploadvboebo(vkobjs &objs, VkCommandBuffer &cbuffer) { +void playoutgeneric::uploadvboebo(rvk &objs, VkCommandBuffer &cbuffer) { if (uploadreq) { mgltf->uploadvboebo(objs, cbuffer); uploadreq = false; } } -void playoutgeneric::uploadubossbo(vkobjs &objs, std::vector &cammats) { +void playoutgeneric::uploadubossbo(rvk &objs, std::vector &cammats) { vkCmdBindDescriptorSets(objs.cbuffers_graphics.at(0), VK_PIPELINE_BIND_POINT_GRAPHICS, rdgltfpipelinelayout, 1, 1, &rdperspviewmatrixubo[0].dset, 0, nullptr); vkCmdBindDescriptorSets(objs.cbuffers_graphics.at(0), VK_PIPELINE_BIND_POINT_GRAPHICS, rdgltfpipelinelayout, 2, 1, @@ -131,23 +131,23 @@ void playoutgeneric::updatemats() { } } -void playoutgeneric::cleanuplines(vkobjs &objs) { +void playoutgeneric::cleanuplines(rvk &objs) { pline::cleanup(objs, rdgltfgpupipeline); pline::cleanup(objs, rdgltfgpupipelineuint); playout::cleanup(objs, rdgltfpipelinelayout); } -void playoutgeneric::cleanupbuffers(vkobjs &objs) { +void playoutgeneric::cleanupbuffers(rvk &objs) { ubo::cleanup(objs, rdperspviewmatrixubo); ssbo::cleanup(objs, rdjointmatrixssbo); } -void playoutgeneric::cleanupmodels(vkobjs &objs) { +void playoutgeneric::cleanupmodels(rvk &objs) { mgltf->cleanup(objs); mgltf.reset(); } -void playoutgeneric::draw(vkobjs &objs) { +void playoutgeneric::draw(rvk &objs) { if (minstances[0]->getinstancesettings().msdrawmodel) { stride = minstances.at(0)->getjointmatrixsize(); diff --git a/src/subcore/vkcam.cpp b/src/subcore/vkcam.cpp index 436d12d..8fc44b5 100644 --- a/src/subcore/vkcam.cpp +++ b/src/subcore/vkcam.cpp @@ -5,7 +5,7 @@ #include #include -glm::mat4 vkcam::getview(vkobjs &mvkobjs) { +glm::mat4 vkcam::getview(rvk &mvkobjs) { mforward = glm::normalize( glm::vec3{glm::sin(glm::radians(mvkobjs.azimuth)) * glm::cos(glm::radians(mvkobjs.elevation)), glm::sin(glm::radians(mvkobjs.elevation)), diff --git a/src/vk/renderpass.cpp b/src/vk/renderpass.cpp index 32747db..a6f2ed2 100644 --- a/src/vk/renderpass.cpp +++ b/src/vk/renderpass.cpp @@ -1,7 +1,7 @@ #include "renderpass.hpp" #include -bool renderpass::init(vkobjs &rdata) { +bool renderpass::init(rvk &rdata) { VkAttachmentDescription colora{}; colora.format = rdata.schain.image_format; colora.samples = VK_SAMPLE_COUNT_1_BIT; @@ -63,6 +63,6 @@ bool renderpass::init(vkobjs &rdata) { return true; } -void renderpass::cleanup(vkobjs &rdata) { +void renderpass::cleanup(rvk &rdata) { vkDestroyRenderPass(rdata.vkdevice.device, rdata.rdrenderpass, nullptr); } diff --git a/src/vk/vksyncobjects.cpp b/src/vk/vksyncobjects.cpp index f247d4b..a8e8cad 100644 --- a/src/vk/vksyncobjects.cpp +++ b/src/vk/vksyncobjects.cpp @@ -1,6 +1,6 @@ #include "vksyncobjects.hpp" -bool vksyncobjects::init(vkobjs &rdata) { +bool vksyncobjects::init(rvk &rdata) { VkFenceCreateInfo fenceinfo{}; fenceinfo.sType = VK_STRUCTURE_TYPE_FENCE_CREATE_INFO; @@ -17,7 +17,7 @@ bool vksyncobjects::init(vkobjs &rdata) { } return true; } -void vksyncobjects::cleanup(vkobjs &rdata) { +void vksyncobjects::cleanup(rvk &rdata) { vkDestroySemaphore(rdata.vkdevice.device, rdata.presentsemaphore, nullptr); vkDestroySemaphore(rdata.vkdevice.device, rdata.rendersemaphore, nullptr); vkDestroyFence(rdata.vkdevice.device, rdata.renderfence, nullptr); From b6152010edaf00671de97e03fd2739fe13a43b70 Mon Sep 17 00:00:00 2001 From: r Date: Sat, 28 Jun 2025 20:15:56 +0300 Subject: [PATCH 13/40] moving pools 2 --- include/buffer/ssbo.hpp | 8 ++++---- include/{vkobjs.hpp => core/rvk.hpp} | 23 +++++------------------ include/exp/particle.hpp | 2 +- include/genericinstance.hpp | 2 +- include/genericmodel.hpp | 4 ++-- include/modelsettings.hpp | 2 +- include/playout.hpp | 2 +- include/playoutgeneric.hpp | 2 +- include/pline.hpp | 2 +- include/renderpass.hpp | 2 +- include/ubo.hpp | 2 +- include/ui.hpp | 2 +- include/vk/commandbuffer.hpp | 2 +- include/vk/commandpool.hpp | 2 +- include/vk/framebuffer.hpp | 2 +- include/vkcam.hpp | 2 +- include/vkebo.hpp | 2 +- include/vkrenderer.hpp | 2 +- include/vksyncobjects.hpp | 2 +- include/vktexture.hpp | 8 ++++---- include/vkvbo.hpp | 2 +- src/auxiliary/ui.cpp | 10 +++++----- src/buffer/ubo.cpp | 6 +++--- src/glue/vktexture.cpp | 6 +++--- src/model/genericmodel.cpp | 2 +- src/playout/playoutgeneric.cpp | 2 +- 26 files changed, 45 insertions(+), 58 deletions(-) rename include/{vkobjs.hpp => core/rvk.hpp} (89%) diff --git a/include/buffer/ssbo.hpp b/include/buffer/ssbo.hpp index ab30223..6dd9fb9 100644 --- a/include/buffer/ssbo.hpp +++ b/include/buffer/ssbo.hpp @@ -3,13 +3,13 @@ #include #include -#include "vkobjs.hpp" +#include "core/rvk.hpp" namespace ssbo { static inline bool init(rvk &objs, ssbodata &ssboData, size_t buffersize) { std::vector pool0{{VK_DESCRIPTOR_TYPE_STORAGE_BUFFER,1}}; - if(!rpool::create(pool0,objs.vkdevice.device,&ssboData.dpool))return false; + if(!rpool::create(pool0,objs.vkdevice.device,&objs.dpools[rvk::idxssbopool]))return false; VkBufferCreateInfo bufferInfo{}; bufferInfo.sType = VK_STRUCTURE_TYPE_BUFFER_CREATE_INFO; @@ -44,7 +44,7 @@ static inline bool init(rvk &objs, ssbodata &ssboData, size_t buffersize) { VkDescriptorSetAllocateInfo descriptorAllocateInfo{}; descriptorAllocateInfo.sType = VK_STRUCTURE_TYPE_DESCRIPTOR_SET_ALLOCATE_INFO; - descriptorAllocateInfo.descriptorPool = ssboData.dpool; + descriptorAllocateInfo.descriptorPool = objs.dpools[rvk::idxssbopool]; descriptorAllocateInfo.descriptorSetCount = 1; descriptorAllocateInfo.pSetLayouts = &ssboData.dlayout; @@ -87,7 +87,7 @@ static inline void upload(const rvk &objs, const ssbodata &ssbodata, const std:: vmaUnmapMemory(objs.alloc, ssbodata.alloc); } static inline void cleanup(rvk &objs, ssbodata &ssbodata) { - rpool::destroy(objs.vkdevice.device, ssbodata.dpool); + rpool::destroy(objs.vkdevice.device, objs.dpools[rvk::idxssbopool]); vkDestroyDescriptorSetLayout(objs.vkdevice.device, ssbodata.dlayout, nullptr); vmaDestroyBuffer(objs.alloc, ssbodata.buffer, ssbodata.alloc); } diff --git a/include/vkobjs.hpp b/include/core/rvk.hpp similarity index 89% rename from include/vkobjs.hpp rename to include/core/rvk.hpp index 9fcb5d8..e2fe39d 100644 --- a/include/vkobjs.hpp +++ b/include/core/rvk.hpp @@ -24,8 +24,7 @@ struct texdata { VkSampler imgsampler = VK_NULL_HANDLE; VmaAllocation alloc = nullptr; }; -struct texdatapls { - VkDescriptorPool dpool = VK_NULL_HANDLE; +struct texdataset { VkDescriptorSetLayout dlayout = VK_NULL_HANDLE; VkDescriptorSet dset = VK_NULL_HANDLE; }; @@ -54,7 +53,6 @@ struct ubodata { VkBuffer buffer = VK_NULL_HANDLE; VmaAllocation alloc = nullptr; - VkDescriptorPool dpool = VK_NULL_HANDLE; VkDescriptorSetLayout dlayout = VK_NULL_HANDLE; VkDescriptorSet dset = VK_NULL_HANDLE; }; @@ -64,17 +62,6 @@ struct ssbodata { VkBuffer buffer = VK_NULL_HANDLE; VmaAllocation alloc = nullptr; - VkDescriptorPool dpool = VK_NULL_HANDLE; - VkDescriptorSetLayout dlayout = VK_NULL_HANDLE; - VkDescriptorSet dset = VK_NULL_HANDLE; -}; - -struct buffdata { - size_t size{0}; - VkBuffer buffer = VK_NULL_HANDLE; - VmaAllocation alloc = nullptr; - - VkDescriptorPool dpool = VK_NULL_HANDLE; VkDescriptorSetLayout dlayout = VK_NULL_HANDLE; VkDescriptorSet dset = VK_NULL_HANDLE; }; @@ -164,16 +151,16 @@ struct rvk { inline static constexpr size_t idxubopool{0}; inline static constexpr size_t idxtexpool{1}; inline static constexpr size_t idxssbopool{2}; - - std::array dpools = {VK_NULL_HANDLE, VK_NULL_HANDLE, VK_NULL_HANDLE}; - VkDescriptorPool imguidpool = VK_NULL_HANDLE; + inline static constexpr size_t idximguipool{3}; + inline static constexpr size_t idxparticlepool{4}; + std::array dpools = {VK_NULL_HANDLE, VK_NULL_HANDLE, VK_NULL_HANDLE,VK_NULL_HANDLE,VK_NULL_HANDLE,VK_NULL_HANDLE}; }; struct vkgltfobjs { std::vector>> vbos{}; std::vector> ebos{}; std::vector texs{}; - texdatapls texpls{}; + texdataset texpls{}; }; namespace rpool { static inline bool create(const std::span& pools,const VkDevice& dev,VkDescriptorPool* dpool) { diff --git a/include/exp/particle.hpp b/include/exp/particle.hpp index d8e59dd..33c261c 100644 --- a/include/exp/particle.hpp +++ b/include/exp/particle.hpp @@ -1,5 +1,5 @@ #pragma once -#include "vkobjs.hpp" +#include "core/rvk.hpp" #include "vkshader.hpp" #include #include diff --git a/include/genericinstance.hpp b/include/genericinstance.hpp index 6251db3..bb66298 100644 --- a/include/genericinstance.hpp +++ b/include/genericinstance.hpp @@ -10,7 +10,7 @@ #include "modelsettings.hpp" #include "vkclip.hpp" #include "vknode.hpp" -#include "vkobjs.hpp" +#include "core/rvk.hpp" class genericinstance { public: diff --git a/include/genericmodel.hpp b/include/genericmodel.hpp index cb399d1..a4df304 100644 --- a/include/genericmodel.hpp +++ b/include/genericmodel.hpp @@ -1,7 +1,7 @@ #pragma once #include "vkclip.hpp" #include "vknode.hpp" -#include "vkobjs.hpp" +#include "core/rvk.hpp" #include #include #include @@ -25,7 +25,7 @@ class genericmodel { void cleanup(rvk &objs); void uploadvboebo(rvk &objs, VkCommandBuffer &cbuffer); std::vector gettexdata(); - texdatapls gettexdatapls(); + texdataset gettexdatapls(); std::string getmodelfname(); int getnodecount(); gltfnodedata getgltfnodes(); diff --git a/include/modelsettings.hpp b/include/modelsettings.hpp index 3212bcb..afc1b79 100644 --- a/include/modelsettings.hpp +++ b/include/modelsettings.hpp @@ -1,6 +1,6 @@ #pragma once -#include "vkobjs.hpp" +#include "core/rvk.hpp" #include #include #include diff --git a/include/playout.hpp b/include/playout.hpp index f3bbb7e..1e0f067 100644 --- a/include/playout.hpp +++ b/include/playout.hpp @@ -1,5 +1,5 @@ #pragma once -#include "vkobjs.hpp" +#include "core/rvk.hpp" #include class playout { diff --git a/include/playoutgeneric.hpp b/include/playoutgeneric.hpp index 0c8a157..e5c9744 100644 --- a/include/playoutgeneric.hpp +++ b/include/playoutgeneric.hpp @@ -1,6 +1,6 @@ #pragma once #include "genericinstance.hpp" -#include "vkobjs.hpp" +#include "core/rvk.hpp" #include #include #include diff --git a/include/pline.hpp b/include/pline.hpp index 5cb4917..01e4653 100644 --- a/include/pline.hpp +++ b/include/pline.hpp @@ -1,5 +1,5 @@ #pragma once -#include "vkobjs.hpp" +#include "core/rvk.hpp" #include #include diff --git a/include/renderpass.hpp b/include/renderpass.hpp index e2b1cc2..f0b40ab 100644 --- a/include/renderpass.hpp +++ b/include/renderpass.hpp @@ -1,5 +1,5 @@ #pragma once -#include "vkobjs.hpp" +#include "core/rvk.hpp" #include class renderpass { public: diff --git a/include/ubo.hpp b/include/ubo.hpp index 94c1dff..8e78da2 100644 --- a/include/ubo.hpp +++ b/include/ubo.hpp @@ -1,5 +1,5 @@ #pragma once -#include "vkobjs.hpp" +#include "core/rvk.hpp" #include #include class ubo { diff --git a/include/ui.hpp b/include/ui.hpp index e762428..02d38e2 100644 --- a/include/ui.hpp +++ b/include/ui.hpp @@ -2,7 +2,7 @@ #include #include "modelsettings.hpp" -#include "vkobjs.hpp" +#include "core/rvk.hpp" enum struct ppick { rock, paper, scissor }; enum struct gstate { tie, ai, player }; diff --git a/include/vk/commandbuffer.hpp b/include/vk/commandbuffer.hpp index 3c6a6b3..a4d3bd9 100644 --- a/include/vk/commandbuffer.hpp +++ b/include/vk/commandbuffer.hpp @@ -1,5 +1,5 @@ #pragma once -#include "vkobjs.hpp" +#include "core/rvk.hpp" #include #include namespace commandbuffer { diff --git a/include/vk/commandpool.hpp b/include/vk/commandpool.hpp index 4de85f0..fde9985 100644 --- a/include/vk/commandpool.hpp +++ b/include/vk/commandpool.hpp @@ -1,5 +1,5 @@ #pragma once -#include "vkobjs.hpp" +#include "core/rvk.hpp" #include #include diff --git a/include/vk/framebuffer.hpp b/include/vk/framebuffer.hpp index f2c5a7c..db6f355 100644 --- a/include/vk/framebuffer.hpp +++ b/include/vk/framebuffer.hpp @@ -1,6 +1,6 @@ #pragma once -#include "vkobjs.hpp" +#include "core/rvk.hpp" #include namespace framebuffer { diff --git a/include/vkcam.hpp b/include/vkcam.hpp index e0d57dd..4c26020 100644 --- a/include/vkcam.hpp +++ b/include/vkcam.hpp @@ -1,7 +1,7 @@ #pragma once #define GLM_ENABLE_EXPERIMENTAL -#include "vkobjs.hpp" +#include "core/rvk.hpp" #include class vkcam { diff --git a/include/vkebo.hpp b/include/vkebo.hpp index 82bce54..c114f44 100644 --- a/include/vkebo.hpp +++ b/include/vkebo.hpp @@ -1,7 +1,7 @@ #pragma once #include // #include -#include "vkobjs.hpp" +#include "core/rvk.hpp" #include class vkebo { public: diff --git a/include/vkrenderer.hpp b/include/vkrenderer.hpp index 9a1da5e..a94b388 100644 --- a/include/vkrenderer.hpp +++ b/include/vkrenderer.hpp @@ -21,7 +21,7 @@ #include "playoutgeneric.hpp" -#include "vkobjs.hpp" +#include "core/rvk.hpp" class vkrenderer { public: diff --git a/include/vksyncobjects.hpp b/include/vksyncobjects.hpp index cae2b15..a21758b 100644 --- a/include/vksyncobjects.hpp +++ b/include/vksyncobjects.hpp @@ -1,5 +1,5 @@ #pragma once -#include "vkobjs.hpp" +#include "core/rvk.hpp" #include #include class vksyncobjects { diff --git a/include/vktexture.hpp b/include/vktexture.hpp index 52a9ff2..aa318f5 100644 --- a/include/vktexture.hpp +++ b/include/vktexture.hpp @@ -1,14 +1,14 @@ #pragma once -#include "vkobjs.hpp" +#include "core/rvk.hpp" #include // #include "tinygltf/tiny_gltf.h" #include class vktexture { public: - static bool loadtexturefile(rvk &rdata, texdata &texdata, texdatapls &texdatapls, std::string texfile); + static bool loadtexturefile(rvk &rdata, texdata &texdata, texdataset &texdatapls, std::string texfile); static bool loadtexture(rvk &rdata, std::vector &texdata, fastgltf::Asset &mmodel); - static bool loadtexlayoutpool(rvk &rdata, std::vector &texdata, texdatapls &texdatapls, + static bool loadtexlayoutpool(rvk &rdata, std::vector &texdata, texdataset &texdatapls, fastgltf::Asset &mmodel); static void cleanup(rvk &rdata, texdata &texdata); - static void cleanuppls(rvk &rdata, texdatapls &texdatapls); + static void cleanuppls(rvk &rdata, texdataset &texdatapls); }; diff --git a/include/vkvbo.hpp b/include/vkvbo.hpp index 344e061..de67cd3 100644 --- a/include/vkvbo.hpp +++ b/include/vkvbo.hpp @@ -1,6 +1,6 @@ #pragma once #include -#include "vkobjs.hpp" +#include "core/rvk.hpp" #include class vkvbo { public: diff --git a/src/auxiliary/ui.cpp b/src/auxiliary/ui.cpp index 4537672..b4c371d 100644 --- a/src/auxiliary/ui.cpp +++ b/src/auxiliary/ui.cpp @@ -42,9 +42,9 @@ bool ui::init(rvk &renderData) { imguiPoolInfo.maxSets = 24; imguiPoolInfo.poolSizeCount = imguiPoolSizes.size(); imguiPoolInfo.pPoolSizes = imguiPoolSizes.data(); - + if (vkCreateDescriptorPool(renderData.vkdevice.device, &imguiPoolInfo, nullptr, - &renderData.imguidpool)) { + &renderData.dpools[rvk::idximguipool])) { return false; } ImGui_ImplSDL3_InitForVulkan(renderData.wind); @@ -54,7 +54,7 @@ bool ui::init(rvk &renderData) { imguiIinitInfo.PhysicalDevice = renderData.physdev.physical_device; imguiIinitInfo.Device = renderData.vkdevice.device; imguiIinitInfo.Queue = renderData.graphicsQ; - imguiIinitInfo.DescriptorPool = renderData.imguidpool; + imguiIinitInfo.DescriptorPool = renderData.dpools[rvk::idximguipool]; imguiIinitInfo.MinImageCount = 2; imguiIinitInfo.ImageCount = renderData.schainimgs.size(); imguiIinitInfo.MSAASamples = VK_SAMPLE_COUNT_1_BIT; @@ -73,7 +73,7 @@ bool ui::init(rvk &renderData) { if (vkResetCommandBuffer(imguiCommandBuffer.at(0), 0) != VK_SUCCESS) { return false; } - + VkCommandBufferBeginInfo cmdBeginInfo{}; cmdBeginInfo.sType = VK_STRUCTURE_TYPE_COMMAND_BUFFER_BEGIN_INFO; cmdBeginInfo.flags = VK_COMMAND_BUFFER_USAGE_ONE_TIME_SUBMIT_BIT; @@ -867,7 +867,7 @@ void ui::render(rvk &renderData, VkCommandBuffer &cbuffer) { void ui::cleanup(rvk &mvkobjs) { ImGui_ImplVulkan_Shutdown(); - vkDestroyDescriptorPool(mvkobjs.vkdevice.device, mvkobjs.imguidpool, nullptr); + vkDestroyDescriptorPool(mvkobjs.vkdevice.device, mvkobjs.dpools[rvk::idximguipool], nullptr); ImGui_ImplSDL3_Shutdown(); ImGui::DestroyContext(); } diff --git a/src/buffer/ubo.cpp b/src/buffer/ubo.cpp index 66f2c2f..09ebe27 100644 --- a/src/buffer/ubo.cpp +++ b/src/buffer/ubo.cpp @@ -47,11 +47,11 @@ bool ubo::init(rvk &mvkobjs, std::vector &ubodata) { poolsize[0].type = VK_DESCRIPTOR_TYPE_UNIFORM_BUFFER; poolsize[0].descriptorCount = 1 * (ubodata.size() * sizeof(glm::mat4) + sizeof(unsigned int)); - rpool::create(poolsize,mvkobjs.vkdevice.device, &ubodata[0].dpool); + rpool::create(poolsize,mvkobjs.vkdevice.device, &mvkobjs.dpools[rvk::idxubopool]); VkDescriptorSetAllocateInfo dallocinfo{}; dallocinfo.sType = VK_STRUCTURE_TYPE_DESCRIPTOR_SET_ALLOCATE_INFO; - dallocinfo.descriptorPool = ubodata[0].dpool; + dallocinfo.descriptorPool = mvkobjs.dpools[rvk::idxubopool]; dallocinfo.descriptorSetCount = 1; dallocinfo.pSetLayouts = &ubodata[0].dlayout; @@ -94,7 +94,7 @@ void ubo::upload(rvk &mvkobjs, std::vector &ubodata, std::vector &ubodata) { for (size_t i{0}; i < ubodata.size(); i++) { - vkDestroyDescriptorPool(mvkobjs.vkdevice.device, ubodata[i].dpool, nullptr); + vkDestroyDescriptorPool(mvkobjs.vkdevice.device, mvkobjs.dpools[rvk::idxubopool], nullptr); vkDestroyDescriptorSetLayout(mvkobjs.vkdevice.device, ubodata[i].dlayout, nullptr); vmaDestroyBuffer(mvkobjs.alloc, ubodata[i].buffer, ubodata[i].alloc); } diff --git a/src/glue/vktexture.cpp b/src/glue/vktexture.cpp index 4d41df1..7212b96 100644 --- a/src/glue/vktexture.cpp +++ b/src/glue/vktexture.cpp @@ -6,7 +6,7 @@ #include #include -bool vktexture::loadtexturefile(rvk &rdata, texdata &texdata, texdatapls &texdatapls, std::string filename) { +bool vktexture::loadtexturefile(rvk &rdata, texdata &texdata, texdataset &texdatapls, std::string filename) { int w; int h; @@ -502,7 +502,7 @@ bool vktexture::loadtexture(rvk &rdata, std::vector &texdata, fastgltf: return true; } -bool vktexture::loadtexlayoutpool(rvk &rdata, std::vector &texdata, texdatapls &texdatapls, +bool vktexture::loadtexlayoutpool(rvk &rdata, std::vector &texdata, texdataset &texdatapls, fastgltf::Asset &mmodel) { VkDescriptorSetLayoutBinding texturebind; @@ -572,7 +572,7 @@ void vktexture::cleanup(rvk &rdata, texdata &texdata) { vmaDestroyImage(rdata.alloc, texdata.img, texdata.alloc); } -void vktexture::cleanuppls(rvk &rdata, texdatapls &texdatapls) { +void vktexture::cleanuppls(rvk &rdata, texdataset &texdatapls) { vkDestroyDescriptorPool(rdata.vkdevice.device, rdata.dpools[rvk::idxtexpool], nullptr); vkDestroyDescriptorSetLayout(rdata.vkdevice.device, texdatapls.dlayout, nullptr); } diff --git a/src/model/genericmodel.cpp b/src/model/genericmodel.cpp index 97bf24b..d73cc7d 100644 --- a/src/model/genericmodel.cpp +++ b/src/model/genericmodel.cpp @@ -388,6 +388,6 @@ std::vector genericmodel::gettexdata() { return mgltfobjs.texs; } -texdatapls genericmodel::gettexdatapls() { +texdataset genericmodel::gettexdatapls() { return mgltfobjs.texpls; } diff --git a/src/playout/playoutgeneric.cpp b/src/playout/playoutgeneric.cpp index 2a466ac..23fc842 100644 --- a/src/playout/playoutgeneric.cpp +++ b/src/playout/playoutgeneric.cpp @@ -61,7 +61,7 @@ bool playoutgeneric::createssbomat(rvk &objs) { return true; } bool playoutgeneric::createplayout(rvk &objs) { - texdatapls texdatapls0 = mgltf->gettexdatapls(); + texdataset texdatapls0 = mgltf->gettexdatapls(); desclayouts.insert(desclayouts.begin(), texdatapls0.dlayout); if (!playout::init(objs, rdgltfpipelinelayout, desclayouts, sizeof(vkpushconstants))) return false; From 7265ba00bb69497d4467c33720edb8c39937e424 Mon Sep 17 00:00:00 2001 From: r Date: Sun, 29 Jun 2025 09:49:59 +0300 Subject: [PATCH 14/40] moving pools --- include/buffer/ssbo.hpp | 6 +- include/core/rvk.hpp | 13 +- include/genericmodel.hpp | 1 + include/playoutgeneric.hpp | 2 + include/vkrenderer.hpp | 2 + include/vktexture.hpp | 3 +- src/auxiliary/ui.cpp | 55 +------ src/buffer/ubo.cpp | 9 +- src/core/vkrenderer.cpp | 14 +- src/glue/vktexture.cpp | 275 +-------------------------------- src/model/genericmodel.cpp | 4 +- src/playout/playoutgeneric.cpp | 21 +-- 12 files changed, 42 insertions(+), 363 deletions(-) diff --git a/include/buffer/ssbo.hpp b/include/buffer/ssbo.hpp index 6dd9fb9..66561c3 100644 --- a/include/buffer/ssbo.hpp +++ b/include/buffer/ssbo.hpp @@ -8,9 +8,6 @@ namespace ssbo { static inline bool init(rvk &objs, ssbodata &ssboData, size_t buffersize) { - std::vector pool0{{VK_DESCRIPTOR_TYPE_STORAGE_BUFFER,1}}; - if(!rpool::create(pool0,objs.vkdevice.device,&objs.dpools[rvk::idxssbopool]))return false; - VkBufferCreateInfo bufferInfo{}; bufferInfo.sType = VK_STRUCTURE_TYPE_BUFFER_CREATE_INFO; bufferInfo.size = buffersize; @@ -44,7 +41,7 @@ static inline bool init(rvk &objs, ssbodata &ssboData, size_t buffersize) { VkDescriptorSetAllocateInfo descriptorAllocateInfo{}; descriptorAllocateInfo.sType = VK_STRUCTURE_TYPE_DESCRIPTOR_SET_ALLOCATE_INFO; - descriptorAllocateInfo.descriptorPool = objs.dpools[rvk::idxssbopool]; + descriptorAllocateInfo.descriptorPool = objs.dpools[rvk::idxinitpool]; descriptorAllocateInfo.descriptorSetCount = 1; descriptorAllocateInfo.pSetLayouts = &ssboData.dlayout; @@ -87,7 +84,6 @@ static inline void upload(const rvk &objs, const ssbodata &ssbodata, const std:: vmaUnmapMemory(objs.alloc, ssbodata.alloc); } static inline void cleanup(rvk &objs, ssbodata &ssbodata) { - rpool::destroy(objs.vkdevice.device, objs.dpools[rvk::idxssbopool]); vkDestroyDescriptorSetLayout(objs.vkdevice.device, ssbodata.dlayout, nullptr); vmaDestroyBuffer(objs.alloc, ssbodata.buffer, ssbodata.alloc); } diff --git a/include/core/rvk.hpp b/include/core/rvk.hpp index e2fe39d..79e557a 100644 --- a/include/core/rvk.hpp +++ b/include/core/rvk.hpp @@ -148,12 +148,13 @@ struct rvk { VkFence renderfence = VK_NULL_HANDLE; VkFence uploadfence = VK_NULL_HANDLE; - inline static constexpr size_t idxubopool{0}; - inline static constexpr size_t idxtexpool{1}; - inline static constexpr size_t idxssbopool{2}; - inline static constexpr size_t idximguipool{3}; - inline static constexpr size_t idxparticlepool{4}; - std::array dpools = {VK_NULL_HANDLE, VK_NULL_HANDLE, VK_NULL_HANDLE,VK_NULL_HANDLE,VK_NULL_HANDLE,VK_NULL_HANDLE}; + inline static constexpr size_t idxinitpool{0}; + inline static constexpr size_t idximguipool{1}; + inline static constexpr size_t idxruntimepool0{2}; + inline static constexpr size_t idxruntimepool1{3}; + inline static constexpr size_t idxruntimepool2{4}; + inline static constexpr size_t idxruntimepool3{5}; + std::array dpools = {VK_NULL_HANDLE, VK_NULL_HANDLE, VK_NULL_HANDLE,VK_NULL_HANDLE,VK_NULL_HANDLE,VK_NULL_HANDLE}; }; struct vkgltfobjs { diff --git a/include/genericmodel.hpp b/include/genericmodel.hpp index a4df304..449bf60 100644 --- a/include/genericmodel.hpp +++ b/include/genericmodel.hpp @@ -37,6 +37,7 @@ class genericmodel { std::vector> getanimclips(); void resetnodedata(std::shared_ptr treenode); + bool skinned{true}; private: std::vector meshjointtype{}; diff --git a/include/playoutgeneric.hpp b/include/playoutgeneric.hpp index e5c9744..cc090bf 100644 --- a/include/playoutgeneric.hpp +++ b/include/playoutgeneric.hpp @@ -14,6 +14,7 @@ class playoutgeneric { bool createssbomat(rvk &objs); bool createplayout(rvk &objs); bool createpline(rvk &objs, std::string vfile, std::string ffile); + bool createplinestatic(rvk &objs, std::string vfile, std::string ffile); bool setup(rvk &objs, std::string fname, size_t count, std::string vfile, std::string ffile); void draw(rvk &objs); void updateanims(); @@ -34,6 +35,7 @@ class playoutgeneric { VkPipelineLayout rdgltfpipelinelayout = VK_NULL_HANDLE; VkPipeline rdgltfgpupipeline = VK_NULL_HANDLE; VkPipeline rdgltfgpupipelineuint = VK_NULL_HANDLE; + VkPipeline staticpline = VK_NULL_HANDLE; std::vector rdperspviewmatrixubo{}; ssbodata rdjointmatrixssbo{}; diff --git a/include/vkrenderer.hpp b/include/vkrenderer.hpp index a94b388..18192e4 100644 --- a/include/vkrenderer.hpp +++ b/include/vkrenderer.hpp @@ -40,6 +40,7 @@ class vkrenderer { ui *getuihandle(); void moveplayer(); + void sdlevent(SDL_Event *e); @@ -131,6 +132,7 @@ class vkrenderer { std::vector mpersviewmats{glm::mat4{1.0f},glm::mat4{1.0f}}; + bool createpools(); bool deviceinit(); bool getqueue(); bool createdepthbuffer(); diff --git a/include/vktexture.hpp b/include/vktexture.hpp index aa318f5..7a9b8bd 100644 --- a/include/vktexture.hpp +++ b/include/vktexture.hpp @@ -5,9 +5,8 @@ #include class vktexture { public: - static bool loadtexturefile(rvk &rdata, texdata &texdata, texdataset &texdatapls, std::string texfile); static bool loadtexture(rvk &rdata, std::vector &texdata, fastgltf::Asset &mmodel); - static bool loadtexlayoutpool(rvk &rdata, std::vector &texdata, texdataset &texdatapls, + static bool loadtexlayout(rvk &rdata, std::vector &texdata, texdataset &texdatapls, fastgltf::Asset &mmodel); static void cleanup(rvk &rdata, texdata &texdata); static void cleanuppls(rvk &rdata, texdataset &texdatapls); diff --git a/src/auxiliary/ui.cpp b/src/auxiliary/ui.cpp index b4c371d..c25606e 100644 --- a/src/auxiliary/ui.cpp +++ b/src/auxiliary/ui.cpp @@ -23,7 +23,7 @@ bool ui::init(rvk &renderData) { io.Fonts->AddFontFromFileTTF("resources/comicbd.ttf", 29.0f); io.Fonts->AddFontFromFileTTF("resources/bruce.ttf", 52.0f); - std::vector imguiPoolSizes = {{VK_DESCRIPTOR_TYPE_SAMPLER, 24}, + std::array imguiPoolSizes{{{VK_DESCRIPTOR_TYPE_SAMPLER, 24}, {VK_DESCRIPTOR_TYPE_COMBINED_IMAGE_SAMPLER, 24}, {VK_DESCRIPTOR_TYPE_SAMPLED_IMAGE, 24}, {VK_DESCRIPTOR_TYPE_STORAGE_IMAGE, 24}, @@ -34,7 +34,7 @@ bool ui::init(rvk &renderData) { {VK_DESCRIPTOR_TYPE_UNIFORM_BUFFER_DYNAMIC, 24}, {VK_DESCRIPTOR_TYPE_STORAGE_BUFFER_DYNAMIC, 24}, {VK_DESCRIPTOR_TYPE_INPUT_ATTACHMENT, 24} - }; + }}; VkDescriptorPoolCreateInfo imguiPoolInfo{}; imguiPoolInfo.sType = VK_STRUCTURE_TYPE_DESCRIPTOR_POOL_CREATE_INFO; @@ -64,56 +64,6 @@ bool ui::init(rvk &renderData) { ImGui_ImplVulkan_Init(&imguiIinitInfo); - std::array imguiCommandBuffer; - - if (!commandbuffer::create(renderData, renderData.cpools_graphics.at(2), imguiCommandBuffer)) { - return false; - } - - if (vkResetCommandBuffer(imguiCommandBuffer.at(0), 0) != VK_SUCCESS) { - return false; - } - - VkCommandBufferBeginInfo cmdBeginInfo{}; - cmdBeginInfo.sType = VK_STRUCTURE_TYPE_COMMAND_BUFFER_BEGIN_INFO; - cmdBeginInfo.flags = VK_COMMAND_BUFFER_USAGE_ONE_TIME_SUBMIT_BIT; - - VkSubmitInfo submitInfo{}; - submitInfo.sType = VK_STRUCTURE_TYPE_SUBMIT_INFO; - submitInfo.pWaitDstStageMask = nullptr; - submitInfo.waitSemaphoreCount = 0; - submitInfo.pWaitSemaphores = nullptr; - submitInfo.signalSemaphoreCount = 0; - submitInfo.pSignalSemaphores = nullptr; - submitInfo.commandBufferCount = 1; - submitInfo.pCommandBuffers = imguiCommandBuffer.data(); - - VkFence imguiBufferFence; - - VkFenceCreateInfo fenceInfo{}; - fenceInfo.sType = VK_STRUCTURE_TYPE_FENCE_CREATE_INFO; - fenceInfo.flags = VK_FENCE_CREATE_SIGNALED_BIT; - - if (vkCreateFence(renderData.vkdevice.device, &fenceInfo, nullptr, &imguiBufferFence) != VK_SUCCESS) { - return false; - } - - if (vkResetFences(renderData.vkdevice.device, 1, &imguiBufferFence) != VK_SUCCESS) { - return false; - } - - renderData.mtx2->lock(); - if (vkQueueSubmit(renderData.graphicsQ, 1, &submitInfo, imguiBufferFence) != VK_SUCCESS) { - return false; - } - renderData.mtx2->unlock(); - - if (vkWaitForFences(renderData.vkdevice.device, 1, &imguiBufferFence, VK_TRUE, UINT64_MAX) != VK_SUCCESS) { - return false; - } - - vkDestroyFence(renderData.vkdevice.device, imguiBufferFence, nullptr); - commandbuffer::destroy(renderData, renderData.cpools_graphics.at(2), imguiCommandBuffer); ImGui::StyleColorsDark(); @@ -867,7 +817,6 @@ void ui::render(rvk &renderData, VkCommandBuffer &cbuffer) { void ui::cleanup(rvk &mvkobjs) { ImGui_ImplVulkan_Shutdown(); - vkDestroyDescriptorPool(mvkobjs.vkdevice.device, mvkobjs.dpools[rvk::idximguipool], nullptr); ImGui_ImplSDL3_Shutdown(); ImGui::DestroyContext(); } diff --git a/src/buffer/ubo.cpp b/src/buffer/ubo.cpp index 09ebe27..9603589 100644 --- a/src/buffer/ubo.cpp +++ b/src/buffer/ubo.cpp @@ -43,15 +43,11 @@ bool ubo::init(rvk &mvkobjs, std::vector &ubodata) { if (vkCreateDescriptorSetLayout(mvkobjs.vkdevice.device, &uboinfo, nullptr, &ubodata[0].dlayout) != VK_SUCCESS) return false; - std::array poolsize{}; - poolsize[0].type = VK_DESCRIPTOR_TYPE_UNIFORM_BUFFER; - poolsize[0].descriptorCount = 1 * (ubodata.size() * sizeof(glm::mat4) + sizeof(unsigned int)); - - rpool::create(poolsize,mvkobjs.vkdevice.device, &mvkobjs.dpools[rvk::idxubopool]); + VkDescriptorSetAllocateInfo dallocinfo{}; dallocinfo.sType = VK_STRUCTURE_TYPE_DESCRIPTOR_SET_ALLOCATE_INFO; - dallocinfo.descriptorPool = mvkobjs.dpools[rvk::idxubopool]; + dallocinfo.descriptorPool = mvkobjs.dpools[rvk::idxinitpool]; dallocinfo.descriptorSetCount = 1; dallocinfo.pSetLayouts = &ubodata[0].dlayout; @@ -94,7 +90,6 @@ void ubo::upload(rvk &mvkobjs, std::vector &ubodata, std::vector &ubodata) { for (size_t i{0}; i < ubodata.size(); i++) { - vkDestroyDescriptorPool(mvkobjs.vkdevice.device, mvkobjs.dpools[rvk::idxubopool], nullptr); vkDestroyDescriptorSetLayout(mvkobjs.vkdevice.device, ubodata[i].dlayout, nullptr); vmaDestroyBuffer(mvkobjs.alloc, ubodata[i].buffer, ubodata[i].alloc); } diff --git a/src/core/vkrenderer.cpp b/src/core/vkrenderer.cpp index 6637e40..60e21ea 100644 --- a/src/core/vkrenderer.cpp +++ b/src/core/vkrenderer.cpp @@ -55,7 +55,7 @@ bool vkrenderer::init() { createswapchain() && createdepthbuffer() && createcommandpool() && createcommandbuffer() && createrenderpass() && createframebuffer() && - createsyncobjects(); + createsyncobjects() && createpools(); }, })) return false; @@ -199,6 +199,10 @@ bool vkrenderer::getqueue() { return true; } +bool vkrenderer::createpools(){ + std::array poolz{{{VK_DESCRIPTOR_TYPE_COMBINED_IMAGE_SAMPLER,6},{VK_DESCRIPTOR_TYPE_UNIFORM_BUFFER,2},{VK_DESCRIPTOR_TYPE_STORAGE_BUFFER,1}}}; + return rpool::create(poolz,mvkobjs.vkdevice.device, &mvkobjs.dpools[rvk::idxinitpool]); +} bool vkrenderer::createdepthbuffer() { VkExtent3D depthimageextent = {mvkobjs.schain.extent.width, mvkobjs.schain.extent.height, 1}; @@ -330,12 +334,8 @@ void vkrenderer::cleanup() { commandbuffer::destroy(mvkobjs, mvkobjs.cpools_compute.at(0), mvkobjs.cbuffers_compute); commandpool::destroy(mvkobjs, mvkobjs.cpools_graphics); commandpool::destroy(mvkobjs, mvkobjs.cpools_compute); - // for(auto& x:mvkobjs.fbuffers){ - // vkDestroyFramebuffer(mvkobjs.vkdevice.device,x,nullptr); - // } - // vkDestroyFramebuffer(mvkobjs.vkdevice.device,mvkobjs.fbuffers.at(0),nullptr); - // vkDestroyFramebuffer(mvkobjs.vkdevice.device,mvkobjs.fbuffers.at(1),nullptr); - // vkDestroyFramebuffer(mvkobjs.vkdevice.device,mvkobjs.fbuffers.at(2),nullptr); + for(auto& x:mvkobjs.dpools) + rpool::destroy(mvkobjs.vkdevice.device,x); framebuffer::destroy(mvkobjs.vkdevice.device,mvkobjs.fbuffers); for (const auto &i : mplayer) diff --git a/src/glue/vktexture.cpp b/src/glue/vktexture.cpp index 7212b96..bc057d1 100644 --- a/src/glue/vktexture.cpp +++ b/src/glue/vktexture.cpp @@ -6,269 +6,6 @@ #include #include -bool vktexture::loadtexturefile(rvk &rdata, texdata &texdata, texdataset &texdatapls, std::string filename) { - - int w; - int h; - int c; - - unsigned char *data = stbi_load(filename.c_str(), &w, &h, &c, STBI_rgb_alpha); - if (!data) { - stbi_image_free(data); - return false; - } - - VkDeviceSize imgsize = w * h * 4; - - VkImageCreateInfo imginfo{}; - imginfo.sType = VK_STRUCTURE_TYPE_IMAGE_CREATE_INFO; - imginfo.imageType = VK_IMAGE_TYPE_2D; - imginfo.extent.width = static_cast(w); - imginfo.extent.height = static_cast(h); - imginfo.extent.depth = 1; - imginfo.mipLevels = 1; - imginfo.arrayLayers = 1; - imginfo.format = VK_FORMAT_R8G8B8A8_SRGB; - imginfo.tiling = VK_IMAGE_TILING_LINEAR; - imginfo.initialLayout = VK_IMAGE_LAYOUT_UNDEFINED; - imginfo.usage = VK_IMAGE_USAGE_TRANSFER_DST_BIT | VK_IMAGE_USAGE_SAMPLED_BIT; - imginfo.sharingMode = VK_SHARING_MODE_EXCLUSIVE; - imginfo.samples = VK_SAMPLE_COUNT_1_BIT; - - VmaAllocationCreateInfo iainfo{}; - iainfo.usage = VMA_MEMORY_USAGE_GPU_ONLY; - if (vmaCreateImage(rdata.alloc, &imginfo, &iainfo, &texdata.img, &texdata.alloc, nullptr) != - VK_SUCCESS) { - logger::log(0, "crashed in texture at vmaCreateImage"); - return false; - } - - VkBufferCreateInfo stagingbufferinfo{}; - stagingbufferinfo.sType = VK_STRUCTURE_TYPE_BUFFER_CREATE_INFO; - stagingbufferinfo.size = imgsize; - stagingbufferinfo.usage = VK_BUFFER_USAGE_TRANSFER_SRC_BIT; - - VkBuffer stagingbuffer; - VmaAllocation stagingbufferalloc; - - VmaAllocationCreateInfo stagingallocinfo{}; - stagingallocinfo.usage = VMA_MEMORY_USAGE_CPU_ONLY; - - if (vmaCreateBuffer(rdata.alloc, &stagingbufferinfo, &stagingallocinfo, &stagingbuffer, &stagingbufferalloc, - nullptr) != VK_SUCCESS) { - logger::log(0, "crashed in texture at vmaCreateBuffer"); - return false; - } - - void *tmp; - vmaMapMemory(rdata.alloc, stagingbufferalloc, &tmp); - std::memcpy(tmp, data, (imgsize)); - vmaUnmapMemory(rdata.alloc, stagingbufferalloc); - - stbi_image_free(data); - - VkImageSubresourceRange stagingbufferrange{}; - stagingbufferrange.aspectMask = VK_IMAGE_ASPECT_COLOR_BIT; - stagingbufferrange.baseMipLevel = 0; - stagingbufferrange.levelCount = 1; - stagingbufferrange.baseArrayLayer = 0; - stagingbufferrange.layerCount = 1; - - VkImageMemoryBarrier stagingbuffertransferbarrier{}; - stagingbuffertransferbarrier.sType = VK_STRUCTURE_TYPE_IMAGE_MEMORY_BARRIER; - stagingbuffertransferbarrier.oldLayout = VK_IMAGE_LAYOUT_UNDEFINED; - stagingbuffertransferbarrier.newLayout = VK_IMAGE_LAYOUT_TRANSFER_DST_OPTIMAL; - stagingbuffertransferbarrier.image = texdata.img; - stagingbuffertransferbarrier.subresourceRange = stagingbufferrange; - stagingbuffertransferbarrier.srcAccessMask = 0; - stagingbuffertransferbarrier.dstAccessMask = VK_ACCESS_TRANSFER_WRITE_BIT; - - VkExtent3D texextent{}; - texextent.width = static_cast(w); - texextent.height = static_cast(h); - texextent.depth = 1; - - VkBufferImageCopy stagingbuffercopy{}; - stagingbuffercopy.bufferOffset = 0; - stagingbuffercopy.bufferRowLength = 0; - stagingbuffercopy.bufferImageHeight = 0; - stagingbuffercopy.imageSubresource.aspectMask = VK_IMAGE_ASPECT_COLOR_BIT; - stagingbuffercopy.imageSubresource.mipLevel = 0; - stagingbuffercopy.imageSubresource.baseArrayLayer = 0; - stagingbuffercopy.imageSubresource.layerCount = 1; - stagingbuffercopy.imageExtent = texextent; - - VkImageMemoryBarrier stagingbuffershaderbarrier{}; - stagingbuffershaderbarrier.sType = VK_STRUCTURE_TYPE_IMAGE_MEMORY_BARRIER; - stagingbuffershaderbarrier.oldLayout = VK_IMAGE_LAYOUT_TRANSFER_DST_OPTIMAL; - stagingbuffershaderbarrier.newLayout = VK_IMAGE_LAYOUT_SHADER_READ_ONLY_OPTIMAL; - stagingbuffershaderbarrier.image = texdata.img; - stagingbuffershaderbarrier.subresourceRange = stagingbufferrange; - stagingbuffershaderbarrier.srcAccessMask = VK_ACCESS_TRANSFER_WRITE_BIT; - stagingbuffershaderbarrier.dstAccessMask = VK_ACCESS_SHADER_READ_BIT; - - std::array stagingcommandbuffer; - if (!commandbuffer::create(rdata, rdata.cpools_graphics.at(1), stagingcommandbuffer)) { - logger::log(0, "crashed in texture at commandbuffer::init"); - return false; - } - - if (vkResetCommandBuffer(stagingcommandbuffer.at(0), 0) != VK_SUCCESS) { - logger::log(0, "crashed in texture at vkResetCommandBuffer"); - return false; - } - - VkCommandBufferBeginInfo cmdbegininfo{}; - cmdbegininfo.sType = VK_STRUCTURE_TYPE_COMMAND_BUFFER_BEGIN_INFO; - cmdbegininfo.flags = VK_COMMAND_BUFFER_USAGE_ONE_TIME_SUBMIT_BIT; - - if (vkBeginCommandBuffer(stagingcommandbuffer.at(0), &cmdbegininfo) != VK_SUCCESS) { - logger::log(0, "crashed in texture at vkBeginCommandBuffer"); - return false; - } - - vkCmdPipelineBarrier(stagingcommandbuffer.at(0), VK_PIPELINE_STAGE_TOP_OF_PIPE_BIT, VK_PIPELINE_STAGE_TRANSFER_BIT, 0, 0, - nullptr, 0, nullptr, 1, &stagingbuffertransferbarrier); - vkCmdCopyBufferToImage(stagingcommandbuffer.at(0), stagingbuffer, texdata.img, VK_IMAGE_LAYOUT_TRANSFER_DST_OPTIMAL, 1, - &stagingbuffercopy); - vkCmdPipelineBarrier(stagingcommandbuffer.at(0), VK_PIPELINE_STAGE_TRANSFER_BIT, VK_PIPELINE_STAGE_FRAGMENT_SHADER_BIT, 0, - 0, nullptr, 0, nullptr, 1, &stagingbuffershaderbarrier); - - if (vkEndCommandBuffer(stagingcommandbuffer.at(0)) != VK_SUCCESS) { - logger::log(0, "crashed in texture at vkEndCommandBuffer"); - return false; - } - - VkSubmitInfo submitinfo{}; - submitinfo.sType = VK_STRUCTURE_TYPE_SUBMIT_INFO; - submitinfo.pWaitDstStageMask = nullptr; - submitinfo.waitSemaphoreCount = 0; - submitinfo.pWaitSemaphores = nullptr; - submitinfo.signalSemaphoreCount = 0; - submitinfo.pSignalSemaphores = nullptr; - submitinfo.commandBufferCount = 1; - submitinfo.pCommandBuffers = stagingcommandbuffer.data(); - - VkFence stagingbufferfence; - - VkFenceCreateInfo fenceinfo{}; - fenceinfo.sType = VK_STRUCTURE_TYPE_FENCE_CREATE_INFO; - fenceinfo.flags = VK_FENCE_CREATE_SIGNALED_BIT; - - if (vkCreateFence(rdata.vkdevice.device, &fenceinfo, nullptr, &stagingbufferfence) != VK_SUCCESS) { - logger::log(0, "crashed in texture at vkCreateFence"); - return false; - } - if (vkResetFences(rdata.vkdevice.device, 1, &stagingbufferfence) != VK_SUCCESS) { - logger::log(0, "crashed in texture at vkResetFences"); - return false; - } - rdata.mtx2->lock(); - if (vkQueueSubmit(rdata.graphicsQ, 1, &submitinfo, stagingbufferfence) != VK_SUCCESS) { - logger::log(0, "crashed in texture at vkQueueSubmit"); - return false; - } - rdata.mtx2->unlock(); - if (vkWaitForFences(rdata.vkdevice.device, 1, &stagingbufferfence, VK_TRUE, INT64_MAX) != VK_SUCCESS) { - logger::log(0, "crashed in texture at vkWaitForFences"); - return false; - } - - vkDestroyFence(rdata.vkdevice.device, stagingbufferfence, nullptr); - commandbuffer::destroy(rdata, rdata.cpools_graphics.at(1), stagingcommandbuffer); - vmaDestroyBuffer(rdata.alloc, stagingbuffer, stagingbufferalloc); - - VkImageViewCreateInfo texviewinfo{}; - texviewinfo.sType = VK_STRUCTURE_TYPE_IMAGE_VIEW_CREATE_INFO; - texviewinfo.image = texdata.img; - texviewinfo.viewType = VK_IMAGE_VIEW_TYPE_2D; - texviewinfo.format = VK_FORMAT_R8G8B8A8_SRGB; - texviewinfo.subresourceRange.aspectMask = VK_IMAGE_ASPECT_COLOR_BIT; - texviewinfo.subresourceRange.baseMipLevel = 0; - texviewinfo.subresourceRange.levelCount = 1; - texviewinfo.subresourceRange.baseArrayLayer = 0; - texviewinfo.subresourceRange.layerCount = 1; - - if (vkCreateImageView(rdata.vkdevice.device, &texviewinfo, nullptr, &texdata.imgview) != VK_SUCCESS) { - logger::log(0, "crashed in texture at vkCreateImageView"); - return false; - } - - VkSamplerCreateInfo texsamplerinfo{}; - texsamplerinfo.sType = VK_STRUCTURE_TYPE_SAMPLER_CREATE_INFO; - texsamplerinfo.magFilter = VK_FILTER_LINEAR; - texsamplerinfo.minFilter = VK_FILTER_LINEAR; - texsamplerinfo.addressModeU = VK_SAMPLER_ADDRESS_MODE_REPEAT; - texsamplerinfo.addressModeV = VK_SAMPLER_ADDRESS_MODE_REPEAT; - texsamplerinfo.addressModeW = VK_SAMPLER_ADDRESS_MODE_REPEAT; - texsamplerinfo.borderColor = VK_BORDER_COLOR_INT_OPAQUE_BLACK; - texsamplerinfo.unnormalizedCoordinates = VK_FALSE; - texsamplerinfo.compareEnable = VK_FALSE; - texsamplerinfo.compareOp = VK_COMPARE_OP_ALWAYS; - texsamplerinfo.mipmapMode = VK_SAMPLER_MIPMAP_MODE_NEAREST; - texsamplerinfo.mipLodBias = 0.0f; - texsamplerinfo.minLod = 0.0f; - texsamplerinfo.maxLod = 0.0f; - texsamplerinfo.anisotropyEnable = VK_FALSE; - texsamplerinfo.maxAnisotropy = 1.0f; - - if (vkCreateSampler(rdata.vkdevice.device, &texsamplerinfo, nullptr, &texdata.imgsampler) != VK_SUCCESS) { - logger::log(0, "crashed in texture at vkCreateSampler"); - return false; - } - - VkDescriptorSetLayoutBinding texturebind{}; - texturebind.descriptorType = VK_DESCRIPTOR_TYPE_COMBINED_IMAGE_SAMPLER; - texturebind.binding = 0; - texturebind.descriptorCount = 1; - texturebind.pImmutableSamplers = nullptr; - texturebind.stageFlags = VK_SHADER_STAGE_FRAGMENT_BIT; - - VkDescriptorSetLayoutCreateInfo texcreateinfo{}; - texcreateinfo.sType = VK_STRUCTURE_TYPE_DESCRIPTOR_SET_LAYOUT_CREATE_INFO; - texcreateinfo.bindingCount = 1; - texcreateinfo.pBindings = &texturebind; - - if (vkCreateDescriptorSetLayout(rdata.vkdevice.device, &texcreateinfo, nullptr, &texdatapls.dlayout) != - VK_SUCCESS) { - logger::log(0, "crashed in texture at vkCreateDescriptorSetLayout"); - return false; - } - - std::array poolsize{}; - poolsize[0].type = VK_DESCRIPTOR_TYPE_COMBINED_IMAGE_SAMPLER; - poolsize[0].descriptorCount = imgsize; - rpool::create(poolsize,rdata.vkdevice.device,&rdata.dpools[rvk::idxtexpool]); - - VkDescriptorSetAllocateInfo descallocinfo{}; - descallocinfo.sType = VK_STRUCTURE_TYPE_DESCRIPTOR_SET_ALLOCATE_INFO; - descallocinfo.descriptorPool = rdata.dpools[rvk::idxtexpool]; - descallocinfo.descriptorSetCount = 1; - descallocinfo.pSetLayouts = &texdatapls.dlayout; - - if (vkAllocateDescriptorSets(rdata.vkdevice.device, &descallocinfo, &texdatapls.dset) != VK_SUCCESS) { - logger::log(0, "crashed in texture at vkAllocateDescriptorSets"); - return false; - } - - VkDescriptorImageInfo descriptorimginfo{}; - descriptorimginfo.imageLayout = VK_IMAGE_LAYOUT_SHADER_READ_ONLY_OPTIMAL; - descriptorimginfo.imageView = texdata.imgview; - descriptorimginfo.sampler = texdata.imgsampler; - - VkWriteDescriptorSet writedescset{}; - writedescset.sType = VK_STRUCTURE_TYPE_WRITE_DESCRIPTOR_SET; - writedescset.descriptorType = VK_DESCRIPTOR_TYPE_COMBINED_IMAGE_SAMPLER; - writedescset.dstSet = texdatapls.dset; - writedescset.dstBinding = 0; - writedescset.descriptorCount = 1; - writedescset.pImageInfo = &descriptorimginfo; - - vkUpdateDescriptorSets(rdata.vkdevice.device, 1, &writedescset, 0, nullptr); - - return true; -} - bool vktexture::loadtexture(rvk &rdata, std::vector &texdata, fastgltf::Asset &mmodel) { texdata.reserve(mmodel.images.size()); @@ -502,7 +239,7 @@ bool vktexture::loadtexture(rvk &rdata, std::vector &texdata, fastgltf: return true; } -bool vktexture::loadtexlayoutpool(rvk &rdata, std::vector &texdata, texdataset &texdatapls, +bool vktexture::loadtexlayout(rvk &rdata, std::vector &texdata, texdataset &texdatapls, fastgltf::Asset &mmodel) { VkDescriptorSetLayoutBinding texturebind; @@ -534,16 +271,9 @@ bool vktexture::loadtexlayoutpool(rvk &rdata, std::vector &texdata, tex return false; } - std::array poolsize{}; - poolsize[0].type = VK_DESCRIPTOR_TYPE_COMBINED_IMAGE_SAMPLER; - poolsize[0].descriptorCount = mmodel.images.size() * 1024 * 1024 * 4; - - - rpool::create(poolsize,rdata.vkdevice.device,&rdata.dpools[rvk::idxtexpool]); - VkDescriptorSetAllocateInfo descallocinfo{}; descallocinfo.sType = VK_STRUCTURE_TYPE_DESCRIPTOR_SET_ALLOCATE_INFO; - descallocinfo.descriptorPool = rdata.dpools[rvk::idxtexpool]; + descallocinfo.descriptorPool = rdata.dpools[rvk::idxinitpool]; descallocinfo.descriptorSetCount = 1; descallocinfo.pSetLayouts = &texdatapls.dlayout; @@ -573,6 +303,5 @@ void vktexture::cleanup(rvk &rdata, texdata &texdata) { } void vktexture::cleanuppls(rvk &rdata, texdataset &texdatapls) { - vkDestroyDescriptorPool(rdata.vkdevice.device, rdata.dpools[rvk::idxtexpool], nullptr); vkDestroyDescriptorSetLayout(rdata.vkdevice.device, texdatapls.dlayout, nullptr); } diff --git a/src/model/genericmodel.cpp b/src/model/genericmodel.cpp index d73cc7d..eac2b20 100644 --- a/src/model/genericmodel.cpp +++ b/src/model/genericmodel.cpp @@ -26,7 +26,7 @@ bool genericmodel::loadmodel(rvk &objs, std::string fname) { mgltfobjs.texs.resize(mmodel2.images.size()); if (!vktexture::loadtexture(objs, mgltfobjs.texs, mmodel2)) return false; - if (!vktexture::loadtexlayoutpool(objs, mgltfobjs.texs, mgltfobjs.texpls, mmodel2)) + if (!vktexture::loadtexlayout(objs, mgltfobjs.texs, mgltfobjs.texpls, mmodel2)) return false; createvboebo(objs); @@ -38,6 +38,8 @@ bool genericmodel::loadmodel(rvk &objs, std::string fname) { mjnodecount = mmodel2.nodes.size(); getanims(); + }else{ + skinned=false; } return true; } diff --git a/src/playout/playoutgeneric.cpp b/src/playout/playoutgeneric.cpp index 23fc842..b00a478 100644 --- a/src/playout/playoutgeneric.cpp +++ b/src/playout/playoutgeneric.cpp @@ -1,8 +1,8 @@ #include "playoutgeneric.hpp" +#include "buffer/ssbo.hpp" #include "modelsettings.hpp" #include "playout.hpp" #include "pline.hpp" -#include "buffer/ssbo.hpp" #include "ubo.hpp" bool playoutgeneric::setup(rvk &objs, std::string fname, size_t count, std::string vfile, std::string ffile) { @@ -12,14 +12,17 @@ bool playoutgeneric::setup(rvk &objs, std::string fname, size_t count, std::stri return false; if (!createinstances(objs, count, false)) return false; - if (!createssbomat(objs)) - return false; - - if (!createplayout(objs)) - return false; - if (!createpline(objs, vfile, ffile)) - return false; - + if (mgltf->skinned) { + if (!createssbomat(objs)) + return false; + if (!createplayout(objs)) + return false; + if (!createpline(objs, vfile, ffile)) + return false; + } else { + if (!createplinestatic(objs, vfile, ffile)) + return false; + } ready = true; return true; From 04578bb6e19b8b037aee5becbdf730d7ccdd573e Mon Sep 17 00:00:00 2001 From: r Date: Sun, 29 Jun 2025 18:15:31 +0300 Subject: [PATCH 15/40] moving pools --- include/buffer/ssbo.hpp | 36 ++++++++++++----------- include/core/rvk.hpp | 15 +++++----- include/genericmodel.hpp | 1 - include/playout.hpp | 2 +- include/playoutgeneric.hpp | 17 +++++------ include/ubo.hpp | 1 + include/vktexture.hpp | 5 ++-- src/buffer/ubo.cpp | 52 ++++++++++++++++++---------------- src/core/vkrenderer.cpp | 6 +++- src/glue/playout.cpp | 2 +- src/glue/vktexture.cpp | 52 +++++++++++++++++++--------------- src/model/genericmodel.cpp | 15 ++++++---- src/playout/playoutgeneric.cpp | 48 ++++++++++++++++++++----------- 13 files changed, 144 insertions(+), 108 deletions(-) diff --git a/include/buffer/ssbo.hpp b/include/buffer/ssbo.hpp index 66561c3..96f6625 100644 --- a/include/buffer/ssbo.hpp +++ b/include/buffer/ssbo.hpp @@ -22,28 +22,14 @@ static inline bool init(rvk &objs, ssbodata &ssboData, size_t buffersize) { return false; } - VkDescriptorSetLayoutBinding ssboBind{}; - ssboBind.descriptorType = VK_DESCRIPTOR_TYPE_STORAGE_BUFFER; - ssboBind.binding = 0; - ssboBind.descriptorCount = 1; - ssboBind.pImmutableSamplers = nullptr; - ssboBind.stageFlags = VK_SHADER_STAGE_VERTEX_BIT; - VkDescriptorSetLayoutCreateInfo ssboCreateInfo{}; - ssboCreateInfo.sType = VK_STRUCTURE_TYPE_DESCRIPTOR_SET_LAYOUT_CREATE_INFO; - ssboCreateInfo.bindingCount = 1; - ssboCreateInfo.pBindings = &ssboBind; - - if (vkCreateDescriptorSetLayout(objs.vkdevice.device, &ssboCreateInfo, nullptr, &ssboData.dlayout) != VK_SUCCESS) { - return false; - } VkDescriptorSetAllocateInfo descriptorAllocateInfo{}; descriptorAllocateInfo.sType = VK_STRUCTURE_TYPE_DESCRIPTOR_SET_ALLOCATE_INFO; descriptorAllocateInfo.descriptorPool = objs.dpools[rvk::idxinitpool]; descriptorAllocateInfo.descriptorSetCount = 1; - descriptorAllocateInfo.pSetLayouts = &ssboData.dlayout; + descriptorAllocateInfo.pSetLayouts = &rvk::ssbolayout; if (vkAllocateDescriptorSets(objs.vkdevice.device, &descriptorAllocateInfo, &ssboData.dset) != VK_SUCCESS) { return false; @@ -68,6 +54,25 @@ static inline bool init(rvk &objs, ssbodata &ssboData, size_t buffersize) { return true; } + +static inline bool createlayout(rvk &core,VkDescriptorSetLayout& dlayout){ + VkDescriptorSetLayoutBinding ssboBind{}; + ssboBind.descriptorType = VK_DESCRIPTOR_TYPE_STORAGE_BUFFER; + ssboBind.binding = 0; + ssboBind.descriptorCount = 1; + ssboBind.pImmutableSamplers = nullptr; + ssboBind.stageFlags = VK_SHADER_STAGE_VERTEX_BIT; + + VkDescriptorSetLayoutCreateInfo ssboCreateInfo{}; + ssboCreateInfo.sType = VK_STRUCTURE_TYPE_DESCRIPTOR_SET_LAYOUT_CREATE_INFO; + ssboCreateInfo.bindingCount = 1; + ssboCreateInfo.pBindings = &ssboBind; + + if (vkCreateDescriptorSetLayout(core.vkdevice.device, &ssboCreateInfo, nullptr, &dlayout) != VK_SUCCESS) { + return false; + } + return true; +} // template // concept vectoradjacent = requires(T x){ // {x.size()} -> std::convertible_to; @@ -84,7 +89,6 @@ static inline void upload(const rvk &objs, const ssbodata &ssbodata, const std:: vmaUnmapMemory(objs.alloc, ssbodata.alloc); } static inline void cleanup(rvk &objs, ssbodata &ssbodata) { - vkDestroyDescriptorSetLayout(objs.vkdevice.device, ssbodata.dlayout, nullptr); vmaDestroyBuffer(objs.alloc, ssbodata.buffer, ssbodata.alloc); } }; diff --git a/include/core/rvk.hpp b/include/core/rvk.hpp index 79e557a..91e680a 100644 --- a/include/core/rvk.hpp +++ b/include/core/rvk.hpp @@ -24,11 +24,6 @@ struct texdata { VkSampler imgsampler = VK_NULL_HANDLE; VmaAllocation alloc = nullptr; }; -struct texdataset { - VkDescriptorSetLayout dlayout = VK_NULL_HANDLE; - VkDescriptorSet dset = VK_NULL_HANDLE; -}; - struct vbodata { size_t size{0}; @@ -53,7 +48,6 @@ struct ubodata { VkBuffer buffer = VK_NULL_HANDLE; VmaAllocation alloc = nullptr; - VkDescriptorSetLayout dlayout = VK_NULL_HANDLE; VkDescriptorSet dset = VK_NULL_HANDLE; }; @@ -62,7 +56,6 @@ struct ssbodata { VkBuffer buffer = VK_NULL_HANDLE; VmaAllocation alloc = nullptr; - VkDescriptorSetLayout dlayout = VK_NULL_HANDLE; VkDescriptorSet dset = VK_NULL_HANDLE; }; struct vkpushconstants { @@ -118,6 +111,12 @@ struct rvk { vkb::Device vkdevice{}; vkb::Swapchain schain{}; + + + inline static std::shared_ptr texlayout = std::make_shared(); + inline static VkDescriptorSetLayout ubolayout = VK_NULL_HANDLE; + inline static VkDescriptorSetLayout ssbolayout = VK_NULL_HANDLE; + std::vector schainimgs; std::vector schainimgviews; std::vector fbuffers = {VK_NULL_HANDLE,VK_NULL_HANDLE,VK_NULL_HANDLE}; @@ -161,7 +160,7 @@ struct vkgltfobjs { std::vector>> vbos{}; std::vector> ebos{}; std::vector texs{}; - texdataset texpls{}; + VkDescriptorSet dset = VK_NULL_HANDLE; }; namespace rpool { static inline bool create(const std::span& pools,const VkDevice& dev,VkDescriptorPool* dpool) { diff --git a/include/genericmodel.hpp b/include/genericmodel.hpp index 449bf60..9fe27f4 100644 --- a/include/genericmodel.hpp +++ b/include/genericmodel.hpp @@ -25,7 +25,6 @@ class genericmodel { void cleanup(rvk &objs); void uploadvboebo(rvk &objs, VkCommandBuffer &cbuffer); std::vector gettexdata(); - texdataset gettexdatapls(); std::string getmodelfname(); int getnodecount(); gltfnodedata getgltfnodes(); diff --git a/include/playout.hpp b/include/playout.hpp index 1e0f067..4736bba 100644 --- a/include/playout.hpp +++ b/include/playout.hpp @@ -4,7 +4,7 @@ class playout { public: - static bool init(rvk &mvkobjs, VkPipelineLayout &vkplayout, std::vector layoutz, + static bool init(rvk &mvkobjs, VkPipelineLayout &vkplayout, std::span layoutz, size_t pushc_size); static void cleanup(rvk &mvkobjs, VkPipelineLayout &vkplayout); }; \ No newline at end of file diff --git a/include/playoutgeneric.hpp b/include/playoutgeneric.hpp index cc090bf..048015c 100644 --- a/include/playoutgeneric.hpp +++ b/include/playoutgeneric.hpp @@ -5,16 +5,16 @@ #include #include #include - class playoutgeneric { public: bool loadmodel(rvk &objs, std::string fname); bool createinstances(rvk &objs, size_t count, bool rand); bool createubo(rvk &objs); bool createssbomat(rvk &objs); - bool createplayout(rvk &objs); - bool createpline(rvk &objs, std::string vfile, std::string ffile); - bool createplinestatic(rvk &objs, std::string vfile, std::string ffile); + static bool createskinnedplayout(rvk &objs); + static bool createstaticplayout(rvk &objs); + static bool createpline(rvk &objs, std::string vfile, std::string ffile); + static bool createplinestatic(rvk &objs, std::string vfile, std::string ffile); bool setup(rvk &objs, std::string fname, size_t count, std::string vfile, std::string ffile); void draw(rvk &objs); void updateanims(); @@ -28,14 +28,15 @@ class playoutgeneric { std::shared_ptr getinst(int i); bool ready{false}; + + inline static VkPipelineLayout rdgltfpipelinelayout = VK_NULL_HANDLE; + inline static VkPipeline rdgltfgpupipeline = VK_NULL_HANDLE; + inline static VkPipeline rdgltfgpupipelineuint = VK_NULL_HANDLE; + inline static VkPipeline staticpline = VK_NULL_HANDLE; private: std::vector desclayouts{}; - VkPipelineLayout rdgltfpipelinelayout = VK_NULL_HANDLE; - VkPipeline rdgltfgpupipeline = VK_NULL_HANDLE; - VkPipeline rdgltfgpupipelineuint = VK_NULL_HANDLE; - VkPipeline staticpline = VK_NULL_HANDLE; std::vector rdperspviewmatrixubo{}; ssbodata rdjointmatrixssbo{}; diff --git a/include/ubo.hpp b/include/ubo.hpp index 8e78da2..9ac9d6a 100644 --- a/include/ubo.hpp +++ b/include/ubo.hpp @@ -5,6 +5,7 @@ class ubo { public: static bool init(rvk &mvkobjs, std::vector &ubodata); + static bool createlayout(rvk &mvkobjs, VkDescriptorSetLayout& dlayout); static void upload(rvk &mvkobjs, std::vector &ubodata, std::vector mats); static void cleanup(rvk &mvkobjs, std::vector &ubodata); }; diff --git a/include/vktexture.hpp b/include/vktexture.hpp index 7a9b8bd..5544dc5 100644 --- a/include/vktexture.hpp +++ b/include/vktexture.hpp @@ -6,8 +6,9 @@ class vktexture { public: static bool loadtexture(rvk &rdata, std::vector &texdata, fastgltf::Asset &mmodel); - static bool loadtexlayout(rvk &rdata, std::vector &texdata, texdataset &texdatapls, + static bool loadtexset(rvk &rdata, std::vector &texdata, VkDescriptorSetLayout &dlayout,VkDescriptorSet &dset, fastgltf::Asset &mmodel); + static bool createlayout(rvk &core); static void cleanup(rvk &rdata, texdata &texdata); - static void cleanuppls(rvk &rdata, texdataset &texdatapls); + // static void cleanuppls(rvk &rdata, texdataset &texdatapls); }; diff --git a/src/buffer/ubo.cpp b/src/buffer/ubo.cpp index 9603589..58567c6 100644 --- a/src/buffer/ubo.cpp +++ b/src/buffer/ubo.cpp @@ -22,34 +22,12 @@ bool ubo::init(rvk &mvkobjs, std::vector &ubodata) { return false; } - std::vector ubobind(2); - ubobind[0].descriptorType = VK_DESCRIPTOR_TYPE_UNIFORM_BUFFER; - ubobind[0].binding = 0; - ubobind[0].descriptorCount = 1; - ubobind[0].pImmutableSamplers = nullptr; - ubobind[0].stageFlags = VK_SHADER_STAGE_VERTEX_BIT; - - ubobind[1].descriptorType = VK_DESCRIPTOR_TYPE_UNIFORM_BUFFER; - ubobind[1].binding = 1; - ubobind[1].descriptorCount = 1; - ubobind[1].pImmutableSamplers = nullptr; - ubobind[1].stageFlags = VK_SHADER_STAGE_FRAGMENT_BIT; - - VkDescriptorSetLayoutCreateInfo uboinfo{}; - uboinfo.sType = VK_STRUCTURE_TYPE_DESCRIPTOR_SET_LAYOUT_CREATE_INFO; - uboinfo.bindingCount = 2; - uboinfo.pBindings = &ubobind.at(0); - - if (vkCreateDescriptorSetLayout(mvkobjs.vkdevice.device, &uboinfo, nullptr, &ubodata[0].dlayout) != - VK_SUCCESS) - return false; - VkDescriptorSetAllocateInfo dallocinfo{}; dallocinfo.sType = VK_STRUCTURE_TYPE_DESCRIPTOR_SET_ALLOCATE_INFO; dallocinfo.descriptorPool = mvkobjs.dpools[rvk::idxinitpool]; dallocinfo.descriptorSetCount = 1; - dallocinfo.pSetLayouts = &ubodata[0].dlayout; + dallocinfo.pSetLayouts = &rvk::ubolayout; if (vkAllocateDescriptorSets(mvkobjs.vkdevice.device, &dallocinfo, &ubodata[0].dset) != VK_SUCCESS) return false; @@ -81,6 +59,32 @@ bool ubo::init(rvk &mvkobjs, std::vector &ubodata) { return true; } +bool ubo::createlayout(rvk &mvkobjs,VkDescriptorSetLayout& dlayout){ + std::vector ubobind(2); + ubobind[0].descriptorType = VK_DESCRIPTOR_TYPE_UNIFORM_BUFFER; + ubobind[0].binding = 0; + ubobind[0].descriptorCount = 1; + ubobind[0].pImmutableSamplers = nullptr; + ubobind[0].stageFlags = VK_SHADER_STAGE_VERTEX_BIT; + + ubobind[1].descriptorType = VK_DESCRIPTOR_TYPE_UNIFORM_BUFFER; + ubobind[1].binding = 1; + ubobind[1].descriptorCount = 1; + ubobind[1].pImmutableSamplers = nullptr; + ubobind[1].stageFlags = VK_SHADER_STAGE_FRAGMENT_BIT; + + + VkDescriptorSetLayoutCreateInfo uboinfo{}; + uboinfo.sType = VK_STRUCTURE_TYPE_DESCRIPTOR_SET_LAYOUT_CREATE_INFO; + uboinfo.bindingCount = 2; + uboinfo.pBindings = ubobind.data(); + + if (vkCreateDescriptorSetLayout(mvkobjs.vkdevice.device, &uboinfo, nullptr, &dlayout) != + VK_SUCCESS) + return false; + return true; + +} void ubo::upload(rvk &mvkobjs, std::vector &ubodata, std::vector mats) { void *data; vmaMapMemory(mvkobjs.alloc, ubodata[0].alloc, &data); @@ -90,7 +94,7 @@ void ubo::upload(rvk &mvkobjs, std::vector &ubodata, std::vector &ubodata) { for (size_t i{0}; i < ubodata.size(); i++) { - vkDestroyDescriptorSetLayout(mvkobjs.vkdevice.device, ubodata[i].dlayout, nullptr); + vkDestroyDescriptorSetLayout(mvkobjs.vkdevice.device, rvk::ubolayout, nullptr); vmaDestroyBuffer(mvkobjs.alloc, ubodata[i].buffer, ubodata[i].alloc); } } diff --git a/src/core/vkrenderer.cpp b/src/core/vkrenderer.cpp index 60e21ea..cbc69b7 100644 --- a/src/core/vkrenderer.cpp +++ b/src/core/vkrenderer.cpp @@ -200,7 +200,7 @@ bool vkrenderer::getqueue() { return true; } bool vkrenderer::createpools(){ - std::array poolz{{{VK_DESCRIPTOR_TYPE_COMBINED_IMAGE_SAMPLER,6},{VK_DESCRIPTOR_TYPE_UNIFORM_BUFFER,2},{VK_DESCRIPTOR_TYPE_STORAGE_BUFFER,1}}}; + std::array poolz{{{VK_DESCRIPTOR_TYPE_COMBINED_IMAGE_SAMPLER,24},{VK_DESCRIPTOR_TYPE_UNIFORM_BUFFER,2},{VK_DESCRIPTOR_TYPE_STORAGE_BUFFER,1}}}; return rpool::create(poolz,mvkobjs.vkdevice.device, &mvkobjs.dpools[rvk::idxinitpool]); } bool vkrenderer::createdepthbuffer() { @@ -338,6 +338,10 @@ void vkrenderer::cleanup() { rpool::destroy(mvkobjs.vkdevice.device,x); framebuffer::destroy(mvkobjs.vkdevice.device,mvkobjs.fbuffers); + vkDestroyDescriptorSetLayout(mvkobjs.vkdevice.device,rvk::ubolayout,nullptr); + vkDestroyDescriptorSetLayout(mvkobjs.vkdevice.device,*rvk::texlayout,nullptr); + vkDestroyDescriptorSetLayout(mvkobjs.vkdevice.device,rvk::ssbolayout,nullptr); + for (const auto &i : mplayer) i->cleanuplines(mvkobjs); diff --git a/src/glue/playout.cpp b/src/glue/playout.cpp index 3b3b8bf..73ddde2 100644 --- a/src/glue/playout.cpp +++ b/src/glue/playout.cpp @@ -2,7 +2,7 @@ #include "VkBootstrap.h" -bool playout::init(rvk &mvkobjs, VkPipelineLayout &vkplayout, std::vector layoutz, +bool playout::init(rvk &mvkobjs, VkPipelineLayout &vkplayout, std::span layoutz, size_t pushc_size) { diff --git a/src/glue/vktexture.cpp b/src/glue/vktexture.cpp index bc057d1..36145ba 100644 --- a/src/glue/vktexture.cpp +++ b/src/glue/vktexture.cpp @@ -5,6 +5,7 @@ #include #include #include +#include bool vktexture::loadtexture(rvk &rdata, std::vector &texdata, fastgltf::Asset &mmodel) { @@ -239,20 +240,13 @@ bool vktexture::loadtexture(rvk &rdata, std::vector &texdata, fastgltf: return true; } -bool vktexture::loadtexlayout(rvk &rdata, std::vector &texdata, texdataset &texdatapls, +bool vktexture::loadtexset(rvk &rdata, std::vector &texdata, VkDescriptorSetLayout &dlayout,VkDescriptorSet &dset, fastgltf::Asset &mmodel) { - VkDescriptorSetLayoutBinding texturebind; std::vector descriptorimginfo; descriptorimginfo.reserve(mmodel.images.size()); descriptorimginfo.resize(mmodel.images.size()); - texturebind.descriptorType = VK_DESCRIPTOR_TYPE_COMBINED_IMAGE_SAMPLER; - texturebind.binding = 0; - texturebind.descriptorCount = mmodel.images.size(); - texturebind.pImmutableSamplers = nullptr; - texturebind.stageFlags = VK_SHADER_STAGE_FRAGMENT_BIT; - for (size_t i{0}; i < mmodel.images.size(); i++) { descriptorimginfo[i].imageLayout = VK_IMAGE_LAYOUT_SHADER_READ_ONLY_OPTIMAL; @@ -260,24 +254,14 @@ bool vktexture::loadtexlayout(rvk &rdata, std::vector &texdata, texdata descriptorimginfo[i].sampler = texdata[i].imgsampler; } - VkDescriptorSetLayoutCreateInfo texcreateinfo{}; - texcreateinfo.sType = VK_STRUCTURE_TYPE_DESCRIPTOR_SET_LAYOUT_CREATE_INFO; - texcreateinfo.bindingCount = 1; // mmodel->images.size(); - texcreateinfo.pBindings = &texturebind; - - if (vkCreateDescriptorSetLayout(rdata.vkdevice.device, &texcreateinfo, nullptr, &texdatapls.dlayout) != - VK_SUCCESS) { - logger::log(0, "crashed in texture at vkCreateDescriptorSetLayout"); - return false; - } VkDescriptorSetAllocateInfo descallocinfo{}; descallocinfo.sType = VK_STRUCTURE_TYPE_DESCRIPTOR_SET_ALLOCATE_INFO; descallocinfo.descriptorPool = rdata.dpools[rvk::idxinitpool]; descallocinfo.descriptorSetCount = 1; - descallocinfo.pSetLayouts = &texdatapls.dlayout; + descallocinfo.pSetLayouts = &dlayout; - if (vkAllocateDescriptorSets(rdata.vkdevice.device, &descallocinfo, &texdatapls.dset) != VK_SUCCESS) { + if (vkAllocateDescriptorSets(rdata.vkdevice.device, &descallocinfo, &dset) != VK_SUCCESS) { logger::log(0, "crashed in texture at vkAllocateDescriptorSets"); return false; } @@ -285,7 +269,7 @@ bool vktexture::loadtexlayout(rvk &rdata, std::vector &texdata, texdata VkWriteDescriptorSet writedescset{}; writedescset.sType = VK_STRUCTURE_TYPE_WRITE_DESCRIPTOR_SET; writedescset.descriptorType = VK_DESCRIPTOR_TYPE_COMBINED_IMAGE_SAMPLER; - writedescset.dstSet = texdatapls.dset; + writedescset.dstSet = dset; writedescset.dstArrayElement = 0; writedescset.dstBinding = 0; // writedescset.pBufferInfo = 0; @@ -301,7 +285,29 @@ void vktexture::cleanup(rvk &rdata, texdata &texdata) { vkDestroyImageView(rdata.vkdevice.device, texdata.imgview, nullptr); vmaDestroyImage(rdata.alloc, texdata.img, texdata.alloc); } +bool vktexture::createlayout(rvk &core){ + + VkDescriptorSetLayoutBinding texturebind; + texturebind.descriptorType = VK_DESCRIPTOR_TYPE_COMBINED_IMAGE_SAMPLER; + texturebind.binding = 0; + texturebind.descriptorCount = 24;//max ~24 images per gltf file + texturebind.pImmutableSamplers = nullptr; + texturebind.stageFlags = VK_SHADER_STAGE_FRAGMENT_BIT; + + VkDescriptorSetLayoutCreateInfo texcreateinfo{}; + texcreateinfo.sType = VK_STRUCTURE_TYPE_DESCRIPTOR_SET_LAYOUT_CREATE_INFO; + texcreateinfo.bindingCount = 1; + texcreateinfo.pBindings = &texturebind; + + if (vkCreateDescriptorSetLayout(core.vkdevice.device, &texcreateinfo, nullptr, rvk::texlayout.get()) != + VK_SUCCESS) { + std::cout << "texture set layout crashed" << std::endl; + return false; + } + return true; -void vktexture::cleanuppls(rvk &rdata, texdataset &texdatapls) { - vkDestroyDescriptorSetLayout(rdata.vkdevice.device, texdatapls.dlayout, nullptr); } + +// void vktexture::cleanuppls(rvk &rdata, texdataset &texdatapls) { +// vkDestroyDescriptorSetLayout(rdata.vkdevice.device, texdatapls.dlayout, nullptr); +// } diff --git a/src/model/genericmodel.cpp b/src/model/genericmodel.cpp index eac2b20..cda7bc7 100644 --- a/src/model/genericmodel.cpp +++ b/src/model/genericmodel.cpp @@ -24,9 +24,12 @@ bool genericmodel::loadmodel(rvk &objs, std::string fname) { mgltfobjs.texs.reserve(mmodel2.images.size()); mgltfobjs.texs.resize(mmodel2.images.size()); + if (!vktexture::createlayout(objs)) + return false; + if (!vktexture::loadtexture(objs, mgltfobjs.texs, mmodel2)) return false; - if (!vktexture::loadtexlayout(objs, mgltfobjs.texs, mgltfobjs.texpls, mmodel2)) + if (!vktexture::loadtexset(objs, mgltfobjs.texs, *rvk::texlayout, mgltfobjs.dset, mmodel2)) return false; createvboebo(objs); @@ -326,7 +329,7 @@ void genericmodel::drawinstanced(rvk &objs, VkPipelineLayout &vkplayout, VkPipel std::vector> pushes(mgltfobjs.vbos.size()); vkCmdBindDescriptorSets(objs.cbuffers_graphics.at(0), VK_PIPELINE_BIND_POINT_GRAPHICS, vkplayout, 0, 1, - &mgltfobjs.texpls.dset, 0, nullptr); + &mgltfobjs.dset, 0, nullptr); for (size_t i{0}; i < mgltfobjs.vbos.size(); i++) { pushes[i].reserve(mgltfobjs.vbos.at(i).size()); @@ -381,7 +384,7 @@ void genericmodel::cleanup(rvk &objs) { for (size_t i{0}; i < mgltfobjs.texs.size(); i++) { vktexture::cleanup(objs, mgltfobjs.texs[i]); } - vktexture::cleanuppls(objs, mgltfobjs.texpls); + // vktexture::cleanuppls(objs, mgltfobjs.texpls); // mmodel.reset(); } @@ -390,6 +393,6 @@ std::vector genericmodel::gettexdata() { return mgltfobjs.texs; } -texdataset genericmodel::gettexdatapls() { - return mgltfobjs.texpls; -} +// texdataset genericmodel::gettexdatapls() { +// return mgltfobjs.texpls; +// } diff --git a/src/playout/playoutgeneric.cpp b/src/playout/playoutgeneric.cpp index b00a478..50ed089 100644 --- a/src/playout/playoutgeneric.cpp +++ b/src/playout/playoutgeneric.cpp @@ -6,26 +6,33 @@ #include "ubo.hpp" bool playoutgeneric::setup(rvk &objs, std::string fname, size_t count, std::string vfile, std::string ffile) { - if (!createubo(objs)) - return false; if (!loadmodel(objs, fname)) return false; if (!createinstances(objs, count, false)) return false; + static const bool _ = [&]{ + if(!ssbo::createlayout(objs,rvk::ssbolayout)) + return false; + if (!createubo(objs)) + return false; + if (!createskinnedplayout(objs)) + return false; + if (!createstaticplayout(objs)) + return false; + if (!createplinestatic(objs, vfile, ffile)) + return false; + if (!createpline(objs, vfile, ffile)) + return false; + return true; + }(); + if (mgltf->skinned) { if (!createssbomat(objs)) return false; - if (!createplayout(objs)) - return false; - if (!createpline(objs, vfile, ffile)) - return false; - } else { - if (!createplinestatic(objs, vfile, ffile)) - return false; } - ready = true; - return true; + ready = true; + return _; } bool playoutgeneric::loadmodel(rvk &objs, std::string fname) { @@ -49,9 +56,9 @@ bool playoutgeneric::createinstances(rvk &objs, size_t count, bool rand) { return true; } bool playoutgeneric::createubo(rvk &objs) { + ubo::createlayout(objs,rvk::ubolayout); if (!ubo::init(objs, rdperspviewmatrixubo)) return false; - desclayouts.push_back(rdperspviewmatrixubo[0].dlayout); return true; } @@ -60,16 +67,20 @@ bool playoutgeneric::createssbomat(rvk &objs) { sizeof(glm::mat4); if (!ssbo::init(objs, rdjointmatrixssbo, size)) return false; - desclayouts.push_back(rdjointmatrixssbo.dlayout); return true; } -bool playoutgeneric::createplayout(rvk &objs) { - texdataset texdatapls0 = mgltf->gettexdatapls(); - desclayouts.insert(desclayouts.begin(), texdatapls0.dlayout); - if (!playout::init(objs, rdgltfpipelinelayout, desclayouts, sizeof(vkpushconstants))) +bool playoutgeneric::createskinnedplayout(rvk &objs) { + std::array dlayouts{*rvk::texlayout,rvk::ubolayout,rvk::ssbolayout}; + if (!playout::init(objs, rdgltfpipelinelayout, dlayouts, sizeof(vkpushconstants))) return false; return true; } +bool playoutgeneric::createstaticplayout(rvk &objs) { + // std::array dlayouts{*rvk::texlayout,rvk::ubolayout}; + // if (!playout::init(objs, rdgltfpipelinelayout, dlayouts, sizeof(vkpushconstants))) + // return false; + return true; +} bool playoutgeneric::createpline(rvk &objs, std::string vfile, std::string ffile) { if (!pline::init(objs, rdgltfpipelinelayout, rdgltfgpupipeline, VK_PRIMITIVE_TOPOLOGY_TRIANGLE_LIST, 5, 31, @@ -80,6 +91,9 @@ bool playoutgeneric::createpline(rvk &objs, std::string vfile, std::string ffile return false; return true; } +bool playoutgeneric::createplinestatic(rvk &objs, std::string vfile, std::string ffile) { + return true; +} void playoutgeneric::updateanims() { for (auto &i : minstances) { From 5091b6dbc309071ae780170308764c4cc6067865 Mon Sep 17 00:00:00 2001 From: r Date: Sun, 29 Jun 2025 18:15:37 +0300 Subject: [PATCH 16/40] moving pools --- shaders/static.slang | 115 +++++++++++++++++++++++++++++++++++++++++++ 1 file changed, 115 insertions(+) create mode 100644 shaders/static.slang diff --git a/shaders/static.slang b/shaders/static.slang new file mode 100644 index 0000000..179fb95 --- /dev/null +++ b/shaders/static.slang @@ -0,0 +1,115 @@ + +layout(set = 0, binding = 0) uniform Sampler2D tex[]; + +struct texidx { + uint texid; +} + +struct VXin { + float3 pos : POSITION; + float3 aNormal : NORMAL; + float2 tex0 : TEXCOORD_0; + uint4 joi0 : JOINTS_0; + float4 wei0 : WEIGHTS_0; + // float2 tex1 : TEXCOORD_1; + // uint4 joi1 : JOINTS_1; + // float4 wei1 : WEIGHTS_1; + // float2 tex2 : TEXCOORD_2; + // float2 tex3 : TEXCOORD_3; + // float2 tex4 : TEXCOORD_4; + // float2 tex5 : TEXCOORD_5; +} +struct Particle { + float2 position; + float2 velocity; + float4 color; +}; + +StructuredBuffer pin; +RWStructuredBuffer pout; + +struct PXin { + float3 normal; + float2 texCoord; + float4 newcolor; + uint32_t txidx; + float32_t t2; + float32_t dec; +} +struct CXin { + uint3 tid : SV_DispatchThreadID; + Particle p; + +} +struct PXout { + float4 color; +} + +struct VXout { + PXin pxin0; + float4 sv_position : SV_Position; +} + +struct consts { + int aModelStride; + uint txid; + float t; +} +struct cams { + float4x4 view; + float4x4 projection; +} +struct jmats { + float4x4 jointmats; +} + +struct anim { + float3 trans; + float3 scale; + float4 rot; +} + +RWStructuredBuffer Ps; + +[vk_push_constant] +ConstantBuffer Constants; + +[[vk_binding(0, 1)]] +ConstantBuffer cammats; + +[[vk_binding(0, 2)]] +RWStructuredBuffer jmatbuffer; + +[[vk_binding(1, 1)]] +ConstantBuffer texid2; + +//stumped +[shader("vertex")] +VXout vxmain(VXin vxin) { + float4x4 skinmat = jmatbuffer[vxin.joi0.x].jointmats * vxin.wei0.x + + jmatbuffer[vxin.joi0.y].jointmats * vxin.wei0.y + + jmatbuffer[vxin.joi0.z].jointmats * vxin.wei0.z + + jmatbuffer[vxin.joi0.w].jointmats * vxin.wei0.w ; + VXout out; + float4x4 x = mul(cammats.projection, cammats.view); + float4x4 y = mul(x, skinmat); + float4 xx = float4(vxin.pos, 1.0f); + float4 z = mul(y, xx); + out.sv_position = z; + out.pxin0.normal = vxin.aNormal; + out.pxin0.texCoord = vxin.tex0; + out.pxin0.newcolor = vxin.joi0; + out.pxin0.txidx = Constants.txid; + out.pxin0.t2 = Constants.t; + out.pxin0.dec = 0.0; + return out; +} + + +[shader("pixel")] +PXout pxmain(PXin pxin) { + PXout out; + out.color = tex[pxin.txidx].Sample(float2(pxin.texCoord.x, pxin.texCoord.y - fract(pxin.t2 * pxin.txidx / 4.0))); + + return out; +} \ No newline at end of file From 2685e2a55d25ec7760b6754575265cb31d50ac59 Mon Sep 17 00:00:00 2001 From: r Date: Mon, 30 Jun 2025 05:57:34 +0300 Subject: [PATCH 17/40] moving pools --- include/playoutgeneric.hpp | 3 +-- src/buffer/ubo.cpp | 1 - src/core/vkrenderer.cpp | 5 +++-- src/glue/vktexture.cpp | 4 ---- src/model/genericmodel.cpp | 5 ++++- src/playout/playoutgeneric.cpp | 9 +++++++++ 6 files changed, 17 insertions(+), 10 deletions(-) diff --git a/include/playoutgeneric.hpp b/include/playoutgeneric.hpp index 048015c..9ac48f2 100644 --- a/include/playoutgeneric.hpp +++ b/include/playoutgeneric.hpp @@ -35,10 +35,9 @@ class playoutgeneric { inline static VkPipeline staticpline = VK_NULL_HANDLE; private: - std::vector desclayouts{}; - std::vector rdperspviewmatrixubo{}; + inline static std::vector rdperspviewmatrixubo{}; ssbodata rdjointmatrixssbo{}; bool uploadreq{true}; diff --git a/src/buffer/ubo.cpp b/src/buffer/ubo.cpp index 58567c6..723230b 100644 --- a/src/buffer/ubo.cpp +++ b/src/buffer/ubo.cpp @@ -94,7 +94,6 @@ void ubo::upload(rvk &mvkobjs, std::vector &ubodata, std::vector &ubodata) { for (size_t i{0}; i < ubodata.size(); i++) { - vkDestroyDescriptorSetLayout(mvkobjs.vkdevice.device, rvk::ubolayout, nullptr); vmaDestroyBuffer(mvkobjs.alloc, ubodata[i].buffer, ubodata[i].alloc); } } diff --git a/src/core/vkrenderer.cpp b/src/core/vkrenderer.cpp index cbc69b7..7dce78b 100644 --- a/src/core/vkrenderer.cpp +++ b/src/core/vkrenderer.cpp @@ -325,8 +325,6 @@ void vkrenderer::cleanup() { particle::destroyeveryting(mvkobjs); - for (const auto &i : mplayer) - i->cleanupmodels(mvkobjs); mui.cleanup(mvkobjs); vksyncobjects::cleanup(mvkobjs); @@ -348,6 +346,9 @@ void vkrenderer::cleanup() { renderpass::cleanup(mvkobjs); for (const auto &i : mplayer) i->cleanupbuffers(mvkobjs); + + for (const auto &i : mplayer) + i->cleanupmodels(mvkobjs); vkDestroyImageView(mvkobjs.vkdevice.device, mvkobjs.rddepthimageview, nullptr); vmaDestroyImage(mvkobjs.alloc, mvkobjs.rddepthimage, mvkobjs.rddepthimagealloc); diff --git a/src/glue/vktexture.cpp b/src/glue/vktexture.cpp index 36145ba..e54e46b 100644 --- a/src/glue/vktexture.cpp +++ b/src/glue/vktexture.cpp @@ -307,7 +307,3 @@ bool vktexture::createlayout(rvk &core){ return true; } - -// void vktexture::cleanuppls(rvk &rdata, texdataset &texdatapls) { -// vkDestroyDescriptorSetLayout(rdata.vkdevice.device, texdatapls.dlayout, nullptr); -// } diff --git a/src/model/genericmodel.cpp b/src/model/genericmodel.cpp index cda7bc7..d908f2e 100644 --- a/src/model/genericmodel.cpp +++ b/src/model/genericmodel.cpp @@ -24,9 +24,12 @@ bool genericmodel::loadmodel(rvk &objs, std::string fname) { mgltfobjs.texs.reserve(mmodel2.images.size()); mgltfobjs.texs.resize(mmodel2.images.size()); + static const bool _ = [&]{ if (!vktexture::createlayout(objs)) return false; - + return true; + }(); + if (!vktexture::loadtexture(objs, mgltfobjs.texs, mmodel2)) return false; if (!vktexture::loadtexset(objs, mgltfobjs.texs, *rvk::texlayout, mgltfobjs.dset, mmodel2)) diff --git a/src/playout/playoutgeneric.cpp b/src/playout/playoutgeneric.cpp index 50ed089..1c744b8 100644 --- a/src/playout/playoutgeneric.cpp +++ b/src/playout/playoutgeneric.cpp @@ -4,6 +4,7 @@ #include "playout.hpp" #include "pline.hpp" #include "ubo.hpp" +#include bool playoutgeneric::setup(rvk &objs, std::string fname, size_t count, std::string vfile, std::string ffile) { if (!loadmodel(objs, fname)) @@ -11,6 +12,7 @@ bool playoutgeneric::setup(rvk &objs, std::string fname, size_t count, std::stri if (!createinstances(objs, count, false)) return false; static const bool _ = [&]{ + std::cout << "static consted" << std::endl; if(!ssbo::createlayout(objs,rvk::ssbolayout)) return false; if (!createubo(objs)) @@ -149,13 +151,20 @@ void playoutgeneric::updatemats() { } void playoutgeneric::cleanuplines(rvk &objs) { + static const bool _ = [&]{ pline::cleanup(objs, rdgltfgpupipeline); pline::cleanup(objs, rdgltfgpupipelineuint); playout::cleanup(objs, rdgltfpipelinelayout); + return true; + }(); } void playoutgeneric::cleanupbuffers(rvk &objs) { + static const bool _ = [&]{ ubo::cleanup(objs, rdperspviewmatrixubo); + return true; + }(); + if(mgltf->skinned) ssbo::cleanup(objs, rdjointmatrixssbo); } From e6bab0840b1d644f8228b5a1abdbb84513d094a3 Mon Sep 17 00:00:00 2001 From: r Date: Mon, 30 Jun 2025 06:38:29 +0300 Subject: [PATCH 18/40] adding static pipeline --- CMakeLists.txt | 3 ++ include/genericmodel.hpp | 2 ++ include/playoutgeneric.hpp | 9 +++--- shaders/static.slang | 16 ++--------- src/model/genericmodel.cpp | 49 ++++++++++++++++++++++++++++---- src/playout/playoutgeneric.cpp | 52 ++++++++++++++++++++++------------ 6 files changed, 89 insertions(+), 42 deletions(-) diff --git a/CMakeLists.txt b/CMakeLists.txt index ce513b6..9625228 100644 --- a/CMakeLists.txt +++ b/CMakeLists.txt @@ -214,6 +214,9 @@ list(LENGTH shaders shader_len) COMMAND ${SHELL_CMD} -c "slangc -entry vxmain $<$:-g> $<$:-O3> -stage vertex -target spirv -capability SPIRV_1_6 ${PROJECT_SOURCE_DIR}/shaders/gen.slang -o ${PROJECT_BINARY_DIR}/shaders/vx.spv" DEPENDS ${PROJECT_SOURCE_DIR}/shaders/gen.slang COMMAND ${SHELL_CMD} -c "slangc -entry pxmain $<$:-g> $<$:-O3> -stage pixel -target spirv -capability SPIRV_1_6 ${PROJECT_SOURCE_DIR}/shaders/gen.slang -o ${PROJECT_BINARY_DIR}/shaders/px.spv" DEPENDS ${PROJECT_SOURCE_DIR}/shaders/gen.slang # COMMAND ${SHELL_CMD} -c "$ENV{VULKAN_SD/bin/slangc -entry cxmain $<$:-g> $<$:-O3> -stage compute -target spirv -capability SPIRV_1_6 ${PROJECT_SOURCE_DIR}/shaders/gen.slang -o ${PROJECT_BINARY_DIR}/shaders/cx.spv" DEPENDS ${PROJECT_SOURCE_DIR}/shaders/gen.slang + COMMAND ${SHELL_CMD} -c "slangc -entry vxmain $<$:-g> $<$:-O3> -stage vertex -target spirv -capability SPIRV_1_6 ${PROJECT_SOURCE_DIR}/shaders/static.slang -o ${PROJECT_BINARY_DIR}/shaders/svx.spv" DEPENDS ${PROJECT_SOURCE_DIR}/shaders/static.slang + COMMAND ${SHELL_CMD} -c "slangc -entry pxmain $<$:-g> $<$:-O3> -stage pixel -target spirv -capability SPIRV_1_6 ${PROJECT_SOURCE_DIR}/shaders/static.slang -o ${PROJECT_BINARY_DIR}/shaders/spx.spv" DEPENDS ${PROJECT_SOURCE_DIR}/shaders/static.slang + # COMMAND ${SHELL_CMD} -c "$ENV{VULKAN_SD/bin/slangc -entry cxmain $<$:-g> $<$:-O3> -stage compute -target spirv -capability SPIRV_1_6 ${PROJECT_SOURCE_DIR}/shaders/static.slang -o ${PROJECT_BINARY_DIR}/shaders/scx.spv" DEPENDS ${PROJECT_SOURCE_DIR}/shaders/static.slang COMMAND ${SHELL_CMD} -c "slangc -entry vxmain $<$:-g> $<$:-O3> -stage vertex -target spirv -capability SPIRV_1_6 ${PROJECT_SOURCE_DIR}/shaders/particle.slang -o ${PROJECT_BINARY_DIR}/shaders/pvx.spv" DEPENDS ${PROJECT_SOURCE_DIR}/shaders/particle.slang COMMAND ${SHELL_CMD} -c "slangc -entry pxmain $<$:-g> $<$:-O3> -stage pixel -target spirv -capability SPIRV_1_6 ${PROJECT_SOURCE_DIR}/shaders/particle.slang -o ${PROJECT_BINARY_DIR}/shaders/ppx.spv" DEPENDS ${PROJECT_SOURCE_DIR}/shaders/particle.slang COMMAND ${SHELL_CMD} -c "slangc -entry cxmain $<$:-g> $<$:-O3> -stage compute -target spirv -capability SPIRV_1_6 ${PROJECT_SOURCE_DIR}/shaders/particle.slang -o ${PROJECT_BINARY_DIR}/shaders/pcx.spv" DEPENDS ${PROJECT_SOURCE_DIR}/shaders/particle.slang diff --git a/include/genericmodel.hpp b/include/genericmodel.hpp index 9fe27f4..ac9a5c8 100644 --- a/include/genericmodel.hpp +++ b/include/genericmodel.hpp @@ -22,6 +22,8 @@ class genericmodel { void draw(rvk &objs); void drawinstanced(rvk &objs, VkPipelineLayout &vkplayout, VkPipeline &vkpline, VkPipeline &vkplineuint, int instancecount, int stride); + void drawinstancedstatic(rvk &objs, VkPipelineLayout &vkplayout, VkPipeline &vkpline, + int instancecount, int stride); void cleanup(rvk &objs); void uploadvboebo(rvk &objs, VkCommandBuffer &cbuffer); std::vector gettexdata(); diff --git a/include/playoutgeneric.hpp b/include/playoutgeneric.hpp index 9ac48f2..34e956f 100644 --- a/include/playoutgeneric.hpp +++ b/include/playoutgeneric.hpp @@ -14,7 +14,7 @@ class playoutgeneric { static bool createskinnedplayout(rvk &objs); static bool createstaticplayout(rvk &objs); static bool createpline(rvk &objs, std::string vfile, std::string ffile); - static bool createplinestatic(rvk &objs, std::string vfile, std::string ffile); + static bool createplinestatic(rvk &objs); bool setup(rvk &objs, std::string fname, size_t count, std::string vfile, std::string ffile); void draw(rvk &objs); void updateanims(); @@ -29,9 +29,10 @@ class playoutgeneric { bool ready{false}; - inline static VkPipelineLayout rdgltfpipelinelayout = VK_NULL_HANDLE; - inline static VkPipeline rdgltfgpupipeline = VK_NULL_HANDLE; - inline static VkPipeline rdgltfgpupipelineuint = VK_NULL_HANDLE; + inline static VkPipelineLayout skinnedplayout = VK_NULL_HANDLE; + inline static VkPipelineLayout staticplayout = VK_NULL_HANDLE; + inline static VkPipeline skinnedpline = VK_NULL_HANDLE; + inline static VkPipeline skinnedplineuint = VK_NULL_HANDLE; inline static VkPipeline staticpline = VK_NULL_HANDLE; private: diff --git a/shaders/static.slang b/shaders/static.slang index 179fb95..0a648b9 100644 --- a/shaders/static.slang +++ b/shaders/static.slang @@ -9,11 +9,7 @@ struct VXin { float3 pos : POSITION; float3 aNormal : NORMAL; float2 tex0 : TEXCOORD_0; - uint4 joi0 : JOINTS_0; - float4 wei0 : WEIGHTS_0; // float2 tex1 : TEXCOORD_1; - // uint4 joi1 : JOINTS_1; - // float4 wei1 : WEIGHTS_1; // float2 tex2 : TEXCOORD_2; // float2 tex3 : TEXCOORD_3; // float2 tex4 : TEXCOORD_4; @@ -77,8 +73,6 @@ ConstantBuffer Constants; [[vk_binding(0, 1)]] ConstantBuffer cammats; -[[vk_binding(0, 2)]] -RWStructuredBuffer jmatbuffer; [[vk_binding(1, 1)]] ConstantBuffer texid2; @@ -86,19 +80,13 @@ ConstantBuffer texid2; //stumped [shader("vertex")] VXout vxmain(VXin vxin) { - float4x4 skinmat = jmatbuffer[vxin.joi0.x].jointmats * vxin.wei0.x + - jmatbuffer[vxin.joi0.y].jointmats * vxin.wei0.y + - jmatbuffer[vxin.joi0.z].jointmats * vxin.wei0.z + - jmatbuffer[vxin.joi0.w].jointmats * vxin.wei0.w ; VXout out; float4x4 x = mul(cammats.projection, cammats.view); - float4x4 y = mul(x, skinmat); float4 xx = float4(vxin.pos, 1.0f); - float4 z = mul(y, xx); - out.sv_position = z; + float4 xxx = mul(x, xx); + out.sv_position = xxx; out.pxin0.normal = vxin.aNormal; out.pxin0.texCoord = vxin.tex0; - out.pxin0.newcolor = vxin.joi0; out.pxin0.txidx = Constants.txid; out.pxin0.t2 = Constants.t; out.pxin0.dec = 0.0; diff --git a/src/model/genericmodel.cpp b/src/model/genericmodel.cpp index d908f2e..4937318 100644 --- a/src/model/genericmodel.cpp +++ b/src/model/genericmodel.cpp @@ -387,15 +387,52 @@ void genericmodel::cleanup(rvk &objs) { for (size_t i{0}; i < mgltfobjs.texs.size(); i++) { vktexture::cleanup(objs, mgltfobjs.texs[i]); } - // vktexture::cleanuppls(objs, mgltfobjs.texpls); +} + + +void genericmodel::drawinstancedstatic(rvk &objs, VkPipelineLayout &vkplayout, VkPipeline &vkpline, + int instancecount, int stride) { + VkDeviceSize offset = 0; + std::vector> pushes(mgltfobjs.vbos.size()); + + vkCmdBindDescriptorSets(objs.cbuffers_graphics.at(0), VK_PIPELINE_BIND_POINT_GRAPHICS, vkplayout, 0, 1, + &mgltfobjs.dset, 0, nullptr); + + for (size_t i{0}; i < mgltfobjs.vbos.size(); i++) { + pushes[i].reserve(mgltfobjs.vbos.at(i).size()); + pushes[i].resize(mgltfobjs.vbos.at(i).size()); + + vkCmdBindPipeline(objs.cbuffers_graphics.at(0), VK_PIPELINE_BIND_POINT_GRAPHICS, vkpline); + + for (size_t j{0}; j < mgltfobjs.vbos.at(i).size(); j++) { + pushes[i][j].stride = stride; + if (mmodel2.meshes.at(i).primitives.at(j).materialIndex.has_value() && + mmodel2.materials.at(mmodel2.meshes.at(i).primitives.at(j).materialIndex.value()) + .pbrData.baseColorTexture.has_value()) { + pushes[i][j].texidx = static_cast( + mmodel2 + .textures[mmodel2.materials[mmodel2.meshes.at(i).primitives.at(j).materialIndex.value_or(0)] + .pbrData.baseColorTexture->textureIndex] + .imageIndex.value_or(0)); + } else { + pushes[i][j].texidx = 0; + } + pushes[i][j].t = static_cast(SDL_GetTicks()) / 1000.0f; - // mmodel.reset(); + vkCmdPushConstants(objs.cbuffers_graphics.at(0), vkplayout, VK_SHADER_STAGE_VERTEX_BIT, 0, sizeof(vkpushconstants), + &pushes.at(i).at(j)); + // rework bindings + for (size_t k{0}; k < mgltfobjs.vbos.at(i).at(j).size(); k++) { + if (mgltfobjs.vbos.at(i).at(j).at(k).buffer != VK_NULL_HANDLE) + vkCmdBindVertexBuffers(objs.cbuffers_graphics.at(0), k, 1, &mgltfobjs.vbos.at(i).at(j).at(k).buffer, + &offset); + } + vkCmdBindIndexBuffer(objs.cbuffers_graphics.at(0), mgltfobjs.ebos.at(i).at(j).buffer, 0, VK_INDEX_TYPE_UINT16); + vkCmdDrawIndexed(objs.cbuffers_graphics.at(0), static_cast(gettricount(i, j) * 3), instancecount, 0, 0, 0); + } + } } std::vector genericmodel::gettexdata() { return mgltfobjs.texs; } - -// texdataset genericmodel::gettexdatapls() { -// return mgltfobjs.texpls; -// } diff --git a/src/playout/playoutgeneric.cpp b/src/playout/playoutgeneric.cpp index 1c744b8..54b0d86 100644 --- a/src/playout/playoutgeneric.cpp +++ b/src/playout/playoutgeneric.cpp @@ -12,7 +12,6 @@ bool playoutgeneric::setup(rvk &objs, std::string fname, size_t count, std::stri if (!createinstances(objs, count, false)) return false; static const bool _ = [&]{ - std::cout << "static consted" << std::endl; if(!ssbo::createlayout(objs,rvk::ssbolayout)) return false; if (!createubo(objs)) @@ -21,7 +20,7 @@ bool playoutgeneric::setup(rvk &objs, std::string fname, size_t count, std::stri return false; if (!createstaticplayout(objs)) return false; - if (!createplinestatic(objs, vfile, ffile)) + if (!createplinestatic(objs)) return false; if (!createpline(objs, vfile, ffile)) return false; @@ -73,27 +72,30 @@ bool playoutgeneric::createssbomat(rvk &objs) { } bool playoutgeneric::createskinnedplayout(rvk &objs) { std::array dlayouts{*rvk::texlayout,rvk::ubolayout,rvk::ssbolayout}; - if (!playout::init(objs, rdgltfpipelinelayout, dlayouts, sizeof(vkpushconstants))) + if (!playout::init(objs, skinnedplayout, dlayouts, sizeof(vkpushconstants))) return false; return true; } bool playoutgeneric::createstaticplayout(rvk &objs) { - // std::array dlayouts{*rvk::texlayout,rvk::ubolayout}; - // if (!playout::init(objs, rdgltfpipelinelayout, dlayouts, sizeof(vkpushconstants))) - // return false; + std::array dlayouts{*rvk::texlayout,rvk::ubolayout}; + if (!playout::init(objs, staticplayout, dlayouts, sizeof(vkpushconstants))) + return false; return true; } bool playoutgeneric::createpline(rvk &objs, std::string vfile, std::string ffile) { - if (!pline::init(objs, rdgltfpipelinelayout, rdgltfgpupipeline, VK_PRIMITIVE_TOPOLOGY_TRIANGLE_LIST, 5, 31, + if (!pline::init(objs, skinnedplayout, skinnedpline, VK_PRIMITIVE_TOPOLOGY_TRIANGLE_LIST, 5, 31, std::vector {vfile, ffile})) return false; - if (!pline::init(objs, rdgltfpipelinelayout, rdgltfgpupipelineuint, VK_PRIMITIVE_TOPOLOGY_TRIANGLE_LIST, 5, 31, + if (!pline::init(objs, skinnedplayout, skinnedplineuint, VK_PRIMITIVE_TOPOLOGY_TRIANGLE_LIST, 5, 31, std::vector {vfile, ffile}, true)) return false; return true; } -bool playoutgeneric::createplinestatic(rvk &objs, std::string vfile, std::string ffile) { +bool playoutgeneric::createplinestatic(rvk &objs) { + if (!pline::init(objs, staticplayout, staticpline, VK_PRIMITIVE_TOPOLOGY_TRIANGLE_LIST, 3, 7, + std::vector {"shaders/svx.spv", "shaders/spx.spv"})) + return false; return true; } @@ -112,12 +114,14 @@ void playoutgeneric::uploadvboebo(rvk &objs, VkCommandBuffer &cbuffer) { } void playoutgeneric::uploadubossbo(rvk &objs, std::vector &cammats) { - vkCmdBindDescriptorSets(objs.cbuffers_graphics.at(0), VK_PIPELINE_BIND_POINT_GRAPHICS, rdgltfpipelinelayout, 1, 1, + vkCmdBindDescriptorSets(objs.cbuffers_graphics.at(0), VK_PIPELINE_BIND_POINT_GRAPHICS, mgltf->skinned ? skinnedplayout : staticplayout, 1, 1, &rdperspviewmatrixubo[0].dset, 0, nullptr); - vkCmdBindDescriptorSets(objs.cbuffers_graphics.at(0), VK_PIPELINE_BIND_POINT_GRAPHICS, rdgltfpipelinelayout, 2, 1, - &rdjointmatrixssbo.dset, 0, nullptr); ubo::upload(objs, rdperspviewmatrixubo, cammats); + if(mgltf->skinned){ + vkCmdBindDescriptorSets(objs.cbuffers_graphics.at(0), VK_PIPELINE_BIND_POINT_GRAPHICS, skinnedplayout, 2, 1, + &rdjointmatrixssbo.dset, 0, nullptr); ssbo::upload(objs, rdjointmatrixssbo, jointmats); + } } std::shared_ptr playoutgeneric::getinst(int i) { @@ -126,6 +130,8 @@ std::shared_ptr playoutgeneric::getinst(int i) { void playoutgeneric::updatemats() { + //might have to put if skinned here + totaltricount = 0; jointmats.clear(); jointdqs.clear(); @@ -152,9 +158,11 @@ void playoutgeneric::updatemats() { void playoutgeneric::cleanuplines(rvk &objs) { static const bool _ = [&]{ - pline::cleanup(objs, rdgltfgpupipeline); - pline::cleanup(objs, rdgltfgpupipelineuint); - playout::cleanup(objs, rdgltfpipelinelayout); + pline::cleanup(objs, skinnedpline); + pline::cleanup(objs, skinnedplineuint); + pline::cleanup(objs,staticpline); + playout::cleanup(objs, skinnedplayout); + playout::cleanup(objs, staticplayout); return true; }(); } @@ -175,13 +183,21 @@ void playoutgeneric::cleanupmodels(rvk &objs) { void playoutgeneric::draw(rvk &objs) { if (minstances[0]->getinstancesettings().msdrawmodel) { + + if(mgltf->skinned){ stride = minstances.at(0)->getjointmatrixsize(); - vkCmdBindDescriptorSets(objs.cbuffers_graphics.at(0), VK_PIPELINE_BIND_POINT_GRAPHICS, rdgltfpipelinelayout, 1, 1, + vkCmdBindDescriptorSets(objs.cbuffers_graphics.at(0), VK_PIPELINE_BIND_POINT_GRAPHICS, skinnedplayout, 1, 1, &rdperspviewmatrixubo[0].dset, 0, nullptr); - vkCmdBindDescriptorSets(objs.cbuffers_graphics.at(0), VK_PIPELINE_BIND_POINT_GRAPHICS, rdgltfpipelinelayout, 2, 1, + vkCmdBindDescriptorSets(objs.cbuffers_graphics.at(0), VK_PIPELINE_BIND_POINT_GRAPHICS, skinnedplayout, 2, 1, &rdjointmatrixssbo.dset, 0, nullptr); - mgltf->drawinstanced(objs, rdgltfpipelinelayout, rdgltfgpupipeline, rdgltfgpupipelineuint, numinstancess, stride); + mgltf->drawinstanced(objs, skinnedplayout, skinnedpline, skinnedplineuint, numinstancess, stride); + }else{ + vkCmdBindDescriptorSets(objs.cbuffers_graphics.at(0), VK_PIPELINE_BIND_POINT_GRAPHICS, staticplayout, 1, 1, + &rdperspviewmatrixubo[0].dset, 0, nullptr); + + mgltf->drawinstancedstatic(objs, skinnedplayout, staticpline, numinstancess, stride); + } } } From 25d36ad496dbd5d837f06a276c8039ba06a6182d Mon Sep 17 00:00:00 2001 From: r Date: Mon, 30 Jun 2025 07:41:30 +0300 Subject: [PATCH 19/40] adding static pipeline --- shaders/static.slang | 2 +- src/playout/playoutgeneric.cpp | 1 + 2 files changed, 2 insertions(+), 1 deletion(-) diff --git a/shaders/static.slang b/shaders/static.slang index 0a648b9..65da9f6 100644 --- a/shaders/static.slang +++ b/shaders/static.slang @@ -97,7 +97,7 @@ VXout vxmain(VXin vxin) { [shader("pixel")] PXout pxmain(PXin pxin) { PXout out; - out.color = tex[pxin.txidx].Sample(float2(pxin.texCoord.x, pxin.texCoord.y - fract(pxin.t2 * pxin.txidx / 4.0))); + out.color = tex[pxin.txidx].Sample(float2(pxin.texCoord.x, pxin.texCoord.y)); return out; } \ No newline at end of file diff --git a/src/playout/playoutgeneric.cpp b/src/playout/playoutgeneric.cpp index 54b0d86..728668d 100644 --- a/src/playout/playoutgeneric.cpp +++ b/src/playout/playoutgeneric.cpp @@ -100,6 +100,7 @@ bool playoutgeneric::createplinestatic(rvk &objs) { } void playoutgeneric::updateanims() { + if(mgltf->skinned) for (auto &i : minstances) { i->updateanimation(); i->solveik(); From 5ba1c5945a8b3527ed4320bdd8d0e1fc7d2f156d Mon Sep 17 00:00:00 2001 From: r Date: Wed, 2 Jul 2025 21:00:14 +0300 Subject: [PATCH 20/40] adding static pipeline --- include/genericinstance.hpp | 8 ++ include/playoutgeneric.hpp | 1 + shaders/gen.slang | 10 +-- shaders/static.slang | 7 +- src/playout/playoutgeneric.cpp | 150 +++++++++++++++++++-------------- 5 files changed, 107 insertions(+), 69 deletions(-) diff --git a/include/genericinstance.hpp b/include/genericinstance.hpp index bb66298..17dd17b 100644 --- a/include/genericinstance.hpp +++ b/include/genericinstance.hpp @@ -38,6 +38,14 @@ class genericinstance { glm::vec3 *getinstpos(); + glm::mat4 calcstaticmat() { + glm::mat4 x = glm::scale(glm::mat4{1.0f}, mmodelsettings.msworldscale); + x = glm::toMat4(glm::quat(glm::radians(mmodelsettings.msworldrot))) * x; + x = glm::translate(glm::mat4{ 1.0f }, mmodelsettings.msworldpos) * x; + return x; + } + + private: void playanimation(int animnum, float speeddivider, float blendfactor, replaydirection direction); void playanimation(int srcanimnum, int dstanimnum, float speeddivider, float blendfactor, replaydirection direction); diff --git a/include/playoutgeneric.hpp b/include/playoutgeneric.hpp index 34e956f..a0e484e 100644 --- a/include/playoutgeneric.hpp +++ b/include/playoutgeneric.hpp @@ -11,6 +11,7 @@ class playoutgeneric { bool createinstances(rvk &objs, size_t count, bool rand); bool createubo(rvk &objs); bool createssbomat(rvk &objs); + bool createssbostatic(rvk &objs); static bool createskinnedplayout(rvk &objs); static bool createstaticplayout(rvk &objs); static bool createpline(rvk &objs, std::string vfile, std::string ffile); diff --git a/shaders/gen.slang b/shaders/gen.slang index 179fb95..139d93b 100644 --- a/shaders/gen.slang +++ b/shaders/gen.slang @@ -85,11 +85,11 @@ ConstantBuffer texid2; //stumped [shader("vertex")] -VXout vxmain(VXin vxin) { - float4x4 skinmat = jmatbuffer[vxin.joi0.x].jointmats * vxin.wei0.x + - jmatbuffer[vxin.joi0.y].jointmats * vxin.wei0.y + - jmatbuffer[vxin.joi0.z].jointmats * vxin.wei0.z + - jmatbuffer[vxin.joi0.w].jointmats * vxin.wei0.w ; +VXout vxmain(VXin vxin, uint id: SV_VulkanInstanceID) { + float4x4 skinmat = jmatbuffer[vxin.joi0.x + Constants.aModelStride * id].jointmats * vxin.wei0.x + + jmatbuffer[vxin.joi0.y + Constants.aModelStride * id].jointmats * vxin.wei0.y + + jmatbuffer[vxin.joi0.z + Constants.aModelStride * id].jointmats * vxin.wei0.z + + jmatbuffer[vxin.joi0.w + Constants.aModelStride * id].jointmats * vxin.wei0.w ; VXout out; float4x4 x = mul(cammats.projection, cammats.view); float4x4 y = mul(x, skinmat); diff --git a/shaders/static.slang b/shaders/static.slang index 65da9f6..70916bd 100644 --- a/shaders/static.slang +++ b/shaders/static.slang @@ -73,17 +73,20 @@ ConstantBuffer Constants; [[vk_binding(0, 1)]] ConstantBuffer cammats; +[[vk_binding(0, 2)]] +RWStructuredBuffer transmat; [[vk_binding(1, 1)]] ConstantBuffer texid2; //stumped [shader("vertex")] -VXout vxmain(VXin vxin) { +VXout vxmain(VXin vxin,uint id:SV_VulkanInstanceID) { VXout out; float4x4 x = mul(cammats.projection, cammats.view); float4 xx = float4(vxin.pos, 1.0f); - float4 xxx = mul(x, xx); + float4 xxx = mul(transmat[id].jointmats, xx); + float4 xxxx = mul(x, xxx); out.sv_position = xxx; out.pxin0.normal = vxin.aNormal; out.pxin0.texCoord = vxin.tex0; diff --git a/src/playout/playoutgeneric.cpp b/src/playout/playoutgeneric.cpp index 728668d..8ae1b3c 100644 --- a/src/playout/playoutgeneric.cpp +++ b/src/playout/playoutgeneric.cpp @@ -11,25 +11,28 @@ bool playoutgeneric::setup(rvk &objs, std::string fname, size_t count, std::stri return false; if (!createinstances(objs, count, false)) return false; - static const bool _ = [&]{ - if(!ssbo::createlayout(objs,rvk::ssbolayout)) - return false; - if (!createubo(objs)) - return false; - if (!createskinnedplayout(objs)) - return false; - if (!createstaticplayout(objs)) - return false; - if (!createplinestatic(objs)) - return false; - if (!createpline(objs, vfile, ffile)) - return false; - return true; + static const bool _ = [&] { + if(!ssbo::createlayout(objs,rvk::ssbolayout)) + return false; + if (!createubo(objs)) + return false; + if (!createskinnedplayout(objs)) + return false; + if (!createstaticplayout(objs)) + return false; + if (!createplinestatic(objs)) + return false; + if (!createpline(objs, vfile, ffile)) + return false; + return true; }(); - + if (mgltf->skinned) { if (!createssbomat(objs)) return false; + } else { + if(!createssbostatic(objs)) + return false; } ready = true; @@ -70,6 +73,12 @@ bool playoutgeneric::createssbomat(rvk &objs) { return false; return true; } +bool playoutgeneric::createssbostatic(rvk &objs) { + size_t size = numinstancess * sizeof(glm::mat4); + if (!ssbo::init(objs, rdjointmatrixssbo, size)) + return false; + return true; +} bool playoutgeneric::createskinnedplayout(rvk &objs) { std::array dlayouts{*rvk::texlayout,rvk::ubolayout,rvk::ssbolayout}; if (!playout::init(objs, skinnedplayout, dlayouts, sizeof(vkpushconstants))) @@ -77,7 +86,7 @@ bool playoutgeneric::createskinnedplayout(rvk &objs) { return true; } bool playoutgeneric::createstaticplayout(rvk &objs) { - std::array dlayouts{*rvk::texlayout,rvk::ubolayout}; + std::array dlayouts{*rvk::texlayout,rvk::ubolayout,rvk::ssbolayout}; if (!playout::init(objs, staticplayout, dlayouts, sizeof(vkpushconstants))) return false; return true; @@ -101,10 +110,10 @@ bool playoutgeneric::createplinestatic(rvk &objs) { void playoutgeneric::updateanims() { if(mgltf->skinned) - for (auto &i : minstances) { - i->updateanimation(); - i->solveik(); - } + for (auto &i : minstances) { + i->updateanimation(); + i->solveik(); + } } void playoutgeneric::uploadvboebo(rvk &objs, VkCommandBuffer &cbuffer) { @@ -118,10 +127,14 @@ void playoutgeneric::uploadubossbo(rvk &objs, std::vector &cammats) { vkCmdBindDescriptorSets(objs.cbuffers_graphics.at(0), VK_PIPELINE_BIND_POINT_GRAPHICS, mgltf->skinned ? skinnedplayout : staticplayout, 1, 1, &rdperspviewmatrixubo[0].dset, 0, nullptr); ubo::upload(objs, rdperspviewmatrixubo, cammats); - if(mgltf->skinned){ - vkCmdBindDescriptorSets(objs.cbuffers_graphics.at(0), VK_PIPELINE_BIND_POINT_GRAPHICS, skinnedplayout, 2, 1, - &rdjointmatrixssbo.dset, 0, nullptr); - ssbo::upload(objs, rdjointmatrixssbo, jointmats); + if(mgltf->skinned) { + vkCmdBindDescriptorSets(objs.cbuffers_graphics.at(0), VK_PIPELINE_BIND_POINT_GRAPHICS, skinnedplayout, 2, 1, + &rdjointmatrixssbo.dset, 0, nullptr); + ssbo::upload(objs, rdjointmatrixssbo, jointmats); + } else { + vkCmdBindDescriptorSets(objs.cbuffers_graphics.at(0), VK_PIPELINE_BIND_POINT_GRAPHICS, staticplayout, 2, 1, + &rdjointmatrixssbo.dset, 0, nullptr); + ssbo::upload(objs, rdjointmatrixssbo, jointmats); } } @@ -139,42 +152,53 @@ void playoutgeneric::updatemats() { numdqs = 0; nummats = 0; - - for (const auto &i : minstances) { - modelsettings &settings = i->getinstancesettings(); - if (!settings.msdrawmodel) - continue; - if (settings.mvertexskinningmode == skinningmode::dualquat) { - std::vector quats = i->getjointdualquats(); - jointdqs.insert(jointdqs.end(), quats.begin(), quats.end()); - numdqs++; - } else { - std::vector mats = i->getjointmats(); - jointmats.insert(jointmats.end(), mats.begin(), mats.end()); - nummats++; + if(mgltf->skinned) { + + for (const auto &i : minstances) { + modelsettings &settings = i->getinstancesettings(); + if (!settings.msdrawmodel) + continue; + if (settings.mvertexskinningmode == skinningmode::dualquat) { + std::vector quats = i->getjointdualquats(); + jointdqs.insert(jointdqs.end(), quats.begin(), quats.end()); + numdqs++; + } else { + std::vector mats = i->getjointmats(); + jointmats.insert(jointmats.end(), mats.begin(), mats.end()); + nummats++; + } + totaltricount += mgltf->gettricount(0, 0); + } + } else { + //todo dual quats + for (const auto &i : minstances) { + modelsettings &settings = i->getinstancesettings(); + if (!settings.msdrawmodel) + continue; + jointmats.push_back(i->calcstaticmat()); + nummats++; + totaltricount += mgltf->gettricount(0, 0); } - totaltricount += mgltf->gettricount(0, 0); } } void playoutgeneric::cleanuplines(rvk &objs) { - static const bool _ = [&]{ - pline::cleanup(objs, skinnedpline); - pline::cleanup(objs, skinnedplineuint); - pline::cleanup(objs,staticpline); - playout::cleanup(objs, skinnedplayout); - playout::cleanup(objs, staticplayout); - return true; + static const bool _ = [&] { + pline::cleanup(objs, skinnedpline); + pline::cleanup(objs, skinnedplineuint); + pline::cleanup(objs,staticpline); + playout::cleanup(objs, skinnedplayout); + playout::cleanup(objs, staticplayout); + return true; }(); } void playoutgeneric::cleanupbuffers(rvk &objs) { - static const bool _ = [&]{ - ubo::cleanup(objs, rdperspviewmatrixubo); - return true; + static const bool _ = [&] { + ubo::cleanup(objs, rdperspviewmatrixubo); + return true; }(); - if(mgltf->skinned) - ssbo::cleanup(objs, rdjointmatrixssbo); + ssbo::cleanup(objs, rdjointmatrixssbo); } void playoutgeneric::cleanupmodels(rvk &objs) { @@ -184,21 +208,23 @@ void playoutgeneric::cleanupmodels(rvk &objs) { void playoutgeneric::draw(rvk &objs) { if (minstances[0]->getinstancesettings().msdrawmodel) { - - if(mgltf->skinned){ - stride = minstances.at(0)->getjointmatrixsize(); - vkCmdBindDescriptorSets(objs.cbuffers_graphics.at(0), VK_PIPELINE_BIND_POINT_GRAPHICS, skinnedplayout, 1, 1, - &rdperspviewmatrixubo[0].dset, 0, nullptr); - vkCmdBindDescriptorSets(objs.cbuffers_graphics.at(0), VK_PIPELINE_BIND_POINT_GRAPHICS, skinnedplayout, 2, 1, - &rdjointmatrixssbo.dset, 0, nullptr); + if(mgltf->skinned) { + stride = minstances.at(0)->getjointmatrixsize(); - mgltf->drawinstanced(objs, skinnedplayout, skinnedpline, skinnedplineuint, numinstancess, stride); - }else{ - vkCmdBindDescriptorSets(objs.cbuffers_graphics.at(0), VK_PIPELINE_BIND_POINT_GRAPHICS, staticplayout, 1, 1, - &rdperspviewmatrixubo[0].dset, 0, nullptr); + vkCmdBindDescriptorSets(objs.cbuffers_graphics.at(0), VK_PIPELINE_BIND_POINT_GRAPHICS, skinnedplayout, 1, 1, + &rdperspviewmatrixubo[0].dset, 0, nullptr); + vkCmdBindDescriptorSets(objs.cbuffers_graphics.at(0), VK_PIPELINE_BIND_POINT_GRAPHICS, skinnedplayout, 2, 1, + &rdjointmatrixssbo.dset, 0, nullptr); + + mgltf->drawinstanced(objs, skinnedplayout, skinnedpline, skinnedplineuint, numinstancess, stride); + } else { + vkCmdBindDescriptorSets(objs.cbuffers_graphics.at(0), VK_PIPELINE_BIND_POINT_GRAPHICS, staticplayout, 1, 1, + &rdperspviewmatrixubo[0].dset, 0, nullptr); + vkCmdBindDescriptorSets(objs.cbuffers_graphics.at(0), VK_PIPELINE_BIND_POINT_GRAPHICS, staticplayout, 2, 1, + &rdjointmatrixssbo.dset, 0, nullptr); - mgltf->drawinstancedstatic(objs, skinnedplayout, staticpline, numinstancess, stride); + mgltf->drawinstancedstatic(objs, skinnedplayout, staticpline, numinstancess, stride); } } } From 2b0ecf31491b67b9d3eceb2db3757ce509b70fda Mon Sep 17 00:00:00 2001 From: r Date: Thu, 3 Jul 2025 12:24:08 +0300 Subject: [PATCH 21/40] adding static pipeline --- include/genericinstance.hpp | 12 ++++++++---- shaders/static.slang | 9 +++++++-- 2 files changed, 15 insertions(+), 6 deletions(-) diff --git a/include/genericinstance.hpp b/include/genericinstance.hpp index 17dd17b..da5c827 100644 --- a/include/genericinstance.hpp +++ b/include/genericinstance.hpp @@ -39,10 +39,14 @@ class genericinstance { glm::vec3 *getinstpos(); glm::mat4 calcstaticmat() { - glm::mat4 x = glm::scale(glm::mat4{1.0f}, mmodelsettings.msworldscale); - x = glm::toMat4(glm::quat(glm::radians(mmodelsettings.msworldrot))) * x; - x = glm::translate(glm::mat4{ 1.0f }, mmodelsettings.msworldpos) * x; - return x; + glm::mat4 x = glm::scale(glm::mat4{1.0f}, mmodelsettings.msworldscale); + x = glm::toMat4(glm::quat(glm::radians(mmodelsettings.msworldrot))) * x; + x = glm::translate(glm::mat4{ 1.0f }, mmodelsettings.msworldpos) * x; + return x; + // glm::mat4 x{ 1.0 }; + // ////glm::mat4 t = glm::translate(x, mmodelsettings.msworldpos) * glm::scale(x, mmodelsettings.msworldscale) * glm::rotate(x, glm::radians(mmodelsettings.msworldrot.y), glm::vec3{ 0.0f,1.0f,0.0f }); + // glm::mat4 t = glm::translate(x, mmodelsettings.msworldpos) * glm::mat4_cast(glm::quat(glm::radians(mmodelsettings.msworldrot))) * glm::scale(x, mmodelsettings.msworldscale); + // return t; } diff --git a/shaders/static.slang b/shaders/static.slang index 70916bd..c2eb29f 100644 --- a/shaders/static.slang +++ b/shaders/static.slang @@ -81,13 +81,18 @@ ConstantBuffer texid2; //stumped [shader("vertex")] -VXout vxmain(VXin vxin,uint id:SV_VulkanInstanceID) { +VXout vxmain(VXin vxin, uint id: SV_VulkanInstanceID) { VXout out; + // float4x4 x = mul(cammats.projection, cammats.view); + // float4 xx = float4(vxin.pos, 1.0f); + // float4x4 xxx = mul(x, transmat[id].jointmats); + // float4 xxxx = mul(xx, xxx); + // out.sv_position = xxxx; float4x4 x = mul(cammats.projection, cammats.view); float4 xx = float4(vxin.pos, 1.0f); float4 xxx = mul(transmat[id].jointmats, xx); float4 xxxx = mul(x, xxx); - out.sv_position = xxx; + out.sv_position = xxxx; out.pxin0.normal = vxin.aNormal; out.pxin0.texCoord = vxin.tex0; out.pxin0.txidx = Constants.txid; From d9f632c49eeba8619e3aa5ab0a2b59af8496636b Mon Sep 17 00:00:00 2001 From: r Date: Thu, 3 Jul 2025 12:32:40 +0300 Subject: [PATCH 22/40] cmake 4.0 ci --- .github/workflows/cmake_lnx.yml | 7 +++++++ 1 file changed, 7 insertions(+) diff --git a/.github/workflows/cmake_lnx.yml b/.github/workflows/cmake_lnx.yml index 913905a..c9f448e 100644 --- a/.github/workflows/cmake_lnx.yml +++ b/.github/workflows/cmake_lnx.yml @@ -27,6 +27,13 @@ jobs: submodules: true fetch-depth: 0 + - name: installing cmake 4 + run: | + sudo apt-get remove --purge -y cmake + wget https://github.com/Kitware/CMake/releases/download/v4.0.3/cmake-4.0.3-linux-x86_64.sh + chmod +x cmake-4.0.3-linux-x86_64.sh + sudo ./cmake-4.0.3-linux-x86_64.sh --skip-license --prefix=/usr/local + - name: update submodules run: | git submodule update --init --recursive From a3771c777dfedba805d8eb584b10cbd0c0e8db12 Mon Sep 17 00:00:00 2001 From: r Date: Thu, 3 Jul 2025 14:15:16 +0300 Subject: [PATCH 23/40] cmake slang --- .github/workflows/cmake_lnx.yml | 9 +++++++-- 1 file changed, 7 insertions(+), 2 deletions(-) diff --git a/.github/workflows/cmake_lnx.yml b/.github/workflows/cmake_lnx.yml index c9f448e..43ccd28 100644 --- a/.github/workflows/cmake_lnx.yml +++ b/.github/workflows/cmake_lnx.yml @@ -33,7 +33,10 @@ jobs: wget https://github.com/Kitware/CMake/releases/download/v4.0.3/cmake-4.0.3-linux-x86_64.sh chmod +x cmake-4.0.3-linux-x86_64.sh sudo ./cmake-4.0.3-linux-x86_64.sh --skip-license --prefix=/usr/local - + - name: downloading latest slang + run: | + url=$(curl -s https://api.github.com/repos/shader-slang/slang/releases/latest | jq -r '.assets[] | select(.name | endswith("linux-x86_64.tar.gz")) | .browser_download_url') + mkdir -p ~/slang && curl -L "$url" | tar -xz -C ~/slang - name: update submodules run: | git submodule update --init --recursive @@ -64,8 +67,10 @@ jobs: - name: verifying vulkan run: | mkdir -p $VULKAN_SDK/bin - cp -n /home/runner/vulk/bin/slangc $VULKAN_SDK/bin/slangc + cp -f ~/slang/bin/slangc $VULKAN_SDK/bin/slangc $VULKAN_SDK/bin/slangc -v + slangc -v + which slangc - name: downloading resources run: | mkdir /home/runner/work/rview2/rview2/resources From 0558b65b31a1c6825f89f4529987e3177e407afc Mon Sep 17 00:00:00 2001 From: r Date: Thu, 3 Jul 2025 14:43:58 +0300 Subject: [PATCH 24/40] ci slang --- .github/workflows/cmake_lnx.yml | 4 ++++ 1 file changed, 4 insertions(+) diff --git a/.github/workflows/cmake_lnx.yml b/.github/workflows/cmake_lnx.yml index 43ccd28..e703f85 100644 --- a/.github/workflows/cmake_lnx.yml +++ b/.github/workflows/cmake_lnx.yml @@ -37,6 +37,7 @@ jobs: run: | url=$(curl -s https://api.github.com/repos/shader-slang/slang/releases/latest | jq -r '.assets[] | select(.name | endswith("linux-x86_64.tar.gz")) | .browser_download_url') mkdir -p ~/slang && curl -L "$url" | tar -xz -C ~/slang + ls ~/slang - name: update submodules run: | git submodule update --init --recursive @@ -71,6 +72,9 @@ jobs: $VULKAN_SDK/bin/slangc -v slangc -v which slangc + ls -lh ~/slang/bin/slangc + md5sum ~/slang/bin/slangc + md5sum $VULKAN_SDK/bin/slangc - name: downloading resources run: | mkdir /home/runner/work/rview2/rview2/resources From bbfedbe84ae71143037908b5bfe6499573e25f2a Mon Sep 17 00:00:00 2001 From: r Date: Thu, 3 Jul 2025 14:49:35 +0300 Subject: [PATCH 25/40] ci slang --- .github/workflows/cmake_lnx.yml | 1 + 1 file changed, 1 insertion(+) diff --git a/.github/workflows/cmake_lnx.yml b/.github/workflows/cmake_lnx.yml index e703f85..99b83d7 100644 --- a/.github/workflows/cmake_lnx.yml +++ b/.github/workflows/cmake_lnx.yml @@ -38,6 +38,7 @@ jobs: url=$(curl -s https://api.github.com/repos/shader-slang/slang/releases/latest | jq -r '.assets[] | select(.name | endswith("linux-x86_64.tar.gz")) | .browser_download_url') mkdir -p ~/slang && curl -L "$url" | tar -xz -C ~/slang ls ~/slang + ~/slang/bin/slangc -v - name: update submodules run: | git submodule update --init --recursive From 731aea67a972c5993cabe6d3b9bfcb6ad613666e Mon Sep 17 00:00:00 2001 From: r Date: Thu, 3 Jul 2025 14:57:21 +0300 Subject: [PATCH 26/40] ci slang --- .github/workflows/cmake_lnx.yml | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/.github/workflows/cmake_lnx.yml b/.github/workflows/cmake_lnx.yml index 99b83d7..177ac4a 100644 --- a/.github/workflows/cmake_lnx.yml +++ b/.github/workflows/cmake_lnx.yml @@ -69,11 +69,11 @@ jobs: - name: verifying vulkan run: | mkdir -p $VULKAN_SDK/bin - cp -f ~/slang/bin/slangc $VULKAN_SDK/bin/slangc + sudo cp -v -f ~/slang/bin/slangc $VULKAN_SDK/bin/slangc $VULKAN_SDK/bin/slangc -v slangc -v which slangc - ls -lh ~/slang/bin/slangc + ls -lah ~/slang/bin/slangc md5sum ~/slang/bin/slangc md5sum $VULKAN_SDK/bin/slangc - name: downloading resources From eb7c1057a1400d469a16f4dff7d6435f82937e74 Mon Sep 17 00:00:00 2001 From: r Date: Thu, 3 Jul 2025 16:51:36 +0300 Subject: [PATCH 27/40] ci slang --- .github/workflows/cmake_lnx.yml | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/.github/workflows/cmake_lnx.yml b/.github/workflows/cmake_lnx.yml index 177ac4a..6c1e199 100644 --- a/.github/workflows/cmake_lnx.yml +++ b/.github/workflows/cmake_lnx.yml @@ -69,7 +69,7 @@ jobs: - name: verifying vulkan run: | mkdir -p $VULKAN_SDK/bin - sudo cp -v -f ~/slang/bin/slangc $VULKAN_SDK/bin/slangc + sudo cp -v -f ~/slang/bin/* $VULKAN_SDK/bin/slangc $VULKAN_SDK/bin/slangc -v slangc -v which slangc From 6ee8d38387cb80e3ac9b5577ff39c28fd0720ad8 Mon Sep 17 00:00:00 2001 From: r Date: Thu, 3 Jul 2025 17:01:15 +0300 Subject: [PATCH 28/40] ci slang --- .github/workflows/cmake_lnx.yml | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/.github/workflows/cmake_lnx.yml b/.github/workflows/cmake_lnx.yml index 6c1e199..6ab6eef 100644 --- a/.github/workflows/cmake_lnx.yml +++ b/.github/workflows/cmake_lnx.yml @@ -69,7 +69,7 @@ jobs: - name: verifying vulkan run: | mkdir -p $VULKAN_SDK/bin - sudo cp -v -f ~/slang/bin/* $VULKAN_SDK/bin/slangc + sudo cp -v -f ~/slang/bin/* $VULKAN_SDK/bin $VULKAN_SDK/bin/slangc -v slangc -v which slangc From 03bcf3a50fcc1376112e1f5bc2b0809ed481fd37 Mon Sep 17 00:00:00 2001 From: r Date: Thu, 3 Jul 2025 18:46:13 +0300 Subject: [PATCH 29/40] ci slang --- .github/workflows/cmake_lnx.yml | 8 ++++++++ 1 file changed, 8 insertions(+) diff --git a/.github/workflows/cmake_lnx.yml b/.github/workflows/cmake_lnx.yml index 6ab6eef..67b210d 100644 --- a/.github/workflows/cmake_lnx.yml +++ b/.github/workflows/cmake_lnx.yml @@ -69,10 +69,18 @@ jobs: - name: verifying vulkan run: | mkdir -p $VULKAN_SDK/bin + sudo rm -rf $VULKAN_SDK/bin/slangc sudo cp -v -f ~/slang/bin/* $VULKAN_SDK/bin + sudo cp -v -f ~/slang/bin/slangc $VULKAN_SDK/bin/slangc + echo "\n" $VULKAN_SDK/bin/slangc -v + echo "\n" slangc -v + echo "\n" + ~/slang/bin/slangc -v + echo "\n" which slangc + echo "\n" ls -lah ~/slang/bin/slangc md5sum ~/slang/bin/slangc md5sum $VULKAN_SDK/bin/slangc From 0776c05d8bc3cc50207467ce7be4d7f5770e3253 Mon Sep 17 00:00:00 2001 From: r Date: Thu, 3 Jul 2025 18:52:57 +0300 Subject: [PATCH 30/40] ci slang --- .github/workflows/cmake_lnx.yml | 12 +++++++++++- 1 file changed, 11 insertions(+), 1 deletion(-) diff --git a/.github/workflows/cmake_lnx.yml b/.github/workflows/cmake_lnx.yml index 67b210d..2de73c9 100644 --- a/.github/workflows/cmake_lnx.yml +++ b/.github/workflows/cmake_lnx.yml @@ -66,8 +66,18 @@ jobs: echo VK_LAYER_PATH=$VULKAN_SDK/etc/vulkan/explicit_layer.d >> $GITHUB_ENV echo LD_LIBRARY_PATH=/home/runner/work/rview2/rview2/lib:$LD_LIBRARY_PATH >> $GITHUB_ENV sudo ldconfig - - name: verifying vulkan + # - name: downloading latest slang AGAIN + # run: | + # url=$(curl -s https://api.github.com/repos/shader-slang/slang/releases/latest | jq -r '.assets[] | select(.name | endswith("linux-x86_64.tar.gz")) | .browser_download_url') + # mkdir -p ~/slang && curl -L "$url" | tar -xz -C ~/slang + # ls ~/slang + # ~/slang/bin/slangc -v + - name: verifying vulkan & slang AGAIN!! run: | + url=$(curl -s https://api.github.com/repos/shader-slang/slang/releases/latest | jq -r '.assets[] | select(.name | endswith("linux-x86_64.tar.gz")) | .browser_download_url') + mkdir -p ~/slang && curl -L "$url" | tar -xz -C ~/slang + ls ~/slang + ~/slang/bin/slangc -v mkdir -p $VULKAN_SDK/bin sudo rm -rf $VULKAN_SDK/bin/slangc sudo cp -v -f ~/slang/bin/* $VULKAN_SDK/bin From ad63837720e328653ede91affaf57fcabaa689dd Mon Sep 17 00:00:00 2001 From: r Date: Thu, 3 Jul 2025 18:58:25 +0300 Subject: [PATCH 31/40] ci slang --- .github/workflows/cmake_lnx.yml | 11 +++++++++-- 1 file changed, 9 insertions(+), 2 deletions(-) diff --git a/.github/workflows/cmake_lnx.yml b/.github/workflows/cmake_lnx.yml index 2de73c9..0609840 100644 --- a/.github/workflows/cmake_lnx.yml +++ b/.github/workflows/cmake_lnx.yml @@ -75,23 +75,30 @@ jobs: - name: verifying vulkan & slang AGAIN!! run: | url=$(curl -s https://api.github.com/repos/shader-slang/slang/releases/latest | jq -r '.assets[] | select(.name | endswith("linux-x86_64.tar.gz")) | .browser_download_url') - mkdir -p ~/slang && curl -L "$url" | tar -xz -C ~/slang - ls ~/slang + mkdir -p ~/slang && curl -L "$url" | tar -xz -C ~/slang2 + ls ~/slang2 + ~/slang2/bin/slangc -v ~/slang/bin/slangc -v mkdir -p $VULKAN_SDK/bin sudo rm -rf $VULKAN_SDK/bin/slangc sudo cp -v -f ~/slang/bin/* $VULKAN_SDK/bin sudo cp -v -f ~/slang/bin/slangc $VULKAN_SDK/bin/slangc + sudo cp -v -f ~/slang2/bin/* $VULKAN_SDK/bin + sudo cp -v -f ~/slang2/bin/slangc $VULKAN_SDK/bin/slangc echo "\n" $VULKAN_SDK/bin/slangc -v echo "\n" slangc -v echo "\n" ~/slang/bin/slangc -v + ~/slang2/bin/slangc -v echo "\n" which slangc echo "\n" ls -lah ~/slang/bin/slangc + ls -lah ~/slang2/bin/slangc + ls -lah $VULKAN_SDK/bin/slangc + md5sum ~/slang2/bin/slangc md5sum ~/slang/bin/slangc md5sum $VULKAN_SDK/bin/slangc - name: downloading resources From 8a8e14343390e8f1b815b90b4bc6f29714e75de1 Mon Sep 17 00:00:00 2001 From: r Date: Thu, 3 Jul 2025 19:08:04 +0300 Subject: [PATCH 32/40] ci slang --- .github/workflows/cmake_lnx.yml | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/.github/workflows/cmake_lnx.yml b/.github/workflows/cmake_lnx.yml index 0609840..18746a7 100644 --- a/.github/workflows/cmake_lnx.yml +++ b/.github/workflows/cmake_lnx.yml @@ -75,7 +75,7 @@ jobs: - name: verifying vulkan & slang AGAIN!! run: | url=$(curl -s https://api.github.com/repos/shader-slang/slang/releases/latest | jq -r '.assets[] | select(.name | endswith("linux-x86_64.tar.gz")) | .browser_download_url') - mkdir -p ~/slang && curl -L "$url" | tar -xz -C ~/slang2 + mkdir -p ~/slang2 && curl -L "$url" | tar -xz -C ~/slang2 ls ~/slang2 ~/slang2/bin/slangc -v ~/slang/bin/slangc -v From 4464900c6392094281b77e4d82e25941a17ef937 Mon Sep 17 00:00:00 2001 From: r Date: Thu, 3 Jul 2025 19:21:46 +0300 Subject: [PATCH 33/40] ci slang --- .github/workflows/cmake_lnx.yml | 1 + src/playout/playoutgeneric.cpp | 4 ++-- 2 files changed, 3 insertions(+), 2 deletions(-) diff --git a/.github/workflows/cmake_lnx.yml b/.github/workflows/cmake_lnx.yml index 18746a7..1421d9d 100644 --- a/.github/workflows/cmake_lnx.yml +++ b/.github/workflows/cmake_lnx.yml @@ -39,6 +39,7 @@ jobs: mkdir -p ~/slang && curl -L "$url" | tar -xz -C ~/slang ls ~/slang ~/slang/bin/slangc -v + sudo cp -v -f ~/slang/bin/* /usr/bin - name: update submodules run: | git submodule update --init --recursive diff --git a/src/playout/playoutgeneric.cpp b/src/playout/playoutgeneric.cpp index 8ae1b3c..f5e57ba 100644 --- a/src/playout/playoutgeneric.cpp +++ b/src/playout/playoutgeneric.cpp @@ -175,8 +175,8 @@ void playoutgeneric::updatemats() { modelsettings &settings = i->getinstancesettings(); if (!settings.msdrawmodel) continue; - jointmats.push_back(i->calcstaticmat()); - nummats++; + jointmats.push_back(i->calcstaticmat()); + nummats++; totaltricount += mgltf->gettricount(0, 0); } } From ff7c3ad36c3326d0bd3b5c476f093a80e156e05c Mon Sep 17 00:00:00 2001 From: r Date: Fri, 4 Jul 2025 12:01:33 +0300 Subject: [PATCH 34/40] ci slang --- .github/workflows/cmake_lnx.yml | 8 +++++--- 1 file changed, 5 insertions(+), 3 deletions(-) diff --git a/.github/workflows/cmake_lnx.yml b/.github/workflows/cmake_lnx.yml index 1421d9d..afc8e23 100644 --- a/.github/workflows/cmake_lnx.yml +++ b/.github/workflows/cmake_lnx.yml @@ -39,7 +39,9 @@ jobs: mkdir -p ~/slang && curl -L "$url" | tar -xz -C ~/slang ls ~/slang ~/slang/bin/slangc -v - sudo cp -v -f ~/slang/bin/* /usr/bin + sudo cp -v -f ~/slang/bin/* /usr/local/bin + ldconfig + sudo ldconfig - name: update submodules run: | git submodule update --init --recursive @@ -56,12 +58,12 @@ jobs: mv $(ls | head -n 1)/x86_64/* . rm -r $(ls | head -n 1) export VULKAN_SDK=/home/runner/vulk - export PATH=$VULKAN_SDK/bin:$PATH + export PATH=~/slang/bin:$VULKAN_SDK/bin:$PATH export LD_LIBRARY_PATH=$VULKAN_SDK/lib:$LD_LIBRARY_PATH export VK_ICD_FILENAMES=$VULKAN_SDK/etc/vulkan/icd.d export VK_LAYER_PATH=$VULKAN_SDK/etc/vulkan/explicit_layer.d echo VULKAN_SDK=/home/runner/vulk >> $GITHUB_ENV - echo PATH=$VULKAN_SDK/bin:$PATH >> $GITHUB_ENV + echo PATH=~/slang/bin:$VULKAN_SDK/bin:$PATH >> $GITHUB_ENV echo LD_LIBRARY_PATH=$VULKAN_SDK/lib:$LD_LIBRARY_PATH >> $GITHUB_ENV echo VK_ICD_FILENAMES=$VULKAN_SDK/etc/vulkan/icd.d >> $GITHUB_ENV echo VK_LAYER_PATH=$VULKAN_SDK/etc/vulkan/explicit_layer.d >> $GITHUB_ENV From 1d370f432d173a2adfe539d0417ad0ce95ad0644 Mon Sep 17 00:00:00 2001 From: r Date: Fri, 4 Jul 2025 14:38:58 +0300 Subject: [PATCH 35/40] ci slang --- .github/workflows/cmake_lnx.yml | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/.github/workflows/cmake_lnx.yml b/.github/workflows/cmake_lnx.yml index afc8e23..69c99f4 100644 --- a/.github/workflows/cmake_lnx.yml +++ b/.github/workflows/cmake_lnx.yml @@ -40,7 +40,6 @@ jobs: ls ~/slang ~/slang/bin/slangc -v sudo cp -v -f ~/slang/bin/* /usr/local/bin - ldconfig sudo ldconfig - name: update submodules run: | @@ -75,6 +74,7 @@ jobs: # mkdir -p ~/slang && curl -L "$url" | tar -xz -C ~/slang # ls ~/slang # ~/slang/bin/slangc -v + # i give up,.. - name: verifying vulkan & slang AGAIN!! run: | url=$(curl -s https://api.github.com/repos/shader-slang/slang/releases/latest | jq -r '.assets[] | select(.name | endswith("linux-x86_64.tar.gz")) | .browser_download_url') From 38efe6483748a0ed4f51241d1bdb983b77240a71 Mon Sep 17 00:00:00 2001 From: r Date: Sun, 6 Jul 2025 05:51:30 +0300 Subject: [PATCH 36/40] ci slang --- .github/workflows/cmake_lnx.yml | 6 +++--- 1 file changed, 3 insertions(+), 3 deletions(-) diff --git a/.github/workflows/cmake_lnx.yml b/.github/workflows/cmake_lnx.yml index 69c99f4..8d007ef 100644 --- a/.github/workflows/cmake_lnx.yml +++ b/.github/workflows/cmake_lnx.yml @@ -40,6 +40,7 @@ jobs: ls ~/slang ~/slang/bin/slangc -v sudo cp -v -f ~/slang/bin/* /usr/local/bin + sudo cp -v -f ~/slang/lib/* /usr/local/lib sudo ldconfig - name: update submodules run: | @@ -58,15 +59,14 @@ jobs: rm -r $(ls | head -n 1) export VULKAN_SDK=/home/runner/vulk export PATH=~/slang/bin:$VULKAN_SDK/bin:$PATH - export LD_LIBRARY_PATH=$VULKAN_SDK/lib:$LD_LIBRARY_PATH + export LD_LIBRARY_PATH=~/slang/lib:$VULKAN_SDK/lib:$LD_LIBRARY_PATH export VK_ICD_FILENAMES=$VULKAN_SDK/etc/vulkan/icd.d export VK_LAYER_PATH=$VULKAN_SDK/etc/vulkan/explicit_layer.d echo VULKAN_SDK=/home/runner/vulk >> $GITHUB_ENV echo PATH=~/slang/bin:$VULKAN_SDK/bin:$PATH >> $GITHUB_ENV - echo LD_LIBRARY_PATH=$VULKAN_SDK/lib:$LD_LIBRARY_PATH >> $GITHUB_ENV echo VK_ICD_FILENAMES=$VULKAN_SDK/etc/vulkan/icd.d >> $GITHUB_ENV echo VK_LAYER_PATH=$VULKAN_SDK/etc/vulkan/explicit_layer.d >> $GITHUB_ENV - echo LD_LIBRARY_PATH=/home/runner/work/rview2/rview2/lib:$LD_LIBRARY_PATH >> $GITHUB_ENV + echo LD_LIBRARY_PATH=~/slang/lib:/home/runner/work/rview2/rview2/lib:$VULKAN_SDK/lib:$LD_LIBRARY_PATH >> $GITHUB_ENV sudo ldconfig # - name: downloading latest slang AGAIN # run: | From 753e1aa9f9eca46b44d47324e44745b85f045b40 Mon Sep 17 00:00:00 2001 From: r Date: Sun, 6 Jul 2025 08:21:55 +0300 Subject: [PATCH 37/40] ci slang --- .github/workflows/cmake_win.yml | 17 ++++++++++++----- 1 file changed, 12 insertions(+), 5 deletions(-) diff --git a/.github/workflows/cmake_win.yml b/.github/workflows/cmake_win.yml index 2963daf..572ce5e 100644 --- a/.github/workflows/cmake_win.yml +++ b/.github/workflows/cmake_win.yml @@ -42,6 +42,14 @@ jobs: # curl -L "https://github.com/openssl/openssl/releases/download/openssl-3.5.0/openssl-3.5.0.tar.gz" | tar -xz #doesnt work on runner pwsh -c 'curl -L "https://github.com/openssl/openssl/releases/download/openssl-3.5.0/openssl-3.5.0.tar.gz" -o ossl.tar.gz' tar -xvzf ossl.tar.gz + $url = curl -L "https://api.github.com/repos/shader-slang/slang/releases/latest" | ForEach-Object { $_.assets } | Where-Object { $_.name -like "*windows-x86_64.tar.gz" } | Select-Object -ExpandProperty browser_download_url + mkdir D:/a/slang + cd D:/a/slang + curl -L $url -o slang.tar.gz + 7z x slang.tar.gz -aoa + 7z x slang.tar -aoa + rm slang.tar.gz + rm slang.tar - shell: msys2 {0} run: | cd /d/a/rview2/rview2/openssl-3.5.0 @@ -64,20 +72,19 @@ jobs: ./sdk.exe --root D:/a/vulk --accept-licenses --default-answer --confirm-command install rm sdk.exe $env:VULKAN_SDK="D:/a/vulk" - $env:PATH="$env:VULKAN_SDK/bin;$env:PATH" - $env:LD_LIBRARY_PATH="$env:VULKAN_SDK/lib;$env:LD_LIBRARY_PATH" + $env:SLANG_SDK="D:/a/slang" + $env:PATH="$env:SLANG_SDK/bin;$env:VULKAN_SDK/bin;$env:PATH" + $env:LD_LIBRARY_PATH="D:/a/work/rview2/rview2/lib;$env:SLANG_SDK/lib;$env:VULKAN_SDK/lib;$env:LD_LIBRARY_PATH" $env:VK_ICD_FILENAMES="$env:VULKAN_SDK/etc/vulkan/icd.d" $env:VK_LAYER_PATH="$env:VULKAN_SDK/etc/vulkan/explicit_layer.d" - $env:LD_LIBRARY_PATH="D:/a/work/rview2/rview2/lib;$env:LD_LIBRARY_PATH" echo VULKAN_SDK=$env:VULKAN_SDK | tee -a $env:GITHUB_ENV echo PATH=$env:PATH | tee -a $env:GITHUB_ENV echo LD_LIBRARY_PATH=$env:LD_LIBRARY_PATH | tee -a $env:GITHUB_ENV echo VK_ICD_FILENAMES=$env:VULKAN_SDK/etc/vulkan/icd.d | tee -a $env:GITHUB_ENV echo VK_LAYER_PATH=$env:VULKAN_SDK/etc/vulkan/explicit_layer.d | tee -a $env:GITHUB_ENV - echo LD_LIBRARY_PATH=$env:LD_LIBRARY_PATH | tee -a $env:GITHUB_ENV - name: verifying vulkan run: | - powershell -c "$env:VULKAN_SDK/bin/glslc --version" + pwsh -c "$env:VULKAN_SDK/bin/glslc --version" echo $VULKAN_SDK ls -r $VULKAN_SDK - name: downloading resources From 8013d3fc2b11580e6792204f6f753a303424d671 Mon Sep 17 00:00:00 2001 From: rarepng <153374928+rarepng@users.noreply.github.com> Date: Sun, 6 Jul 2025 09:24:53 +0300 Subject: [PATCH 38/40] Update cmake_win.yml --- .github/workflows/cmake_win.yml | 5 +++-- 1 file changed, 3 insertions(+), 2 deletions(-) diff --git a/.github/workflows/cmake_win.yml b/.github/workflows/cmake_win.yml index 572ce5e..e9329f3 100644 --- a/.github/workflows/cmake_win.yml +++ b/.github/workflows/cmake_win.yml @@ -46,10 +46,11 @@ jobs: mkdir D:/a/slang cd D:/a/slang curl -L $url -o slang.tar.gz + ls 7z x slang.tar.gz -aoa 7z x slang.tar -aoa - rm slang.tar.gz - rm slang.tar + # rm slang.tar.gz + # rm slang.tar - shell: msys2 {0} run: | cd /d/a/rview2/rview2/openssl-3.5.0 From 5ac681754ae1b5ec3042ca5e81515ddbedd0bef4 Mon Sep 17 00:00:00 2001 From: r Date: Mon, 7 Jul 2025 12:54:49 +0300 Subject: [PATCH 39/40] ci slang --- .github/workflows/cmake_win.yml | 3 +++ 1 file changed, 3 insertions(+) diff --git a/.github/workflows/cmake_win.yml b/.github/workflows/cmake_win.yml index e9329f3..20b5f66 100644 --- a/.github/workflows/cmake_win.yml +++ b/.github/workflows/cmake_win.yml @@ -47,8 +47,11 @@ jobs: cd D:/a/slang curl -L $url -o slang.tar.gz ls + pwd 7z x slang.tar.gz -aoa + ls 7z x slang.tar -aoa + ls # rm slang.tar.gz # rm slang.tar - shell: msys2 {0} From 9013b838f33c648dd1c18d08ce71a70b9cb29139 Mon Sep 17 00:00:00 2001 From: r Date: Mon, 7 Jul 2025 13:10:06 +0300 Subject: [PATCH 40/40] ci slang --- .github/workflows/cmake_win.yml | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/.github/workflows/cmake_win.yml b/.github/workflows/cmake_win.yml index 20b5f66..2060c99 100644 --- a/.github/workflows/cmake_win.yml +++ b/.github/workflows/cmake_win.yml @@ -42,7 +42,7 @@ jobs: # curl -L "https://github.com/openssl/openssl/releases/download/openssl-3.5.0/openssl-3.5.0.tar.gz" | tar -xz #doesnt work on runner pwsh -c 'curl -L "https://github.com/openssl/openssl/releases/download/openssl-3.5.0/openssl-3.5.0.tar.gz" -o ossl.tar.gz' tar -xvzf ossl.tar.gz - $url = curl -L "https://api.github.com/repos/shader-slang/slang/releases/latest" | ForEach-Object { $_.assets } | Where-Object { $_.name -like "*windows-x86_64.tar.gz" } | Select-Object -ExpandProperty browser_download_url + $url = curl -L "https://api.github.com/repos/shader-slang/slang/releases/latest" | ConvertFrom-Json | ForEach-Object { $_.assets } | Where-Object { $_.name -like "*windows-x86_64.tar.gz" } | Select-Object -ExpandProperty browser_download_url mkdir D:/a/slang cd D:/a/slang curl -L $url -o slang.tar.gz