53 lines
1.3 KiB
C++
53 lines
1.3 KiB
C++
#include "resources/render_target.hpp"
|
|
|
|
#include <algorithm>
|
|
|
|
namespace sophia {
|
|
|
|
RenderTarget::RenderTarget(Device& device, vk::Format format, u32 width,
|
|
u32 height)
|
|
: device{device}, format{format} {
|
|
create(std::max(width, 1u), std::max(height, 1u));
|
|
}
|
|
|
|
RenderTarget::~RenderTarget() { destroy(); }
|
|
|
|
vk::Extent2D RenderTarget::getExtent() const {
|
|
vk::Extent3D extent = this->image->getExtent();
|
|
return {extent.width, extent.height};
|
|
}
|
|
|
|
void RenderTarget::requestResize(u32 width, u32 height) {
|
|
this->pendingExtent = vk::Extent2D{std::max(width, 1u), std::max(height, 1u)};
|
|
}
|
|
|
|
void RenderTarget::applyPendingResize() {
|
|
if (!this->pendingExtent) {
|
|
return;
|
|
}
|
|
|
|
vk::Extent2D extent = *this->pendingExtent;
|
|
this->pendingExtent.reset();
|
|
if (extent == getExtent()) {
|
|
return;
|
|
}
|
|
|
|
this->device.waitIdle();
|
|
|
|
destroy();
|
|
create(extent.width, extent.height);
|
|
}
|
|
|
|
void RenderTarget::create(u32 width, u32 height) {
|
|
this->image = Image::Builder(this->device)
|
|
.setExtent(width, height)
|
|
.setFormat(this->format)
|
|
.asColorAttachment()
|
|
.withView()
|
|
.build();
|
|
}
|
|
|
|
void RenderTarget::destroy() { this->image.reset(); }
|
|
|
|
} // namespace sophia
|