Skip to content
Snippets Groups Projects
Commit 0eb38a39 authored by Christian Mattes's avatar Christian Mattes
Browse files

Made TiledDisplay validation-error free

parent 05ca1c91
No related branches found
No related tags found
No related merge requests found
...@@ -170,12 +170,19 @@ DisplayWindow::Frame::~Frame() { ...@@ -170,12 +170,19 @@ DisplayWindow::Frame::~Frame() {
info.pWaitSemaphores = &window->mRenderingComplete; info.pWaitSemaphores = &window->mRenderingComplete;
info.waitSemaphoreCount = 1; info.waitSemaphoreCount = 1;
try { auto result = vkQueuePresentKHR(window->mQueue->handle(), (VkPresentInfoKHR*)&info);
window->mQueue->handle().presentKHR(info); if (result == VK_ERROR_OUT_OF_DATE_KHR) {
} catch (vk::OutOfDateKHRError const &) { std::cout << "DisplayWindow: Rebuilding swapchain" << std::endl;
window->mDevice->handle().waitIdle(); window->mDevice->handle().waitIdle();
window->buildSwapchain(); window->buildSwapchain();
} }
//try {
// window->mQueue->handle().presentKHR(info);
//} catch (vk::OutOfDateKHRError const &) {
// window->mDevice->handle().waitIdle();
// window->buildSwapchain();
//}
} }
DisplayWindow::Frame::Frame(DisplayWindow *parent) : window(parent) {} DisplayWindow::Frame::Frame(DisplayWindow *parent) : window(parent) {}
......
...@@ -34,10 +34,13 @@ lava::display::TiledDisplay::TiledDisplay( ...@@ -34,10 +34,13 @@ lava::display::TiledDisplay::TiledDisplay(
.setMipLevels(1); .setMipLevels(1);
for (auto const &d : devices) { for (auto const &d : devices) {
auto make_img = [&]() {
auto img = ci.create(d); auto img = ci.create(d);
img->realizeRAM(); img->realizeRAM();
img->changeLayout(vk::ImageLayout::eGeneral); img->changeLayout(vk::ImageLayout::eGeneral);
mHostImages.push_back(img); return img;
};
mHostImages.push_back({{make_img(), make_img()}});
} }
} }
...@@ -49,27 +52,25 @@ void TiledDisplay::submit(const SharedImage &image) { ...@@ -49,27 +52,25 @@ void TiledDisplay::submit(const SharedImage &image) {
throw std::logic_error( throw std::logic_error(
"For now you should present to the original device, too"); "For now you should present to the original device, too");
{ // Step 1 - GPUs-Side: Work with mHostImages[gpu_side]
{ // Step 1.1 transfer master image to Host
auto cmd = mDevices[master_idx]->graphicsQueue().beginCommandBuffer(); auto cmd = mDevices[master_idx]->graphicsQueue().beginCommandBuffer();
mHostImages[master_idx]->copyFrom(image, cmd); mHostImages[master_idx][gpu_side]->copyFrom(image, cmd);
mHostImages[master_idx]->changeLayout( mHostImages[master_idx][gpu_side]->changeLayout(
vk::ImageLayout::eTransferDstOptimal, vk::ImageLayout::eGeneral, vk::ImageLayout::eTransferDstOptimal, vk::ImageLayout::eGeneral,
cmd); cmd);
} }
{ // Step 1.2 change (non-master) hostImages layout to transfer_src
for (size_t i = 0; i < mDevices.size(); i++) for (size_t i = 0; i < mDevices.size(); i++) {
mDevices[i]->graphicsQueue().catchUp(mConfig.max_lag);
auto master_map = mHostImages[master_idx]->memoryChunk()->map();
for (size_t i = 0; i < mHostImages.size(); i++) {
if (i == master_idx) if (i == master_idx)
continue; continue;
auto map = mHostImages[i]->memoryChunk()->map(); mHostImages[i][gpu_side]->changeLayout(
memcpy(map.data(), master_map.data(), vk::ImageLayout::eGeneral,
mHostImages[master_idx]->levelBytes(0)); vk::ImageLayout::eTransferSrcOptimal);
} }
}
// Step 1.3 blit and present host images
for (size_t i = 0; i < mConfig.tiles.size(); i++) { for (size_t i = 0; i < mConfig.tiles.size(); i++) {
auto const &tile = mConfig.tiles[i]; auto const &tile = mConfig.tiles[i];
auto const &window = mWindows[i]; auto const &window = mWindows[i];
...@@ -80,8 +81,9 @@ void TiledDisplay::submit(const SharedImage &image) { ...@@ -80,8 +81,9 @@ void TiledDisplay::submit(const SharedImage &image) {
cmd.wait(frame.imageReady()); cmd.wait(frame.imageReady());
cmd.signal(frame.renderingComplete()); cmd.signal(frame.renderingComplete());
auto src = auto src = (tile.device == master_idx)
(tile.device == master_idx) ? image : mHostImages[tile.device]; ? image
: mHostImages[tile.device][gpu_side];
auto sub = vk::ImageSubresourceLayers() auto sub = vk::ImageSubresourceLayers()
.setAspectMask(vk::ImageAspectFlagBits::eColor) .setAspectMask(vk::ImageAspectFlagBits::eColor)
...@@ -108,6 +110,34 @@ void TiledDisplay::submit(const SharedImage &image) { ...@@ -108,6 +110,34 @@ void TiledDisplay::submit(const SharedImage &image) {
vk::ImageLayout::ePresentSrcKHR, cmd); vk::ImageLayout::ePresentSrcKHR, cmd);
} }
} }
{ // Step 1.4 change (non-master) hostImages layout back to general
for (size_t i = 0; i < mDevices.size(); i++) {
if (i == master_idx)
continue;
mHostImages[i][gpu_side]->changeLayout(vk::ImageLayout::eGeneral);
}
}
for (size_t i = 0; i < mDevices.size(); i++)
if (int(i) != master_idx)
mDevices[i]->graphicsQueue().catchUp(1);
// Step 2: Exchange Data between hostImages
auto cpu_side = (gpu_side + 1) % 2;
{
auto master_map =
mHostImages[master_idx][cpu_side]->memoryChunk()->map();
for (size_t i = 0; i < mHostImages.size(); i++) {
if (i == master_idx)
continue;
auto map = mHostImages[i][cpu_side]->memoryChunk()->map();
memcpy(map.data(), master_map.data(),
mHostImages[master_idx][0]->levelBytes(0));
}
}
gpu_side = cpu_side;
} }
} // namespace display } // namespace display
......
...@@ -21,8 +21,6 @@ class TiledDisplay { ...@@ -21,8 +21,6 @@ class TiledDisplay {
int sourceHeight, sourceWidth; int sourceHeight, sourceWidth;
vk::Format sourceFormat; vk::Format sourceFormat;
std::vector<TileConfig> tiles; std::vector<TileConfig> tiles;
int max_lag = 3;
}; };
TiledDisplay(std::vector<SharedDevice> const& devices, Config const &config); TiledDisplay(std::vector<SharedDevice> const& devices, Config const &config);
...@@ -34,7 +32,8 @@ class TiledDisplay { ...@@ -34,7 +32,8 @@ class TiledDisplay {
std::vector<SharedDisplayWindow> mWindows; std::vector<SharedDisplayWindow> mWindows;
std::vector<SharedDevice> mDevices; std::vector<SharedDevice> mDevices;
std::vector<char> mBuffer; std::vector<char> mBuffer;
std::vector<SharedImage> mHostImages; std::vector<std::array<SharedImage,2>> mHostImages;
uint32_t gpu_side = 0;
}; };
} // namespace display } // namespace display
......
0% Loading or .
You are about to add 0 people to the discussion. Proceed with caution.
Please register or to comment