diff --git a/Crafter.Graphics-MeshShader.cppm b/Crafter.Graphics-MeshShader.cppm index 0d62eb0..3b8db2a 100644 --- a/Crafter.Graphics-MeshShader.cppm +++ b/Crafter.Graphics-MeshShader.cppm @@ -52,11 +52,11 @@ namespace Crafter { ) { transform = MatrixRowMajor::Identity(); } - void WriteDescriptors(VkDescriptorSet* set) { + void WriteDescriptors(VkDescriptorSet set) { VkWriteDescriptorSet write[3] = { - vks::initializers::writeDescriptorSet(set[0], VK_DESCRIPTOR_TYPE_UNIFORM_BUFFER, 0, &mvp.descriptor), - vks::initializers::writeDescriptorSet(set[0], VK_DESCRIPTOR_TYPE_STORAGE_BUFFER, 1, &mesh->verticies.descriptor), - vks::initializers::writeDescriptorSet(set[0], VK_DESCRIPTOR_TYPE_STORAGE_BUFFER, 2, &mesh->indicies.descriptor) + vks::initializers::writeDescriptorSet(set, VK_DESCRIPTOR_TYPE_UNIFORM_BUFFER, 0, &mvp.descriptor), + vks::initializers::writeDescriptorSet(set, VK_DESCRIPTOR_TYPE_STORAGE_BUFFER, 1, &mesh->verticies.descriptor), + vks::initializers::writeDescriptorSet(set, VK_DESCRIPTOR_TYPE_STORAGE_BUFFER, 2, &mesh->indicies.descriptor) }; vkUpdateDescriptorSets(VulkanDevice::device, 3, &write[0], 0, nullptr); } diff --git a/Crafter.Graphics-TextureShader.cppm b/Crafter.Graphics-TextureShader.cppm index 66436a9..1452851 100644 --- a/Crafter.Graphics-TextureShader.cppm +++ b/Crafter.Graphics-TextureShader.cppm @@ -63,8 +63,8 @@ namespace Crafter { imageInfo.imageView = texture->imageView; imageInfo.sampler = textureSampler; } - void WriteDescriptors(VkDescriptorSet* set) { - VkWriteDescriptorSet write = vks::initializers::writeDescriptorSet(set[1], VK_DESCRIPTOR_TYPE_COMBINED_IMAGE_SAMPLER, 0, &imageInfo); + void WriteDescriptors(VkDescriptorSet set) { + VkWriteDescriptorSet write = vks::initializers::writeDescriptorSet(set, VK_DESCRIPTOR_TYPE_COMBINED_IMAGE_SAMPLER, 0, &imageInfo); vkUpdateDescriptorSets(VulkanDevice::device, 1, &write, 0, nullptr); } }; diff --git a/Crafter.Graphics-VulkanTexture.cppm b/Crafter.Graphics-VulkanTexture.cppm index dde3f64..d422215 100644 --- a/Crafter.Graphics-VulkanTexture.cppm +++ b/Crafter.Graphics-VulkanTexture.cppm @@ -35,13 +35,13 @@ namespace Crafter { export template class VulkanTexture { public: + uint32_t width; + uint32_t height; VkImage image; VkDeviceMemory imageMemory; Buffer buffer; VkImageView imageView; - VulkanTexture(std::uint32_t width, std::uint32_t height, const PixelType* pixels, VkCommandBuffer cmd) : buffer(VK_BUFFER_USAGE_TRANSFER_SRC_BIT, VK_MEMORY_PROPERTY_HOST_VISIBLE_BIT | VK_MEMORY_PROPERTY_HOST_COHERENT_BIT, width*height) { - memcpy(buffer.value, pixels, width*height*sizeof(PixelType)); - + VulkanTexture(std::uint32_t width, std::uint32_t height, VkCommandBuffer cmd) : width(width), height(height), buffer(VK_BUFFER_USAGE_TRANSFER_SRC_BIT, VK_MEMORY_PROPERTY_HOST_VISIBLE_BIT | VK_MEMORY_PROPERTY_HOST_COHERENT_BIT, width*height) { VkImageCreateInfo imageInfo{}; imageInfo.sType = VK_STRUCTURE_TYPE_IMAGE_CREATE_INFO; imageInfo.imageType = VK_IMAGE_TYPE_2D; @@ -70,7 +70,29 @@ namespace Crafter { vkBindImageMemory(VulkanDevice::device, image, imageMemory, 0); - TransitionImageLayout(cmd, buffer, image, VK_IMAGE_LAYOUT_UNDEFINED, VK_IMAGE_LAYOUT_TRANSFER_DST_OPTIMAL); + VkImageViewCreateInfo viewInfo{}; + viewInfo.sType = VK_STRUCTURE_TYPE_IMAGE_VIEW_CREATE_INFO; + viewInfo.image = image; + viewInfo.viewType = VK_IMAGE_VIEW_TYPE_2D; + viewInfo.format = VK_FORMAT_R8G8B8A8_UNORM; + viewInfo.subresourceRange.aspectMask = VK_IMAGE_ASPECT_COLOR_BIT; + viewInfo.subresourceRange.baseMipLevel = 0; + viewInfo.subresourceRange.levelCount = 1; + viewInfo.subresourceRange.baseArrayLayer = 0; + viewInfo.subresourceRange.layerCount = 1; + + VulkanDevice::CHECK_VK_RESULT(vkCreateImageView(VulkanDevice::device, &viewInfo, nullptr, &imageView)); + + TransitionImageLayout(cmd, buffer, image, VK_IMAGE_LAYOUT_UNDEFINED, VK_IMAGE_LAYOUT_SHADER_READ_ONLY_OPTIMAL); + } + + VulkanTexture(const char* asset, VkCommandBuffer cmd) : VulkanTexture(reinterpret_cast(asset)[0], reinterpret_cast(asset)[1], cmd) { + Update(reinterpret_cast(reinterpret_cast(asset)+2), cmd); + } + + void Update(const PixelType* bufferdata, VkCommandBuffer cmd) { + memcpy(buffer.value, bufferdata, height*width*sizeof(PixelType)); + TransitionImageLayout(cmd, buffer, image, VK_IMAGE_LAYOUT_SHADER_READ_ONLY_OPTIMAL, VK_IMAGE_LAYOUT_TRANSFER_DST_OPTIMAL); VkBufferImageCopy region{}; region.bufferOffset = 0; @@ -92,23 +114,6 @@ namespace Crafter { ); TransitionImageLayout(cmd, buffer, image, VK_IMAGE_LAYOUT_TRANSFER_DST_OPTIMAL, VK_IMAGE_LAYOUT_SHADER_READ_ONLY_OPTIMAL); - - VkImageViewCreateInfo viewInfo{}; - viewInfo.sType = VK_STRUCTURE_TYPE_IMAGE_VIEW_CREATE_INFO; - viewInfo.image = image; - viewInfo.viewType = VK_IMAGE_VIEW_TYPE_2D; - viewInfo.format = VK_FORMAT_R8G8B8A8_UNORM; - viewInfo.subresourceRange.aspectMask = VK_IMAGE_ASPECT_COLOR_BIT; - viewInfo.subresourceRange.baseMipLevel = 0; - viewInfo.subresourceRange.levelCount = 1; - viewInfo.subresourceRange.baseArrayLayer = 0; - viewInfo.subresourceRange.layerCount = 1; - - VulkanDevice::CHECK_VK_RESULT(vkCreateImageView(VulkanDevice::device, &viewInfo, nullptr, &imageView)); - } - - VulkanTexture(const char* asset, VkCommandBuffer cmd) : VulkanTexture(reinterpret_cast(asset)[0], reinterpret_cast(asset)[1], reinterpret_cast(reinterpret_cast(asset)+2), cmd) { - } private: @@ -137,12 +142,24 @@ namespace Crafter { sourceStage = VK_PIPELINE_STAGE_TOP_OF_PIPE_BIT; destinationStage = VK_PIPELINE_STAGE_TRANSFER_BIT; + } else if (oldLayout == VK_IMAGE_LAYOUT_UNDEFINED && newLayout == VK_IMAGE_LAYOUT_SHADER_READ_ONLY_OPTIMAL) { + barrier.srcAccessMask = 0; + barrier.dstAccessMask = VK_ACCESS_SHADER_READ_BIT; + + sourceStage = VK_PIPELINE_STAGE_TOP_OF_PIPE_BIT; + destinationStage = VK_PIPELINE_STAGE_FRAGMENT_SHADER_BIT; } else if (oldLayout == VK_IMAGE_LAYOUT_TRANSFER_DST_OPTIMAL && newLayout == VK_IMAGE_LAYOUT_SHADER_READ_ONLY_OPTIMAL) { barrier.srcAccessMask = VK_ACCESS_TRANSFER_WRITE_BIT; barrier.dstAccessMask = VK_ACCESS_SHADER_READ_BIT; sourceStage = VK_PIPELINE_STAGE_TRANSFER_BIT; destinationStage = VK_PIPELINE_STAGE_FRAGMENT_SHADER_BIT; + } else if (oldLayout == VK_IMAGE_LAYOUT_SHADER_READ_ONLY_OPTIMAL && newLayout == VK_IMAGE_LAYOUT_TRANSFER_DST_OPTIMAL) { + barrier.srcAccessMask = VK_ACCESS_SHADER_READ_BIT; + barrier.dstAccessMask = VK_ACCESS_TRANSFER_WRITE_BIT; + + sourceStage = VK_PIPELINE_STAGE_FRAGMENT_SHADER_BIT; + destinationStage = VK_PIPELINE_STAGE_TRANSFER_BIT; } else { throw std::invalid_argument("unsupported layout transition!"); } diff --git a/main.cpp b/main.cpp index 5a8bd33..7ca4ecf 100644 --- a/main.cpp +++ b/main.cpp @@ -21,8 +21,10 @@ Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301 USA #include #include #include +#include #include #include "VulkanInitializers.hpp" + import Crafter.Graphics; import Crafter.Asset; import Crafter.Event; @@ -41,30 +43,30 @@ int main() { WindowWaylandVulkan window("Crafter.Graphics", 1280, 720); - Asset asset; - asset.LoadFull("cannon.cras"); + AssetLoad asset("cannon.cras"); Camera camera(1.57079633, 16 / 9, 0.01, 512); camera.Update(); VkCommandBuffer cmd = window.StartInit(); - Mesh mesh = Mesh(asset.entries[0].data.data()); + std::vector meshVector = asset.Load(0); + Mesh mesh(meshVector.data()); MeshShader meshShader(&mesh, &camera); - Asset asset2; - asset2.LoadFull("texture.cras"); - VulkanTexture txt = VulkanTexture(asset2.entries[0].data.data(), cmd); + AssetLoad asset2("texture.cras"); + std::vector texvector = asset2.Load(0); + VulkanTexture txt = VulkanTexture(texvector.data(), cmd); TextureShader texShader(&txt); DescriptorSet descriptors; EventListener bruhlistener(&descriptors.onDescriptorRefresh, [&meshShader, &texShader, &camera, &descriptors](){ - meshShader.WriteDescriptors(&descriptors.set[0]); - texShader.WriteDescriptors(&descriptors.set[0]); + meshShader.WriteDescriptors(descriptors.set[0]); + texShader.WriteDescriptors(descriptors.set[1]); }); - meshShader.WriteDescriptors(&descriptors.set[0]); - texShader.WriteDescriptors(&descriptors.set[0]); + meshShader.WriteDescriptors(descriptors.set[0]); + texShader.WriteDescriptors(descriptors.set[1]); MeshShader meshShader2(&mesh, &camera); TextureShader texShader2(&txt); DescriptorSet descriptors2; - meshShader2.WriteDescriptors(&descriptors2.set[0]); - texShader2.WriteDescriptors(&descriptors2.set[0]); + meshShader2.WriteDescriptors(descriptors2.set[0]); + texShader2.WriteDescriptors(descriptors2.set[1]); meshShader.Update(); meshShader2.Update();