-
Notifications
You must be signed in to change notification settings - Fork 0
Expand file tree
/
Copy pathmain.cpp
More file actions
126 lines (102 loc) · 5.39 KB
/
Copy pathmain.cpp
File metadata and controls
126 lines (102 loc) · 5.39 KB
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
123
124
125
126
#include <list>
#include <memory>
#include <vector>
#include <vulkan/vulkan.hpp>
#include <vulkan/vulkan_win32.h>
#include <opencv2/core.hpp>
#include <opencv2/highgui.hpp>
#include <opencv2/imgcodecs.hpp>
#include <opencv2/imgproc.hpp>
#include <Context.hpp>
#include <v2utils.h>
#include <GPUCommandAsync.hpp>
#include <GuidedFilterHelpers.hpp>
#include <IntegralImageHelpers.h>
#include <ShadersCollection.h>
#include <highlevelhelpers.h>
#include <WindowingSystem.hpp>
int main() {
cv::Mat img(cv::Size(500, 281), CV_32FC1, cv::Scalar(1.));
auto _img = cv::imread(R"(C:\Users\vljno\OneDrive\Images\20200822_153658.jpg)");
cv::cvtColor(_img, img, cv::COLOR_RGB2GRAY);
//_img.col(0).setTo(cv::Scalar(1.f));
// cv::Mat img;
// cv::integral(_img, img);
img.convertTo(img, CV_32FC1);
// for (int i = 0; i < 500; ++i) {
// for (int j = 0; j < 281; ++j) {
// float tmp = 0;
// if (i % 4 == 3)
// tmp += 1;
// if (j % 4 == 3)
// tmp += 1;
// img.at<float>(j, i) = 1024.f; // std::sqrt(img.at<float>(j, i));
// }
//}
glfwInit();
glfwWindowHint(GLFW_CLIENT_API, GLFW_NO_API);
glfwWindowHint(GLFW_RESIZABLE, GLFW_FALSE);
auto window = glfwCreateWindow(img.cols, img.rows, "ImageView", nullptr, nullptr);
uint32_t glfwExtensionCount = 0;
const char **glfwExtensions = glfwGetRequiredInstanceExtensions(&glfwExtensionCount);
std::vector<const char *> extensions(glfwExtensions, glfwExtensions + glfwExtensionCount);
std::vector<const char *> deviceextensions{VK_KHR_SWAPCHAIN_EXTENSION_NAME};
auto instance = createInstance(extensions);
auto callback = createDebugCallback(*instance);
{
auto surface = WindowingSystem::GetSurfaceFromGLFWWindows(*instance, window);
auto physDev = instance->enumeratePhysicalDevices();
Renderer renderer(physDev[0], deviceextensions);
auto swapChain = WindowingSystem::SwapChainSupport(renderer, *surface, img.cols, img.rows);
auto shaderList = v2::utils::ShaderList::Build(*renderer.dev);
size_t width = img.cols;
size_t height = img.rows;
IntegralImageHelper::VerticalSummer verticalSummer(renderer);
IntegralImageHelper::HorizontalSummer horizontalSummer(renderer);
GuidedFilter::IntegralImageHelper IIH(renderer);
gsl::span<std::byte> imgData((std::byte*)(img.ptr()), 4 * img.cols * img.rows);
auto [buf, buffermem] = Base::GetMemoryBufferFrom(*renderer.dev, renderer.memprop, imgData);
auto buffer = std::move(buf);
auto [texUndef, texStorage] = Base::CreateTexture<vk::Format::eR32Sfloat>(*renderer.dev, img.cols, img.rows, "input");
auto [texrgba8Undef, texrgba8Storage] =
Base::CreateTexture<vk::Format::eB8G8R8A8Unorm>(*renderer.dev, img.cols, img.rows, "rgba8output");
auto guidedFilterResources = GuidedFilter::IntegralImageHelper::BuildImageStorage(
*renderer.dev, *renderer.commandPool, renderer.memprop, renderer.queue, *renderer.descriptorSetPool, img);
auto newTexturesState =
Base::MakeGPUAsyncUnit(*renderer.dev, *renderer.descriptorSetPool, *renderer.commandPool,
std::make_tuple(std::move(texrgba8Undef), std::move(texUndef)))
.then([&](auto &cmdBuffer, auto &&textureState) {
auto [rgba8undef, texundef] = std::move(textureState);
auto rgba8 = Base::Transition<vk::ImageLayout::eGeneral>(*cmdBuffer, std::move(rgba8undef));
auto textureDest = Base::Transition<vk::ImageLayout::eTransferDstOptimal>(*cmdBuffer, std::move(texundef));
auto updatedTexture = Base::CopyToTexture(cmdBuffer, textureDest, *buffer);
auto readableTexture = Base::Transition<vk::ImageLayout::eGeneral>(*cmdBuffer, std::move(updatedTexture));
auto tex = Base::Transition<vk::ImageLayout::eGeneral>(*cmdBuffer, std::move(readableTexture));
return Base::MakeGPUAsync(*renderer.dev, *renderer.descriptorSetPool, *renderer.commandPool, renderer.queue,
std::move(cmdBuffer), std::make_tuple(std::move(rgba8), std::move(tex)));
})
.Sync();
auto texrgba8 = std::move(std::get<0>(newTexturesState));
auto tex = std::move(std::get<1>(newTexturesState));
while (!glfwWindowShouldClose(window)) {
glfwPollEvents();
Base::MakeGPUAsyncUnit(*renderer.dev, *renderer.descriptorSetPool, *renderer.commandPool, std::make_tuple())
.then(
[&](auto &&cmdbuffer, auto &&textureStates) {
IIH.draw(shaderList, guidedFilterResources, tex, cmdbuffer, width, height);
shaderList.r32fToRgba8Pipeline({size_t((width + 15) / 16), size_t((height + 15) / 16)}, cmdbuffer,
*renderer.descriptorSetPool, guidedFilterResources.result, texrgba8);
return Base::MakeGPUAsync(*renderer.dev, *renderer.descriptorSetPool, *renderer.commandPool, renderer.queue,
std::move(cmdbuffer), std::move(textureStates));
})
.Sync();
auto idx = swapChain.GetPresentImage();
WindowingSystem::CopyToPresentImage(*renderer.dev, *renderer.commandPool, renderer.queue, *renderer.descriptorSetPool, texrgba8,
swapChain.extent.width, swapChain.extent.height, swapChain.swapChainImages[idx]);
swapChain.Present(idx);
}
}
glfwDestroyWindow(window);
glfwTerminate();
return 0;
}