删除render target
This commit is contained in:
parent
8c2bc80e05
commit
2f80e79800
@ -36,6 +36,13 @@ public:
|
||||
format = in_format;
|
||||
on_init();
|
||||
}
|
||||
void resize(uint32_t width, uint32_t height) {
|
||||
if (width_ == width && height_ == height) {
|
||||
return;
|
||||
}
|
||||
destroy();
|
||||
init(width, height, format);
|
||||
}
|
||||
void draw() const {
|
||||
ImGui::Image(get_texture_id(), ImVec2(static_cast<float>(get_width()), static_cast<float>(get_height())));
|
||||
}
|
||||
|
@ -1,105 +0,0 @@
|
||||
#include "render_target.h"
|
||||
|
||||
#include "renderer.h"
|
||||
#include "application/application.h"
|
||||
#include "utils/utils.hpp"
|
||||
|
||||
void* render_target::lock(lock_state state) const {
|
||||
const auto r = application::get()->get_renderer();
|
||||
const auto& device = r->device;
|
||||
|
||||
vk::ImageSubresource subresource;
|
||||
subresource.setAspectMask(vk::ImageAspectFlagBits::eColor);
|
||||
subresource.setMipLevel(0);
|
||||
subresource.setArrayLayer(0);
|
||||
|
||||
const vk::SubresourceLayout subresource_layout = device.getImageSubresourceLayout(image, subresource);
|
||||
|
||||
void* data;
|
||||
const vk::Result result = device.mapMemory(memory, 0, VK_WHOLE_SIZE, vk::MemoryMapFlags(), &data);
|
||||
check_vk_result(result);
|
||||
|
||||
return static_cast<uint8_t*>(data) + subresource_layout.offset;
|
||||
}
|
||||
|
||||
void render_target::unlock() {
|
||||
const auto r = application::get()->get_renderer();
|
||||
const auto& device = r->device;
|
||||
|
||||
device.unmapMemory(memory);
|
||||
}
|
||||
|
||||
void render_target::destroy() {
|
||||
render_resource::destroy();
|
||||
const auto r = application::get()->get_renderer();
|
||||
const auto& device = r->device;
|
||||
device.destroyFramebuffer(framebuffer);
|
||||
}
|
||||
|
||||
void render_target::create(uint32_t width, uint32_t height) {
|
||||
auto r = application::get()->get_renderer();
|
||||
const auto& device = r->device;
|
||||
const auto& physical_device = r->physical_device;
|
||||
|
||||
vk::ImageCreateInfo image_create_info;
|
||||
image_create_info.setImageType(vk::ImageType::e2D);
|
||||
image_create_info.setFormat(format);
|
||||
image_create_info.setExtent({static_cast<uint32_t>(width), static_cast<uint32_t>(height), 1});
|
||||
image_create_info.setMipLevels(1);
|
||||
image_create_info.setArrayLayers(1);
|
||||
image_create_info.setSamples(vk::SampleCountFlagBits::e1);
|
||||
image_create_info.setTiling(vk::ImageTiling::eOptimal);
|
||||
image_create_info.setUsage(vk::ImageUsageFlagBits::eSampled | vk::ImageUsageFlagBits::eTransferDst | vk::ImageUsageFlagBits::eColorAttachment | vk::ImageUsageFlagBits::eStorage);
|
||||
image_create_info.setSharingMode(vk::SharingMode::eExclusive);
|
||||
image_create_info.setInitialLayout(vk::ImageLayout::eUndefined);
|
||||
image = device.createImage(image_create_info);
|
||||
|
||||
vk::PhysicalDeviceMemoryProperties memory_properties = physical_device.getMemoryProperties();
|
||||
vk::MemoryRequirements memory_requirements = device.getImageMemoryRequirements(image);
|
||||
const uint32_t memory_type = vk::su::findMemoryType(memory_properties, memory_requirements.memoryTypeBits, vk::MemoryPropertyFlagBits::eDeviceLocal);
|
||||
|
||||
vk::MemoryAllocateInfo memory_allocate_info;
|
||||
memory_allocate_info.setAllocationSize(memory_requirements.size);
|
||||
memory_allocate_info.setMemoryTypeIndex(memory_type);
|
||||
memory = device.allocateMemory(memory_allocate_info);
|
||||
device.bindImageMemory(image, memory, 0);
|
||||
|
||||
vk::ImageViewCreateInfo image_view_create_info;
|
||||
image_view_create_info.setImage(image);
|
||||
image_view_create_info.setViewType(vk::ImageViewType::e2D);
|
||||
image_view_create_info.setFormat(format);
|
||||
image_view_create_info.setSubresourceRange({vk::ImageAspectFlagBits::eColor, 0, 1, 0, 1});
|
||||
image_view = device.createImageView(image_view_create_info);
|
||||
|
||||
vk::FramebufferCreateInfo framebuffer_create_info;
|
||||
framebuffer_create_info.setRenderPass(r->main_window_data.RenderPass);
|
||||
framebuffer_create_info.setAttachmentCount(1);
|
||||
framebuffer_create_info.setAttachments(image_view);
|
||||
framebuffer_create_info.setWidth(width);
|
||||
framebuffer_create_info.setHeight(height);
|
||||
framebuffer_create_info.setLayers(1);
|
||||
framebuffer = device.createFramebuffer(framebuffer_create_info);
|
||||
|
||||
vk::SamplerCreateInfo sampler_info;
|
||||
sampler_info.setMagFilter(vk::Filter::eLinear);
|
||||
sampler_info.setMinFilter(vk::Filter::eLinear);
|
||||
sampler_info.setMipmapMode(vk::SamplerMipmapMode::eLinear);
|
||||
sampler_info.setAddressModeU(vk::SamplerAddressMode::eRepeat);
|
||||
sampler_info.setAddressModeV(vk::SamplerAddressMode::eRepeat);
|
||||
sampler_info.setAddressModeW(vk::SamplerAddressMode::eRepeat);
|
||||
sampler_info.setMinLod(-1000);
|
||||
sampler_info.setMaxLod(1000);
|
||||
sampler_info.setMaxAnisotropy(1);
|
||||
sampler = device.createSampler(sampler_info);
|
||||
|
||||
descriptor_set = ImGui_ImplVulkan_AddTexture(sampler, image_view, VK_IMAGE_LAYOUT_SHADER_READ_ONLY_OPTIMAL);
|
||||
}
|
||||
|
||||
void render_target::on_init() {
|
||||
create(width_, height_);
|
||||
}
|
||||
|
||||
void render_target::on_resize(uint32_t width, uint32_t height) {
|
||||
destroy();
|
||||
create(width, height);
|
||||
}
|
@ -1,38 +0,0 @@
|
||||
#pragma once
|
||||
#include <vulkan/vulkan.hpp>
|
||||
|
||||
#include "render_resource.h"
|
||||
|
||||
enum class lock_state {
|
||||
NONE,
|
||||
WRITE,
|
||||
READ,
|
||||
READ_WRITE
|
||||
};
|
||||
|
||||
class render_target : public render_resource {
|
||||
public:
|
||||
|
||||
void resize(const uint32_t width, const uint32_t height) {
|
||||
if (width_ == width && height_ == height)
|
||||
return;
|
||||
|
||||
width_ = width;
|
||||
height_ = height;
|
||||
on_resize(width, height);
|
||||
if (on_resize_callback)
|
||||
on_resize_callback(shared_from_this());
|
||||
}
|
||||
|
||||
void* lock(lock_state state) const;
|
||||
void unlock();
|
||||
|
||||
void destroy() override;
|
||||
|
||||
std::function<void(std::shared_ptr<render_resource>)> on_resize_callback;
|
||||
vk::Framebuffer framebuffer;
|
||||
protected:
|
||||
void create(uint32_t width, uint32_t height);
|
||||
void on_init() override;
|
||||
void on_resize(uint32_t width, uint32_t height);
|
||||
};
|
Loading…
x
Reference in New Issue
Block a user