aboutsummaryrefslogtreecommitdiffstats
path: root/api-test/main.cpp
diff options
context:
space:
mode:
Diffstat (limited to 'api-test/main.cpp')
-rw-r--r--api-test/main.cpp101
1 files changed, 76 insertions, 25 deletions
diff --git a/api-test/main.cpp b/api-test/main.cpp
index 40f5c72..4ac68ad 100644
--- a/api-test/main.cpp
+++ b/api-test/main.cpp
@@ -1,10 +1,14 @@
#include <cassert>
#include <cstdio>
+#include <span>
#include <vk_mem_alloc.h>
+#define STB_IMAGE_IMPLEMENTATION
+#include <stb_image.h>
+
#include "window.hpp"
#include "vk-device.hpp"
-// #include "resource-manager.hpp"
+#include "utils.hpp"
#define ENABLE_RENDERDOC
@@ -26,50 +30,97 @@ int main() {
}
#endif
- window wnd { 1280U, 720U };
+ window wnd { 640U, 360U };
#ifdef ENABLE_RENDERDOC
if(rdoc_api != nullptr) rdoc_api->StartFrameCapture(nullptr, nullptr);
#endif
- vkdevice device { wnd };
+ auto* device = vkdevice::init_device(wnd);
+
+ constexpr size_t image_size = 1024U;
+ constexpr size_t image_count = 4U;
+ auto staging_buffer_handle = device->create_buffer({
+ .size = image_size * image_size * sizeof(uint32_t) * image_count,
+ .usages = VK_BUFFER_USAGE_TRANSFER_SRC_BIT,
+ .memory_properties = VK_MEMORY_PROPERTY_HOST_VISIBLE_BIT,
+ .memory_usage = VMA_MEMORY_USAGE_CPU_TO_GPU,
+ });
+ const auto& staging_buffer = device->get_buffer(staging_buffer_handle);
+
+ int width;
+ int height;
+ int channels;
+ uint8_t* data = stbi_load("../models/sponza/466164707995436622.jpg", &width, &height, &channels, 4);
+ size_t size = static_cast<size_t>(width) * height * 4U;
+ memcpy(staging_buffer.mapped_ptr, data, size);
- auto gpu_texture_handle = device.create_texture({
- .width = 1024U,
- .height = 1024U,
- .usages = VK_IMAGE_USAGE_COLOR_ATTACHMENT_BIT,
+ auto gpu_texture_handle = device->create_texture({
+ .width = static_cast<uint32_t>(width),
+ .height = static_cast<uint32_t>(height),
+ .usages = VK_IMAGE_USAGE_TRANSFER_DST_BIT | VK_IMAGE_USAGE_STORAGE_BIT,
.format = VK_FORMAT_R8G8B8A8_UNORM,
- .type = VK_IMAGE_TYPE_2D,
+ .type = VK_IMAGE_TYPE_2D,
});
- auto gpu_buffer = device.get_buffer(device.create_buffer({
- .size = 1024U * sizeof(uint32_t),
- .usages = VK_BUFFER_USAGE_STORAGE_BUFFER_BIT,
- .memory_properties = VK_MEMORY_PROPERTY_DEVICE_LOCAL_BIT,
- .memory_usage = VMA_MEMORY_USAGE_GPU_ONLY,
- }));
+ off_t offset = width * height * 4;
+ data = stbi_load("../models/sponza/715093869573992647.jpg", &width, &height, &channels, 4);
+ size = static_cast<size_t>(width) * height * 4U;
+ auto* addr = static_cast<void*>(static_cast<uint8_t*>(staging_buffer.mapped_ptr) + offset);
+ memcpy(addr, data, size);
- auto staging_buffer_handle = device.create_buffer({
- .size = 1024U * sizeof(uint32_t),
- .usages = VK_BUFFER_USAGE_TRANSFER_SRC_BIT,
- .memory_properties = VK_MEMORY_PROPERTY_HOST_VISIBLE_BIT,
- .memory_usage = VMA_MEMORY_USAGE_CPU_TO_GPU,
+ auto second_texture = device->create_texture({
+ .width = static_cast<uint32_t>(width),
+ .height = static_cast<uint32_t>(height),
+ .usages = VK_IMAGE_USAGE_TRANSFER_DST_BIT | VK_IMAGE_USAGE_STORAGE_BIT,
+ .format = VK_FORMAT_R8G8B8A8_UNORM,
+ .type = VK_IMAGE_TYPE_2D,
+ });
+
+ auto output_texture_handle = device->create_texture({
+ .width = static_cast<uint32_t>(width),
+ .height = static_cast<uint32_t>(height),
+ .usages = VK_IMAGE_USAGE_STORAGE_BIT,
+ .format = VK_FORMAT_R8G8B8A8_UNORM,
+ .type = VK_IMAGE_TYPE_2D,
+ });
+
+ // auto gpu_buffer = vkdevice::get_buffer(device.create_buffer({
+ // .size = 1024U * sizeof(uint32_t),
+ // .usages = VK_BUFFER_USAGE_STORAGE_BUFFER_BIT,
+ // .memory_properties = VK_MEMORY_PROPERTY_DEVICE_LOCAL_BIT,
+ // .memory_usage = VMA_MEMORY_USAGE_GPU_ONLY,
+ // }));
+
+ auto code = read_file("shaders/test.comp.spv");
+ auto compute = device->create_pipeline({
+ .cs_code = std::span(code),
});
- auto staging_buffer = device.get_buffer(staging_buffer_handle);
- uint64_t t = 7;
- (*(uint64_t*)staging_buffer.mapped_ptr) = t;
- transfer_command_buffer command_buffer;
- device.allocate_command_buffers(&command_buffer, 1, QueueType::GRAPHICS);
+ graphics_command_buffer command_buffer;
+ device->allocate_command_buffers(&command_buffer, 1, QueueType::GRAPHICS);
command_buffer.start();
+ command_buffer.barrier(gpu_texture_handle, VK_PIPELINE_STAGE_2_TRANSFER_BIT, VK_ACCESS_2_TRANSFER_WRITE_BIT, VK_IMAGE_LAYOUT_TRANSFER_DST_OPTIMAL);
+ command_buffer.barrier(second_texture, VK_PIPELINE_STAGE_2_TRANSFER_BIT, VK_ACCESS_2_TRANSFER_WRITE_BIT, VK_IMAGE_LAYOUT_TRANSFER_DST_OPTIMAL);
command_buffer.copy(staging_buffer_handle, gpu_texture_handle);
+ command_buffer.copy(staging_buffer_handle, second_texture, static_cast<VkDeviceSize>(offset));
+
+ command_buffer.barrier(gpu_texture_handle, VK_PIPELINE_STAGE_2_COMPUTE_SHADER_BIT, VK_ACCESS_2_SHADER_WRITE_BIT, VK_IMAGE_LAYOUT_GENERAL);
+ command_buffer.barrier(second_texture, VK_PIPELINE_STAGE_2_COMPUTE_SHADER_BIT, VK_ACCESS_2_SHADER_READ_BIT, VK_IMAGE_LAYOUT_READ_ONLY_OPTIMAL);
+ command_buffer.barrier(output_texture_handle, VK_PIPELINE_STAGE_2_COMPUTE_SHADER_BIT, VK_ACCESS_2_SHADER_WRITE_BIT, VK_IMAGE_LAYOUT_GENERAL);
+
+ command_buffer.dispatch({
+ .pipeline = compute,
+ .group_size = { image_size, image_size, 1U },
+ .local_group_size = { 8U, 8U, 1U },
+ });
command_buffer.stop();
- device.submit(&command_buffer, 1);
+ device->submit(&command_buffer, 1);
#ifdef ENABLE_RENDERDOC
if(rdoc_api != nullptr) rdoc_api->EndFrameCapture(nullptr, nullptr);