From e573a4c2442a1bffc41430e53020cbbb18f85449 Mon Sep 17 00:00:00 2001 From: saschawillems Date: Sat, 7 Jan 2017 20:46:28 +0100 Subject: [PATCH] Use createBuffer function from Vulkan device class --- computeshader/computeshader.cpp | 66 ++++----- computeshader/computeshader.vcxproj | 7 + computeshader/computeshader.vcxproj.filters | 17 +++ data/shaders/deferred/deferred.vert | 13 +- data/shaders/deferred/deferred.vert.spv | Bin 1304 -> 1028 bytes data/shaders/shadowmapping/scene.frag | 4 +- data/shaders/shadowmapping/scene.frag.spv | Bin 4808 -> 5220 bytes debugmarker/debugmarker.cpp | 46 +++---- deferredshadows/deferredshadows.cpp | 14 +- distancefieldfonts/distancefieldfonts.cpp | 74 +++++----- instancing/instancing.cpp | 13 +- mesh/mesh.cpp | 38 +++--- offscreen/offscreen.cpp | 14 +- particlefire/particlefire.cpp | 7 +- skeletalanimation/skeletalanimation.cpp | 142 ++++++++------------ 15 files changed, 222 insertions(+), 233 deletions(-) diff --git a/computeshader/computeshader.cpp b/computeshader/computeshader.cpp index 0f23c458..a7818aa1 100644 --- a/computeshader/computeshader.cpp +++ b/computeshader/computeshader.cpp @@ -65,9 +65,9 @@ public: uint32_t queueFamilyIndex; // Family index of the graphics queue, used for barriers } compute; - struct { - vkMeshLoader::MeshBuffer quad; - } meshes; + vk::Buffer vertexBuffer; + vk::Buffer indexBuffer; + uint32_t indexCount; vk::Buffer uniformBufferVS; @@ -105,8 +105,10 @@ public: vkDestroyFence(device, compute.fence, nullptr); vkDestroyCommandPool(device, compute.commandPool, nullptr); - vkMeshLoader::freeMeshBufferResources(device, &meshes.quad); + vertexBuffer.destroy(); + indexBuffer.destroy(); uniformBufferVS.destroy(); + textureLoader->destroyTexture(textureColorMap); textureLoader->destroyTexture(textureComputeTarget); } @@ -262,14 +264,14 @@ public: vkCmdSetScissor(drawCmdBuffers[i], 0, 1, &scissor); VkDeviceSize offsets[1] = { 0 }; - vkCmdBindVertexBuffers(drawCmdBuffers[i], VERTEX_BUFFER_BIND_ID, 1, &meshes.quad.vertices.buf, offsets); - vkCmdBindIndexBuffer(drawCmdBuffers[i], meshes.quad.indices.buf, 0, VK_INDEX_TYPE_UINT32); + vkCmdBindVertexBuffers(drawCmdBuffers[i], VERTEX_BUFFER_BIND_ID, 1, &vertexBuffer.buffer, offsets); + vkCmdBindIndexBuffer(drawCmdBuffers[i], indexBuffer.buffer, 0, VK_INDEX_TYPE_UINT32); // Left (pre compute) vkCmdBindDescriptorSets(drawCmdBuffers[i], VK_PIPELINE_BIND_POINT_GRAPHICS, graphics.pipelineLayout, 0, 1, &graphics.descriptorSetPreCompute, 0, NULL); vkCmdBindPipeline(drawCmdBuffers[i], VK_PIPELINE_BIND_POINT_GRAPHICS, graphics.pipeline); - vkCmdDrawIndexed(drawCmdBuffers[i], meshes.quad.indexCount, 1, 0, 0, 0); + vkCmdDrawIndexed(drawCmdBuffers[i], indexCount, 1, 0, 0, 0); // Right (post compute) vkCmdBindDescriptorSets(drawCmdBuffers[i], VK_PIPELINE_BIND_POINT_GRAPHICS, graphics.pipelineLayout, 0, 1, &graphics.descriptorSetPostCompute, 0, NULL); @@ -277,7 +279,7 @@ public: viewport.x = (float)width / 2.0f; vkCmdSetViewport(drawCmdBuffers[i], 0, 1, &viewport); - vkCmdDrawIndexed(drawCmdBuffers[i], meshes.quad.indexCount, 1, 0, 0, 0); + vkCmdDrawIndexed(drawCmdBuffers[i], indexCount, 1, 0, 0, 0); vkCmdEndRenderPass(drawCmdBuffers[i]); @@ -306,33 +308,35 @@ public: // Setup vertices for a single uv-mapped quad void generateQuad() { -#define dim 1.0f - std::vector vertexBuffer = + // Setup vertices for a single uv-mapped quad made from two triangles + std::vector vertices = { - { { dim, dim, 0.0f }, { 1.0f, 1.0f } }, - { { -dim, dim, 0.0f }, { 0.0f, 1.0f } }, - { { -dim, -dim, 0.0f }, { 0.0f, 0.0f } }, - { { dim, -dim, 0.0f }, { 1.0f, 0.0f } } + { { 1.0f, 1.0f, 0.0f }, { 1.0f, 1.0f } }, + { { -1.0f, 1.0f, 0.0f }, { 0.0f, 1.0f } }, + { { -1.0f, -1.0f, 0.0f }, { 0.0f, 0.0f } }, + { { 1.0f, -1.0f, 0.0f }, { 1.0f, 0.0f } } }; -#undef dim - - createBuffer( - VK_BUFFER_USAGE_VERTEX_BUFFER_BIT, - vertexBuffer.size() * sizeof(Vertex), - vertexBuffer.data(), - &meshes.quad.vertices.buf, - &meshes.quad.vertices.mem); // Setup indices - std::vector indexBuffer = { 0,1,2, 2,3,0 }; - meshes.quad.indexCount = indexBuffer.size(); + std::vector indices = { 0,1,2, 2,3,0 }; + indexCount = static_cast(indices.size()); - createBuffer( + // Create buffers + // For the sake of simplicity we won't stage the vertex data to the gpu memory + // Vertex buffer + VK_CHECK_RESULT(vulkanDevice->createBuffer( + VK_BUFFER_USAGE_VERTEX_BUFFER_BIT, + VK_MEMORY_PROPERTY_HOST_VISIBLE_BIT | VK_MEMORY_PROPERTY_HOST_COHERENT_BIT, + &vertexBuffer, + vertices.size() * sizeof(Vertex), + vertices.data())); + // Index buffer + VK_CHECK_RESULT(vulkanDevice->createBuffer( VK_BUFFER_USAGE_INDEX_BUFFER_BIT, - indexBuffer.size() * sizeof(uint32_t), - indexBuffer.data(), - &meshes.quad.indices.buf, - &meshes.quad.indices.mem); + VK_MEMORY_PROPERTY_HOST_VISIBLE_BIT | VK_MEMORY_PROPERTY_HOST_COHERENT_BIT, + &indexBuffer, + indices.size() * sizeof(uint32_t), + indices.data())); } void setupVertexDescriptions() @@ -354,14 +358,14 @@ public: VERTEX_BUFFER_BIND_ID, 0, VK_FORMAT_R32G32B32_SFLOAT, - 0); + offsetof(Vertex, pos)); // Location 1 : Texture coordinates vertices.attributeDescriptions[1] = vkTools::initializers::vertexInputAttributeDescription( VERTEX_BUFFER_BIND_ID, 1, VK_FORMAT_R32G32_SFLOAT, - sizeof(float) * 3); + offsetof(Vertex, uv)); // Assign to vertex buffer vertices.inputState = vkTools::initializers::pipelineVertexInputStateCreateInfo(); diff --git a/computeshader/computeshader.vcxproj b/computeshader/computeshader.vcxproj index b8ac0708..d403519d 100644 --- a/computeshader/computeshader.vcxproj +++ b/computeshader/computeshader.vcxproj @@ -90,6 +90,13 @@ + + + + + + + diff --git a/computeshader/computeshader.vcxproj.filters b/computeshader/computeshader.vcxproj.filters index 2107681a..74d2aade 100644 --- a/computeshader/computeshader.vcxproj.filters +++ b/computeshader/computeshader.vcxproj.filters @@ -42,4 +42,21 @@ Header Files + + + Shaders + + + Shaders + + + Shaders + + + Shaders + + + Shaders + + \ No newline at end of file diff --git a/data/shaders/deferred/deferred.vert b/data/shaders/deferred/deferred.vert index f6d023e8..8a38fdeb 100644 --- a/data/shaders/deferred/deferred.vert +++ b/data/shaders/deferred/deferred.vert @@ -3,15 +3,6 @@ #extension GL_ARB_separate_shader_objects : enable #extension GL_ARB_shading_language_420pack : enable -layout (location = 0) in vec3 inPos; -layout (location = 1) in vec2 inUV; - -layout (binding = 0) uniform UBO -{ - mat4 projection; - mat4 model; -} ubo; - layout (location = 0) out vec2 outUV; out gl_PerVertex @@ -21,6 +12,6 @@ out gl_PerVertex void main() { - outUV = inUV; - gl_Position = ubo.projection * ubo.model * vec4(inPos.xyz, 1.0); + outUV = vec2((gl_VertexIndex << 1) & 2, gl_VertexIndex & 2); + gl_Position = vec4(outUV * 2.0f - 1.0f, 0.0f, 1.0f); } diff --git a/data/shaders/deferred/deferred.vert.spv b/data/shaders/deferred/deferred.vert.spv index dbaf4b667cef2cf68c1e0119e144d7a8251fc931..77f02b8bae8773a74a5f1a200019b8e1f32885da 100644 GIT binary patch literal 1028 zcmZ9K-Afxm6vfBHM6Fe8{i^k&YpqpU5Gg7`X{~*ULLQ=}d0n<geD{x% zg8z~)1&K5&5Fs_s40mXGia)AuhoCmSJSMuy1ubS z#;_^7L~=&-9jjM3jXE*$fbddyE0pysX}?i&uTE<9aOdD>nA)?b8)Y_3kD`|ChRL75 z_ApDI=IE#sx5JYtZl6bO8?Jv@JBtpFO+`+R>%pm+oM*qA+AHdt`t6gjX}g)d*o#~C zBG=#Kdc$_}BT;2n4LVETG?KKFb&^;Q8B>A7(qRD)f#o?a_PFMP%n<5PSyt{Cm{ zHxuIM4f*mGlL9{I-_;#&f`%vOvjW<+&*y&zjd>Ivfnw$Xu6*8tVsZmvUm7!96wq0P m_CYaPkI+y>X0{}d%NcXUcSjz~by?u8cpv(OlmA~1Tf#l@0!YFD literal 1304 zcmY+C+fEZv6oz+?BA|$zQE^J~gb5)Ajfp{pn{v@a)WGdzpgU!>%rrC8#7kd6AIYck z#)SXdGdrofSzYV@_d4%s)VsHgsp&Ukc1?K}Ok z#Am_Wc6L+$*HN4RVCE$EB!Q%%UtRi-0-Cz*^~0kt$6;>AQ5F?8%&($>&BFBJo4qXZ z|9x~7C&O?QCBsQHwBf<4{c&{p-L#Zxx+a*q>7+P2mj=^AoH!`lR^P@9N8zc>&TUrM zAA({_9-F%~kBc}>s9@3$>xCR7fg;5MbIw?p3_r4ICgm=f8R&T;j+F=)8$Wx9NtHd?B?-t)R>L~ z6ZcW#nO4lU*9?YKL$ahDYe0(EYiehhY#4bpa2aeoezE!vt;YH~{Lavt;zAu}z zF1#d7t}=J|4sZzhSEQMPeUTr`zWi)!m5sm8zbTt~^v>Ss-Ou{Cx`QVlIH)+{@!ggf z^Ya7spUWba9^dGdsY|aM_`hO!`$MtpZ(hRg-s_efgOB7vpX(BOXMX(Yc|!v4eICfh zhZ(%jL)q}Zm4}!|65`0{;ASi$qgteQw#tA diff --git a/data/shaders/shadowmapping/scene.frag b/data/shaders/shadowmapping/scene.frag index 4ac524b1..cde0e280 100644 --- a/data/shaders/shadowmapping/scene.frag +++ b/data/shaders/shadowmapping/scene.frag @@ -11,6 +11,8 @@ layout (location = 2) in vec3 inViewVec; layout (location = 3) in vec3 inLightVec; layout (location = 4) in vec4 inShadowCoord; +layout (constant_id = 0) const int enablePCF = 0; + layout (location = 0) out vec4 outFragColor; #define ambient 0.1 @@ -55,7 +57,7 @@ float filterPCF(vec4 sc) void main() { - float shadow = filterPCF(inShadowCoord / inShadowCoord.w); + float shadow = (enablePCF == 1) ? filterPCF(inShadowCoord / inShadowCoord.w) : textureProj(inShadowCoord / inShadowCoord.w, vec2(0.0)); vec3 N = normalize(inNormal); vec3 L = normalize(inLightVec); diff --git a/data/shaders/shadowmapping/scene.frag.spv b/data/shaders/shadowmapping/scene.frag.spv index adde1e7e872c697d5c0c5a5ee0cc45c6b9cd7c41..b24ede8a85c4be658bf2965221e169d956ee37af 100644 GIT binary patch delta 1724 zcmZ9M$xl;J6vl5`Kx)8+aY$UKi7{beTo_}5h>0PDg#-tZ?p!od$Exu4|8UCP z7Ve62Yoncld{?13knIpMb<5p9yk9Q8;Sw zOx)HeUgKVC?Fo8&2Y2Tpu^cDJw-x#eMd3PE9-c|IY)gpc>(FsH=3-fm$6N-Ok2sRR zDUVSAPI}A^V0w~YF6~WCC&E>7H;OtU<6EuGmuNjIyC{S2lPy)=39XdtWn7ELBc3CE z%KLR%SLhgNt=DAhye(ADP5H!;shZH;l0!oRG`XXdO~7md=B#jrIcpqGRAJ6aoPM9R zvYCknmp!+}4X>?R8O{?t980N}&-7RcnCUS*TRzicm?JPfam=*D@pu(x7<{~P2TTOS zwA3Eg%J*0Ld5B{&9^;Q*6TekFxhG{KvJJXyF8{R0i?ou%MW6BfW>rvg)^qR`3!U4i z1_aN^XiCz03E>vtnxmm~?t=WeGI-+L8r+P8AsT@QHG!Ap#|2*YI4*Eh`#S=r@QVD= zDl>ss#nY4=1n?|y_&f>Y)~s`L@{(+hj2vPn7(OmIM7dqp4f&jkRsIBc?$Qi`bVkdUVLhB_2ix)BR5hkYF3Wl5ZOlV?!nu-Zpq6pA8JZm5+dfepcSe zCkGx8Jjr_*eVb&&5z|^x;oL_7e!2VA0L7nVa15fzWP1b+cOZAcds)m>95~@E({#qa@ox8 z3J-;j@KMM+XMUA3B5^V?)o7-3BWc=hiuYN?mSs;j+Km~oR094=Xtji{V8R;RC>wF z+Mo@2&X!0ee#QG$*=^#tWbrwQ_-$Eg(cyPwsfE)I&bVlSGp_i7{{r(C6POoH!_TrD z76ydpi%ZpgS--sHLWEIxxR43wp^BV`DRSPS$axF+L7j|U5?IF}y#%Yc>iG_{%q6jl zYd&yHB@|uv8hXHaH6V6FpeZ@Sx)>Kg+pjpiZVHeEa^Dd#LD?ii_8_rb3IthfL=kjS3_zU?A zQ`6l!_@zLTQGs0InZMa9`NYG4ujPjWi7_P4g--vBhHnK92nW8C&j1(vI^WAD2c02U z@dts%g934e3H7V;`TFKnPybKCsz40`@O_{uKXVCRL=b5}^REJL78-n$PY(KVKh$^m o==_4#laIz=LHpsgvTXRa*5p&)v(08CY!#R+mtE^_+%U2JFJ|+pG5`Po diff --git a/debugmarker/debugmarker.cpp b/debugmarker/debugmarker.cpp index 14bedc6c..13f56eb4 100644 --- a/debugmarker/debugmarker.cpp +++ b/debugmarker/debugmarker.cpp @@ -574,39 +574,37 @@ public: // Create staging buffers // Vertex data - createBuffer( + VK_CHECK_RESULT(vulkanDevice->createBuffer( VK_BUFFER_USAGE_TRANSFER_SRC_BIT, - VK_MEMORY_PROPERTY_HOST_VISIBLE_BIT, - vertexBufferSize, - vertexBuffer.data(), + VK_MEMORY_PROPERTY_HOST_VISIBLE_BIT | VK_MEMORY_PROPERTY_HOST_COHERENT_BIT, + vertexBufferSize, &vertexStaging.buffer, - &vertexStaging.memory); + &vertexStaging.memory, + vertexBuffer.data())); // Index data - createBuffer( + VK_CHECK_RESULT(vulkanDevice->createBuffer( VK_BUFFER_USAGE_TRANSFER_SRC_BIT, - VK_MEMORY_PROPERTY_HOST_VISIBLE_BIT, + VK_MEMORY_PROPERTY_HOST_VISIBLE_BIT | VK_MEMORY_PROPERTY_HOST_COHERENT_BIT, indexBufferSize, - indexBuffer.data(), &indexStaging.buffer, - &indexStaging.memory); + &indexStaging.memory, + indexBuffer.data())); // Create device local buffers // Vertex buffer - createBuffer( + VK_CHECK_RESULT(vulkanDevice->createBuffer( VK_BUFFER_USAGE_VERTEX_BUFFER_BIT | VK_BUFFER_USAGE_TRANSFER_DST_BIT, VK_MEMORY_PROPERTY_DEVICE_LOCAL_BIT, vertexBufferSize, - nullptr, &scene->vertices.buf, - &scene->vertices.mem); + &scene->vertices.mem)); // Index buffer - createBuffer( + VK_CHECK_RESULT(vulkanDevice->createBuffer( VK_BUFFER_USAGE_INDEX_BUFFER_BIT | VK_BUFFER_USAGE_TRANSFER_DST_BIT, VK_MEMORY_PROPERTY_DEVICE_LOCAL_BIT, indexBufferSize, - nullptr, &scene->indices.buf, - &scene->indices.mem); + &scene->indices.mem)); // Copy from staging buffers VkCommandBuffer copyCmd = VulkanExampleBase::createCommandBuffer(VK_COMMAND_BUFFER_LEVEL_PRIMARY, true); @@ -639,21 +637,21 @@ public: else { // Vertex buffer - createBuffer( + vulkanDevice->createBuffer( VK_BUFFER_USAGE_VERTEX_BUFFER_BIT, - VK_MEMORY_PROPERTY_HOST_VISIBLE_BIT, - vertexBufferSize, - vertexBuffer.data(), + VK_MEMORY_PROPERTY_HOST_VISIBLE_BIT | VK_MEMORY_PROPERTY_HOST_COHERENT_BIT, + vertexBufferSize, &scene->vertices.buf, - &scene->vertices.mem); + &scene->vertices.mem, + vertexBuffer.data()); // Index buffer - createBuffer( + vulkanDevice->createBuffer( VK_BUFFER_USAGE_INDEX_BUFFER_BIT, - VK_MEMORY_PROPERTY_HOST_VISIBLE_BIT, + VK_MEMORY_PROPERTY_HOST_VISIBLE_BIT | VK_MEMORY_PROPERTY_HOST_COHERENT_BIT, indexBufferSize, - indexBuffer.data(), &scene->indices.buf, - &scene->indices.mem); + &scene->indices.mem, + indexBuffer.data()); } delete(meshLoader); diff --git a/deferredshadows/deferredshadows.cpp b/deferredshadows/deferredshadows.cpp index f49e177a..a0805620 100644 --- a/deferredshadows/deferredshadows.cpp +++ b/deferredshadows/deferredshadows.cpp @@ -519,12 +519,13 @@ public: vertexBuffer.push_back({ { 0.0f, 0.0f, 0.0f },{ 0.0f, 0.0f },{ 1.0f, 1.0f, 1.0f },{ 0.0f, 0.0f, 0.0f } }); vertexBuffer.push_back({ { 1.0f, 0.0f, 0.0f },{ 1.0f, 0.0f },{ 1.0f, 1.0f, 1.0f },{ 0.0f, 0.0f, 0.0f } }); - createBuffer( + VK_CHECK_RESULT(vulkanDevice->createBuffer( VK_BUFFER_USAGE_VERTEX_BUFFER_BIT, + VK_MEMORY_PROPERTY_HOST_VISIBLE_BIT | VK_MEMORY_PROPERTY_HOST_COHERENT_BIT, vertexBuffer.size() * sizeof(Vertex), - vertexBuffer.data(), &meshes.quad.vertices.buf, - &meshes.quad.vertices.mem); + &meshes.quad.vertices.mem, + vertexBuffer.data())); // Setup indices std::vector indexBuffer = { 0,1,2, 2,3,0 }; @@ -538,12 +539,13 @@ public: } meshes.quad.indexCount = static_cast(indexBuffer.size()); - createBuffer( + VK_CHECK_RESULT(vulkanDevice->createBuffer( VK_BUFFER_USAGE_INDEX_BUFFER_BIT, + VK_MEMORY_PROPERTY_HOST_VISIBLE_BIT | VK_MEMORY_PROPERTY_HOST_COHERENT_BIT, indexBuffer.size() * sizeof(uint32_t), - indexBuffer.data(), &meshes.quad.indices.buf, - &meshes.quad.indices.mem); + &meshes.quad.indices.mem, + indexBuffer.data())); } void setupVertexDescriptions() diff --git a/distancefieldfonts/distancefieldfonts.cpp b/distancefieldfonts/distancefieldfonts.cpp index d3c65f42..413a5e80 100644 --- a/distancefieldfonts/distancefieldfonts.cpp +++ b/distancefieldfonts/distancefieldfonts.cpp @@ -70,18 +70,14 @@ public: } textures; struct { - VkBuffer buf; - VkDeviceMemory mem; VkPipelineVertexInputStateCreateInfo inputState; std::vector bindingDescriptions; std::vector attributeDescriptions; } vertices; - struct { - int count; - VkBuffer buf; - VkDeviceMemory mem; - } indices; + vk::Buffer vertexBuffer; + vk::Buffer indexBuffer; + uint32_t indexCount; struct { vk::Buffer vs; @@ -129,15 +125,13 @@ public: textureLoader->destroyTexture(textures.fontBitmap); vkDestroyPipeline(device, pipelines.sdf, nullptr); + vkDestroyPipeline(device, pipelines.bitmap, nullptr); vkDestroyPipelineLayout(device, pipelineLayout, nullptr); vkDestroyDescriptorSetLayout(device, descriptorSetLayout, nullptr); - vkDestroyBuffer(device, vertices.buf, nullptr); - vkFreeMemory(device, vertices.mem, nullptr); - - vkDestroyBuffer(device, indices.buf, nullptr); - vkFreeMemory(device, indices.mem, nullptr); + vertexBuffer.destroy(); + indexBuffer.destroy(); uniformBuffers.vs.destroy(); uniformBuffers.fs.destroy(); @@ -260,9 +254,9 @@ public: // Signed distance field font vkCmdBindDescriptorSets(drawCmdBuffers[i], VK_PIPELINE_BIND_POINT_GRAPHICS, pipelineLayout, 0, 1, &descriptorSets.sdf, 0, NULL); vkCmdBindPipeline(drawCmdBuffers[i], VK_PIPELINE_BIND_POINT_GRAPHICS, pipelines.sdf); - vkCmdBindVertexBuffers(drawCmdBuffers[i], VERTEX_BUFFER_BIND_ID, 1, &vertices.buf, offsets); - vkCmdBindIndexBuffer(drawCmdBuffers[i], indices.buf, 0, VK_INDEX_TYPE_UINT32); - vkCmdDrawIndexed(drawCmdBuffers[i], indices.count, 1, 0, 0, 0); + vkCmdBindVertexBuffers(drawCmdBuffers[i], VERTEX_BUFFER_BIND_ID, 1, &vertexBuffer.buffer, offsets); + vkCmdBindIndexBuffer(drawCmdBuffers[i], indexBuffer.buffer, 0, VK_INDEX_TYPE_UINT32); + vkCmdDrawIndexed(drawCmdBuffers[i], indexCount, 1, 0, 0, 0); // Linear filtered bitmap font if (splitScreen) @@ -271,9 +265,7 @@ public: vkCmdSetViewport(drawCmdBuffers[i], 0, 1, &viewport); vkCmdBindDescriptorSets(drawCmdBuffers[i], VK_PIPELINE_BIND_POINT_GRAPHICS, pipelineLayout, 0, 1, &descriptorSets.bitmap, 0, NULL); vkCmdBindPipeline(drawCmdBuffers[i], VK_PIPELINE_BIND_POINT_GRAPHICS, pipelines.bitmap); - vkCmdBindVertexBuffers(drawCmdBuffers[i], VERTEX_BUFFER_BIND_ID, 1, &vertices.buf, offsets); - vkCmdBindIndexBuffer(drawCmdBuffers[i], indices.buf, 0, VK_INDEX_TYPE_UINT32); - vkCmdDrawIndexed(drawCmdBuffers[i], indices.count, 1, 0, 0, 0); + vkCmdDrawIndexed(drawCmdBuffers[i], indexCount, 1, 0, 0, 0); } vkCmdEndRenderPass(drawCmdBuffers[i]); @@ -285,8 +277,8 @@ public: // Creates a vertex buffer containing quads for the passed text void generateText(std:: string text) { - std::vector vertexBuffer; - std::vector indexBuffer; + std::vector vertices; + std::vector indices; uint32_t indexOffset = 0; float w = textures.fontSDF.width; @@ -315,43 +307,45 @@ public: float xo = charInfo->xoffset / 36.0f; float yo = charInfo->yoffset / 36.0f; - vertexBuffer.push_back({ { posx + dimx + xo, posy + dimy, 0.0f }, { ue, te } }); - vertexBuffer.push_back({ { posx + xo, posy + dimy, 0.0f }, { us, te } }); - vertexBuffer.push_back({ { posx + xo, posy, 0.0f }, { us, ts } }); - vertexBuffer.push_back({ { posx + dimx + xo, posy, 0.0f }, { ue, ts } }); + vertices.push_back({ { posx + dimx + xo, posy + dimy, 0.0f }, { ue, te } }); + vertices.push_back({ { posx + xo, posy + dimy, 0.0f }, { us, te } }); + vertices.push_back({ { posx + xo, posy, 0.0f }, { us, ts } }); + vertices.push_back({ { posx + dimx + xo, posy, 0.0f }, { ue, ts } }); - std::array indices = { 0,1,2, 2,3,0 }; - for (auto& index : indices) + std::array letterIndices = { 0,1,2, 2,3,0 }; + for (auto& index : letterIndices) { - indexBuffer.push_back(indexOffset + index); + indices.push_back(indexOffset + index); } indexOffset += 4; float advance = ((float)(charInfo->xadvance) / 36.0f); posx += advance; } - indices.count = indexBuffer.size(); + indexCount = indices.size(); // Center - for (auto& v : vertexBuffer) + for (auto& v : vertices) { v.pos[0] -= posx / 2.0f; v.pos[1] -= 0.5f; } - createBuffer( - VK_BUFFER_USAGE_VERTEX_BUFFER_BIT, - vertexBuffer.size() * sizeof(Vertex), - vertexBuffer.data(), - &vertices.buf, - &vertices.mem); + // Generate device local buffers for the text vertices and indices and upload the data - createBuffer( + VK_CHECK_RESULT(vulkanDevice->createBuffer( + VK_BUFFER_USAGE_VERTEX_BUFFER_BIT, + VK_MEMORY_PROPERTY_DEVICE_LOCAL_BIT | VK_MEMORY_PROPERTY_HOST_COHERENT_BIT, + &vertexBuffer, + vertices.size() * sizeof(Vertex), + vertices.data())); + + VK_CHECK_RESULT(vulkanDevice->createBuffer( VK_BUFFER_USAGE_INDEX_BUFFER_BIT, - indexBuffer.size() * sizeof(uint32_t), - indexBuffer.data(), - &indices.buf, - &indices.mem); + VK_MEMORY_PROPERTY_DEVICE_LOCAL_BIT | VK_MEMORY_PROPERTY_HOST_COHERENT_BIT, + &indexBuffer, + indices.size() * sizeof(uint32_t), + indices.data())); } void setupVertexDescriptions() diff --git a/instancing/instancing.cpp b/instancing/instancing.cpp index 76501c0c..3e29aac7 100644 --- a/instancing/instancing.cpp +++ b/instancing/instancing.cpp @@ -460,21 +460,20 @@ public: VkBuffer buffer; } stagingBuffer; - VulkanExampleBase::createBuffer( + VK_CHECK_RESULT(vulkanDevice->createBuffer( VK_BUFFER_USAGE_TRANSFER_SRC_BIT, - VK_MEMORY_PROPERTY_HOST_VISIBLE_BIT, + VK_MEMORY_PROPERTY_HOST_VISIBLE_BIT | VK_MEMORY_PROPERTY_HOST_COHERENT_BIT, instanceBuffer.size, - instanceData.data(), &stagingBuffer.buffer, - &stagingBuffer.memory); + &stagingBuffer.memory, + instanceData.data())); - VulkanExampleBase::createBuffer( + VK_CHECK_RESULT(vulkanDevice->createBuffer( VK_BUFFER_USAGE_VERTEX_BUFFER_BIT | VK_BUFFER_USAGE_TRANSFER_DST_BIT, VK_MEMORY_PROPERTY_DEVICE_LOCAL_BIT, instanceBuffer.size, - nullptr, &instanceBuffer.buffer, - &instanceBuffer.memory); + &instanceBuffer.memory)); // Copy to staging buffer VkCommandBuffer copyCmd = VulkanExampleBase::createCommandBuffer(VK_COMMAND_BUFFER_LEVEL_PRIMARY, true); diff --git a/mesh/mesh.cpp b/mesh/mesh.cpp index 466cbc9c..f4ca04cf 100644 --- a/mesh/mesh.cpp +++ b/mesh/mesh.cpp @@ -234,39 +234,37 @@ public: // Create staging buffers // Vertex data - createBuffer( + VK_CHECK_RESULT(vulkanDevice->createBuffer( VK_BUFFER_USAGE_TRANSFER_SRC_BIT, - VK_MEMORY_PROPERTY_HOST_VISIBLE_BIT, + VK_MEMORY_PROPERTY_HOST_VISIBLE_BIT | VK_MEMORY_PROPERTY_HOST_COHERENT_BIT, vertexBufferSize, - vertexBuffer.data(), &vertexStaging.buffer, - &vertexStaging.memory); + &vertexStaging.memory, + vertexBuffer.data())); // Index data - createBuffer( + VK_CHECK_RESULT(vulkanDevice->createBuffer( VK_BUFFER_USAGE_TRANSFER_SRC_BIT, - VK_MEMORY_PROPERTY_HOST_VISIBLE_BIT, + VK_MEMORY_PROPERTY_HOST_VISIBLE_BIT | VK_MEMORY_PROPERTY_HOST_COHERENT_BIT, indexBufferSize, - indexBuffer.data(), &indexStaging.buffer, - &indexStaging.memory); + &indexStaging.memory, + indexBuffer.data())); // Create device local buffers // Vertex buffer - createBuffer( + VK_CHECK_RESULT(vulkanDevice->createBuffer( VK_BUFFER_USAGE_VERTEX_BUFFER_BIT | VK_BUFFER_USAGE_TRANSFER_DST_BIT, VK_MEMORY_PROPERTY_DEVICE_LOCAL_BIT, vertexBufferSize, - nullptr, &mesh.vertices.buf, - &mesh.vertices.mem); + &mesh.vertices.mem)); // Index buffer - createBuffer( + VK_CHECK_RESULT(vulkanDevice->createBuffer( VK_BUFFER_USAGE_INDEX_BUFFER_BIT | VK_BUFFER_USAGE_TRANSFER_DST_BIT, VK_MEMORY_PROPERTY_DEVICE_LOCAL_BIT, indexBufferSize, - nullptr, &mesh.indices.buf, - &mesh.indices.mem); + &mesh.indices.mem)); // Copy from staging buffers VkCommandBuffer copyCmd = VulkanExampleBase::createCommandBuffer(VK_COMMAND_BUFFER_LEVEL_PRIMARY, true); @@ -299,21 +297,21 @@ public: else { // Vertex buffer - createBuffer( + VK_CHECK_RESULT(vulkanDevice->createBuffer( VK_BUFFER_USAGE_VERTEX_BUFFER_BIT, VK_MEMORY_PROPERTY_HOST_VISIBLE_BIT, vertexBufferSize, - vertexBuffer.data(), &mesh.vertices.buf, - &mesh.vertices.mem); + &mesh.vertices.mem, + vertexBuffer.data())); // Index buffer - createBuffer( + VK_CHECK_RESULT(vulkanDevice->createBuffer( VK_BUFFER_USAGE_INDEX_BUFFER_BIT, VK_MEMORY_PROPERTY_HOST_VISIBLE_BIT, indexBufferSize, - indexBuffer.data(), &mesh.indices.buf, - &mesh.indices.mem); + &mesh.indices.mem, + indexBuffer.data())); } delete(meshLoader); diff --git a/offscreen/offscreen.cpp b/offscreen/offscreen.cpp index e960864f..c241b24d 100644 --- a/offscreen/offscreen.cpp +++ b/offscreen/offscreen.cpp @@ -502,23 +502,25 @@ public: }; #undef QUAD_COLOR_NORMAL - createBuffer( + VK_CHECK_RESULT(vulkanDevice->createBuffer( VK_BUFFER_USAGE_VERTEX_BUFFER_BIT, + VK_MEMORY_PROPERTY_HOST_VISIBLE_BIT | VK_MEMORY_PROPERTY_HOST_COHERENT_BIT, vertexBuffer.size() * sizeof(Vertex), - vertexBuffer.data(), &meshes.quad.vertices.buf, - &meshes.quad.vertices.mem); + &meshes.quad.vertices.mem, + vertexBuffer.data())); // Setup indices std::vector indexBuffer = { 0,1,2, 2,3,0 }; meshes.quad.indexCount = indexBuffer.size(); - createBuffer( + VK_CHECK_RESULT(vulkanDevice->createBuffer( VK_BUFFER_USAGE_INDEX_BUFFER_BIT, + VK_MEMORY_PROPERTY_HOST_VISIBLE_BIT | VK_MEMORY_PROPERTY_HOST_COHERENT_BIT, indexBuffer.size() * sizeof(uint32_t), - indexBuffer.data(), &meshes.quad.indices.buf, - &meshes.quad.indices.mem); + &meshes.quad.indices.mem, + indexBuffer.data())); } void setupVertexDescriptions() diff --git a/particlefire/particlefire.cpp b/particlefire/particlefire.cpp index bfcf4c88..cce4ad83 100644 --- a/particlefire/particlefire.cpp +++ b/particlefire/particlefire.cpp @@ -278,12 +278,13 @@ public: particles.size = particleBuffer.size() * sizeof(Particle); - createBuffer( + VK_CHECK_RESULT(vulkanDevice->createBuffer( VK_BUFFER_USAGE_VERTEX_BUFFER_BIT, + VK_MEMORY_PROPERTY_HOST_VISIBLE_BIT | VK_MEMORY_PROPERTY_HOST_COHERENT_BIT, particles.size, - particleBuffer.data(), &particles.buffer, - &particles.memory); + &particles.memory, + particleBuffer.data())); // Map the memory and store the pointer for reuse VK_CHECK_RESULT(vkMapMemory(device, particles.memory, 0, particles.size, 0, &particles.mappedMemory)); diff --git a/skeletalanimation/skeletalanimation.cpp b/skeletalanimation/skeletalanimation.cpp index 15da152e..f548b6d5 100644 --- a/skeletalanimation/skeletalanimation.cpp +++ b/skeletalanimation/skeletalanimation.cpp @@ -552,98 +552,72 @@ public: VkDeviceSize indexBufferSize = indexBuffer.size() * sizeof(uint32_t); skinnedMesh->meshBuffer.indexCount = indexBuffer.size(); - bool useStaging = true; + struct { + VkBuffer buffer; + VkDeviceMemory memory; + } vertexStaging, indexStaging; - if (useStaging) - { - struct { - VkBuffer buffer; - VkDeviceMemory memory; - } vertexStaging, indexStaging; + // Create staging buffers + // Vertex data + VK_CHECK_RESULT(vulkanDevice->createBuffer( + VK_BUFFER_USAGE_TRANSFER_SRC_BIT, + VK_MEMORY_PROPERTY_HOST_VISIBLE_BIT | VK_MEMORY_PROPERTY_HOST_COHERENT_BIT, + vertexBufferSize, + &vertexStaging.buffer, + &vertexStaging.memory, + vertexBuffer.data())); + // Index data + VK_CHECK_RESULT(vulkanDevice->createBuffer( + VK_BUFFER_USAGE_TRANSFER_SRC_BIT, + VK_MEMORY_PROPERTY_HOST_VISIBLE_BIT | VK_MEMORY_PROPERTY_HOST_COHERENT_BIT, + indexBufferSize, + &indexStaging.buffer, + &indexStaging.memory, + indexBuffer.data())); - // Create staging buffers - // Vertex data - createBuffer( - VK_BUFFER_USAGE_TRANSFER_SRC_BIT, - VK_MEMORY_PROPERTY_HOST_VISIBLE_BIT, - vertexBufferSize, - vertexBuffer.data(), - &vertexStaging.buffer, - &vertexStaging.memory); - // Index data - createBuffer( - VK_BUFFER_USAGE_TRANSFER_SRC_BIT, - VK_MEMORY_PROPERTY_HOST_VISIBLE_BIT, - indexBufferSize, - indexBuffer.data(), - &indexStaging.buffer, - &indexStaging.memory); + // Create device local buffers + // Vertex buffer + VK_CHECK_RESULT(vulkanDevice->createBuffer( + VK_BUFFER_USAGE_VERTEX_BUFFER_BIT | VK_BUFFER_USAGE_TRANSFER_DST_BIT, + VK_MEMORY_PROPERTY_DEVICE_LOCAL_BIT, + vertexBufferSize, + &skinnedMesh->meshBuffer.vertices.buf, + &skinnedMesh->meshBuffer.vertices.mem)); + // Index buffer + VK_CHECK_RESULT(vulkanDevice->createBuffer( + VK_BUFFER_USAGE_INDEX_BUFFER_BIT | VK_BUFFER_USAGE_TRANSFER_DST_BIT, + VK_MEMORY_PROPERTY_DEVICE_LOCAL_BIT, + indexBufferSize, + &skinnedMesh->meshBuffer.indices.buf, + &skinnedMesh->meshBuffer.indices.mem)); - // Create device local buffers - // Vertex buffer - createBuffer( - VK_BUFFER_USAGE_VERTEX_BUFFER_BIT | VK_BUFFER_USAGE_TRANSFER_DST_BIT, - VK_MEMORY_PROPERTY_DEVICE_LOCAL_BIT, - vertexBufferSize, - nullptr, - &skinnedMesh->meshBuffer.vertices.buf, - &skinnedMesh->meshBuffer.vertices.mem); - // Index buffer - createBuffer( - VK_BUFFER_USAGE_INDEX_BUFFER_BIT | VK_BUFFER_USAGE_TRANSFER_DST_BIT, - VK_MEMORY_PROPERTY_DEVICE_LOCAL_BIT, - indexBufferSize, - nullptr, - &skinnedMesh->meshBuffer.indices.buf, - &skinnedMesh->meshBuffer.indices.mem); + // Copy from staging buffers + VkCommandBuffer copyCmd = VulkanExampleBase::createCommandBuffer(VK_COMMAND_BUFFER_LEVEL_PRIMARY, true); - // Copy from staging buffers - VkCommandBuffer copyCmd = VulkanExampleBase::createCommandBuffer(VK_COMMAND_BUFFER_LEVEL_PRIMARY, true); + VkBufferCopy copyRegion = {}; - VkBufferCopy copyRegion = {}; + copyRegion.size = vertexBufferSize; + vkCmdCopyBuffer( + copyCmd, + vertexStaging.buffer, + skinnedMesh->meshBuffer.vertices.buf, + 1, + ©Region); - copyRegion.size = vertexBufferSize; - vkCmdCopyBuffer( - copyCmd, - vertexStaging.buffer, - skinnedMesh->meshBuffer.vertices.buf, - 1, - ©Region); + copyRegion.size = indexBufferSize; + vkCmdCopyBuffer( + copyCmd, + indexStaging.buffer, + skinnedMesh->meshBuffer.indices.buf, + 1, + ©Region); - copyRegion.size = indexBufferSize; - vkCmdCopyBuffer( - copyCmd, - indexStaging.buffer, - skinnedMesh->meshBuffer.indices.buf, - 1, - ©Region); + VulkanExampleBase::flushCommandBuffer(copyCmd, queue, true); - VulkanExampleBase::flushCommandBuffer(copyCmd, queue, true); - - vkDestroyBuffer(device, vertexStaging.buffer, nullptr); - vkFreeMemory(device, vertexStaging.memory, nullptr); - vkDestroyBuffer(device, indexStaging.buffer, nullptr); - vkFreeMemory(device, indexStaging.memory, nullptr); - } - else - { - // Vertex buffer - createBuffer( - VK_BUFFER_USAGE_VERTEX_BUFFER_BIT, - VK_MEMORY_PROPERTY_HOST_VISIBLE_BIT, - vertexBufferSize, - vertexBuffer.data(), - &skinnedMesh->meshBuffer.vertices.buf, - &skinnedMesh->meshBuffer.vertices.mem); - // Index buffer - createBuffer( - VK_BUFFER_USAGE_INDEX_BUFFER_BIT, - VK_MEMORY_PROPERTY_HOST_VISIBLE_BIT, - indexBufferSize, - indexBuffer.data(), - &skinnedMesh->meshBuffer.indices.buf, - &skinnedMesh->meshBuffer.indices.mem); - } + vkDestroyBuffer(device, vertexStaging.buffer, nullptr); + vkFreeMemory(device, vertexStaging.memory, nullptr); + vkDestroyBuffer(device, indexStaging.buffer, nullptr); + vkFreeMemory(device, indexStaging.memory, nullptr); } void loadAssets()