mirror of
https://github.com/PancakeTAS/lsfg-vk.git
synced 2025-10-30 07:01:10 +00:00
refactor: vkd struct & buffer pool
This commit is contained in:
parent
83ec052f73
commit
24f7b66e99
9 changed files with 266 additions and 78 deletions
|
|
@ -1,17 +1,8 @@
|
||||||
cmake_minimum_required(VERSION 3.10)
|
cmake_minimum_required(VERSION 3.10)
|
||||||
|
|
||||||
if(NOT LSFGVK_EXCESS_DEBUG)
|
|
||||||
set(CMAKE_C_VISIBILITY_PRESET "hidden")
|
|
||||||
set(CMAKE_CXX_VISIBILITY_PRESET "hidden")
|
|
||||||
endif()
|
|
||||||
|
|
||||||
if(LSFGVK_EXCESS_DEBUG)
|
|
||||||
add_compile_definitions(LSFGVK_EXCESS_DEBUG)
|
|
||||||
endif()
|
|
||||||
|
|
||||||
project(lsfg-vk-framegen
|
project(lsfg-vk-framegen
|
||||||
DESCRIPTION "Lossless Scaling Frame Generation Backend"
|
DESCRIPTION "Lossless Scaling Frame Generation Backend"
|
||||||
LANGUAGES C CXX)
|
LANGUAGES C CXX) # FIXME: get rid of c language
|
||||||
|
|
||||||
file(GLOB SOURCES
|
file(GLOB SOURCES
|
||||||
"src/trans/*.cpp"
|
"src/trans/*.cpp"
|
||||||
|
|
@ -26,38 +17,37 @@ file(GLOB SOURCES
|
||||||
|
|
||||||
add_library(lsfg-vk-framegen STATIC ${SOURCES})
|
add_library(lsfg-vk-framegen STATIC ${SOURCES})
|
||||||
|
|
||||||
# target
|
|
||||||
set_target_properties(lsfg-vk-framegen PROPERTIES
|
set_target_properties(lsfg-vk-framegen PROPERTIES
|
||||||
CXX_STANDARD 20
|
CXX_STANDARD 20
|
||||||
CXX_STANDARD_REQUIRED ON)
|
CXX_STANDARD_REQUIRED ON
|
||||||
|
CXX_VISIBILITY_PRESET "hidden"
|
||||||
|
EXPORT_COMPILE_COMMANDS ON)
|
||||||
target_include_directories(lsfg-vk-framegen SYSTEM
|
target_include_directories(lsfg-vk-framegen SYSTEM
|
||||||
PUBLIC include/thirdparty)
|
PUBLIC include/thirdparty)
|
||||||
target_include_directories(lsfg-vk-framegen
|
target_include_directories(lsfg-vk-framegen
|
||||||
PUBLIC include)
|
PUBLIC include)
|
||||||
|
|
||||||
# diagnostics
|
|
||||||
if(CMAKE_BUILD_TYPE STREQUAL "Debug")
|
if(CMAKE_BUILD_TYPE STREQUAL "Debug")
|
||||||
set_target_properties(lsfg-vk-framegen PROPERTIES
|
if(NOT CMAKE_CXX_COMPILER_ID STREQUAL "Clang")
|
||||||
EXPORT_COMPILE_COMMANDS ON)
|
message(WARNING "Debug builds should use Clang for better diagnostics")
|
||||||
endif()
|
else()
|
||||||
|
message(STATUS "Building with further diagnostics")
|
||||||
|
|
||||||
if(LSFGVK_EXCESS_DEBUG)
|
set_target_properties(lsfg-vk-framegen PROPERTIES
|
||||||
target_compile_options(lsfg-vk-framegen PRIVATE
|
CXX_CLANG_TIDY clang-tidy)
|
||||||
-Weverything
|
|
||||||
# disable compat c++ flags
|
|
||||||
-Wno-pre-c++20-compat-pedantic
|
|
||||||
-Wno-pre-c++17-compat
|
|
||||||
-Wno-c++98-compat-pedantic
|
|
||||||
-Wno-c++98-compat
|
|
||||||
# disable other flags
|
|
||||||
-Wno-missing-designated-field-initializers
|
|
||||||
-Wno-shadow # allow shadowing
|
|
||||||
-Wno-switch-enum # ignore missing cases
|
|
||||||
-Wno-switch-default # ignore missing default
|
|
||||||
-Wno-padded # ignore automatic padding
|
|
||||||
-Wno-cast-function-type-strict # for vulkan
|
|
||||||
)
|
|
||||||
|
|
||||||
set_target_properties(lsfg-vk-framegen PROPERTIES
|
target_compile_options(lsfg-vk-framegen PRIVATE
|
||||||
CXX_CLANG_TIDY clang-tidy)
|
-Weverything
|
||||||
|
# disable incompatible warnings
|
||||||
|
-Wno-pre-c++20-compat-pedantic
|
||||||
|
-Wno-c++98-compat
|
||||||
|
-Wno-switch-default
|
||||||
|
-Wno-switch-enum
|
||||||
|
# disable noisy warnings
|
||||||
|
-Wno-missing-designated-field-initializers
|
||||||
|
-Wno-cast-function-type-strict
|
||||||
|
-Wno-padded
|
||||||
|
-Wno-shadow
|
||||||
|
)
|
||||||
|
endif()
|
||||||
endif()
|
endif()
|
||||||
|
|
|
||||||
|
|
@ -7,10 +7,24 @@
|
||||||
#include "vk/registry/shader_registry.hpp"
|
#include "vk/registry/shader_registry.hpp"
|
||||||
|
|
||||||
#include <filesystem>
|
#include <filesystem>
|
||||||
|
#include <memory>
|
||||||
|
|
||||||
namespace LSFG {
|
namespace LSFG {
|
||||||
|
|
||||||
// FIXME: device picking
|
// FIXME: device picking, fp16 logic, etc.
|
||||||
|
|
||||||
|
/// Vulkan (and related) data structure.
|
||||||
|
struct VKD {
|
||||||
|
VK::Core::Instance instance;
|
||||||
|
VK::Core::Device device;
|
||||||
|
VK::Core::DescriptorPool dpool;
|
||||||
|
|
||||||
|
VK::Registry::ShaderRegistry registry;
|
||||||
|
|
||||||
|
VK::Pool::ShaderPool spool;
|
||||||
|
|
||||||
|
float flow{1.0F};
|
||||||
|
};
|
||||||
|
|
||||||
///
|
///
|
||||||
/// Lossless Scaling Frame Generation instance.
|
/// Lossless Scaling Frame Generation instance.
|
||||||
|
|
@ -25,15 +39,8 @@ namespace LSFG {
|
||||||
/// @throws LSFG::error if lsfg creation fails.
|
/// @throws LSFG::error if lsfg creation fails.
|
||||||
///
|
///
|
||||||
Instance(const std::filesystem::path& dll);
|
Instance(const std::filesystem::path& dll);
|
||||||
|
|
||||||
private:
|
private:
|
||||||
VK::Core::Instance vk;
|
std::unique_ptr<VKD> vkd;
|
||||||
VK::Core::Device vkd;
|
|
||||||
|
|
||||||
VK::Core::DescriptorPool pool;
|
|
||||||
|
|
||||||
VK::Registry::ShaderRegistry registry;
|
|
||||||
VK::Pool::ShaderPool shaders;
|
|
||||||
};
|
};
|
||||||
|
|
||||||
}
|
}
|
||||||
|
|
|
||||||
22
framegen/include/v31n/shaderchain/mipmaps.hpp
Normal file
22
framegen/include/v31n/shaderchain/mipmaps.hpp
Normal file
|
|
@ -0,0 +1,22 @@
|
||||||
|
#pragma once
|
||||||
|
|
||||||
|
#include "vk/types/images.hpp"
|
||||||
|
#include "vk/types/shader.hpp"
|
||||||
|
|
||||||
|
#include <memory>
|
||||||
|
|
||||||
|
namespace LSFG { struct VKD; }
|
||||||
|
namespace LSFG::V31N::Shaderchain {
|
||||||
|
|
||||||
|
class Mipmaps {
|
||||||
|
public:
|
||||||
|
Mipmaps(VKD& vkd,
|
||||||
|
const VK::Core::Image& in1,
|
||||||
|
const VK::Core::Image& in2);
|
||||||
|
private:
|
||||||
|
std::unique_ptr<VK::Types::Shader> shader;
|
||||||
|
|
||||||
|
VK::Types::Images<7> mipmaps;
|
||||||
|
};
|
||||||
|
|
||||||
|
}
|
||||||
39
framegen/include/vk/pool/buffer_pool.hpp
Normal file
39
framegen/include/vk/pool/buffer_pool.hpp
Normal file
|
|
@ -0,0 +1,39 @@
|
||||||
|
#pragma once
|
||||||
|
|
||||||
|
#include "vk/core/buffer.hpp"
|
||||||
|
|
||||||
|
#include <unordered_map>
|
||||||
|
#include <cstdint>
|
||||||
|
|
||||||
|
namespace VK::Pool {
|
||||||
|
|
||||||
|
///
|
||||||
|
/// Pool of initialized buffers.
|
||||||
|
///
|
||||||
|
class BufferPool {
|
||||||
|
public:
|
||||||
|
///
|
||||||
|
/// Create a buffer pool.
|
||||||
|
///
|
||||||
|
BufferPool() noexcept = default;
|
||||||
|
|
||||||
|
///
|
||||||
|
/// Get or create a buffer.
|
||||||
|
///
|
||||||
|
/// @param flow Flow scale
|
||||||
|
/// @param hdr Whether HDR is enabled
|
||||||
|
/// @param timestamp Timestamp of the frame
|
||||||
|
/// @param firstIter Whether this is the first iteration
|
||||||
|
/// @param firstIterS Whether this is the first iteration for the second pass
|
||||||
|
/// @return Preallocated buffer
|
||||||
|
///
|
||||||
|
/// @throws VK::vulkan_error if buffer creation fails.
|
||||||
|
///
|
||||||
|
[[nodiscard]] const Core::Buffer& getOrCreate(
|
||||||
|
const Core::Device& device, float flow, bool hdr,
|
||||||
|
float timestamp, bool firstIter, bool firstIterS);
|
||||||
|
private:
|
||||||
|
std::unordered_map<uint64_t, Core::Buffer> buffers;
|
||||||
|
};
|
||||||
|
|
||||||
|
}
|
||||||
|
|
@ -23,15 +23,28 @@ namespace VK::Types {
|
||||||
/// Create a new shader instance.
|
/// Create a new shader instance.
|
||||||
///
|
///
|
||||||
Shader(Pool::ShaderInstance shader,
|
Shader(Pool::ShaderInstance shader,
|
||||||
std::vector<Core::DescriptorSet> sets)
|
std::vector<Core::DescriptorSet> sets,
|
||||||
: shader(std::move(shader)),
|
std::vector<Core::Sampler> samplers,
|
||||||
sets(std::move(sets)) {}
|
std::optional<Core::Buffer> buffer,
|
||||||
|
std::vector<std::vector<std::optional<Core::Image>>> inputs,
|
||||||
|
std::vector<std::vector<Core::Image>> outputs)
|
||||||
|
: shader(std::move(shader)), sets(std::move(sets)),
|
||||||
|
samplers(std::move(samplers)),
|
||||||
|
buffer(std::move(buffer)),
|
||||||
|
inputs(std::move(inputs)),
|
||||||
|
outputs(std::move(outputs)) {}
|
||||||
|
|
||||||
|
|
||||||
/// TODO: remaining methods
|
/// TODO: remaining methods
|
||||||
|
|
||||||
private:
|
private:
|
||||||
Pool::ShaderInstance shader;
|
Pool::ShaderInstance shader;
|
||||||
std::vector<Core::DescriptorSet> sets;
|
std::vector<Core::DescriptorSet> sets;
|
||||||
|
|
||||||
|
std::vector<Core::Sampler> samplers;
|
||||||
|
std::optional<Core::Buffer> buffer;
|
||||||
|
std::vector<std::vector<std::optional<Core::Image>>> inputs;
|
||||||
|
std::vector<std::vector<Core::Image>> outputs;
|
||||||
};
|
};
|
||||||
|
|
||||||
///
|
///
|
||||||
|
|
|
||||||
|
|
@ -1,43 +1,52 @@
|
||||||
#include "lsfg.hpp"
|
#include "lsfg.hpp"
|
||||||
|
#include "vk/registry/shader_registry.hpp"
|
||||||
|
#include "vk/pool/shader_pool.hpp"
|
||||||
|
#include "vk/core/descriptorpool.hpp"
|
||||||
|
#include "vk/core/instance.hpp"
|
||||||
|
#include "vk/core/device.hpp"
|
||||||
#include "trans/rsrc.hpp"
|
#include "trans/rsrc.hpp"
|
||||||
#include "vk/core/buffer.hpp"
|
|
||||||
#include "vk/core/image.hpp"
|
|
||||||
#include "vk/core/sampler.hpp"
|
|
||||||
#include "vk/types/shader.hpp"
|
|
||||||
|
|
||||||
#include <vulkan/vulkan_core.h>
|
|
||||||
|
|
||||||
#include <filesystem>
|
#include <filesystem>
|
||||||
#include <vector>
|
#include <utility>
|
||||||
|
#include <memory>
|
||||||
|
|
||||||
using namespace LSFG;
|
using namespace LSFG;
|
||||||
|
using namespace VK;
|
||||||
|
|
||||||
|
Instance::Instance(const std::filesystem::path& dll) {
|
||||||
|
VKD vkd{
|
||||||
|
.instance = Core::Instance(),
|
||||||
|
.device = Core::Device(vkd.instance, 0, false),
|
||||||
|
.dpool = Core::DescriptorPool(vkd.device),
|
||||||
|
.registry = Registry::ShaderRegistry(),
|
||||||
|
.spool = Pool::ShaderPool()
|
||||||
|
};
|
||||||
|
this->vkd = std::make_unique<VKD>(std::move(vkd));
|
||||||
|
|
||||||
Instance::Instance(const std::filesystem::path& dll)
|
|
||||||
: vkd(vk, 0, false), pool(vkd) {
|
|
||||||
// load shaders from dll file
|
// load shaders from dll file
|
||||||
const bool fp16 = vkd.supportsFP16();
|
const bool fp16 = this->vkd->device.supportsFP16();
|
||||||
Trans::RSRC::loadResources(dll, this->registry, fp16);
|
Trans::RSRC::loadResources(dll, this->vkd->registry, fp16);
|
||||||
|
|
||||||
// ...
|
// ...
|
||||||
|
|
||||||
const auto sampler1 =
|
// const auto sampler1 =
|
||||||
VK::Core::Sampler(vkd, VK_SAMPLER_ADDRESS_MODE_REPEAT, VK_COMPARE_OP_GREATER_OR_EQUAL, false);
|
// VK::Core::Sampler(vkd, VK_SAMPLER_ADDRESS_MODE_REPEAT, VK_COMPARE_OP_GREATER_OR_EQUAL, false);
|
||||||
const auto sampler2 =
|
// const auto sampler2 =
|
||||||
VK::Core::Sampler(vkd, VK_SAMPLER_ADDRESS_MODE_CLAMP_TO_BORDER, VK_COMPARE_OP_ALWAYS, true);
|
// VK::Core::Sampler(vkd, VK_SAMPLER_ADDRESS_MODE_CLAMP_TO_BORDER, VK_COMPARE_OP_ALWAYS, true);
|
||||||
const auto buffer0 =
|
// const auto buffer0 =
|
||||||
VK::Core::Buffer(vkd, 256, VK_BUFFER_USAGE_STORAGE_BUFFER_BIT);
|
// VK::Core::Buffer(vkd, 256, VK_BUFFER_USAGE_STORAGE_BUFFER_BIT);
|
||||||
const auto input0 =
|
// const auto input0 =
|
||||||
VK::Core::Image(vkd, { 1920, 1080 });
|
// VK::Core::Image(vkd, { 1920, 1080 });
|
||||||
const auto input1 =
|
// const auto input1 =
|
||||||
VK::Core::Image(vkd, { 1920, 1080 });
|
// VK::Core::Image(vkd, { 1920, 1080 });
|
||||||
const std::vector<VK::Core::Image> mipmaps{
|
// const std::vector<VK::Core::Image> mipmaps{
|
||||||
input0, input0
|
// input0, input0
|
||||||
};
|
// };
|
||||||
|
|
||||||
auto shader = VK::Types::ShaderBuilder(vkd, registry, this->shaders, "alpha[0]")
|
// auto shader = VK::Types::ShaderBuilder(vkd, registry, this->shaders, "alpha[0]")
|
||||||
.withSamplers(sampler1, sampler2)
|
// .withSamplers(sampler1, sampler2)
|
||||||
.withBuffer(buffer0)
|
// .withBuffer(buffer0)
|
||||||
.addTemporalInput({ input0, input1 })
|
// .addTemporalInput({ input0, input1 })
|
||||||
.addOutputs(mipmaps)
|
// .addOutputs(mipmaps)
|
||||||
.build(vkd, this->pool);
|
// .build(vkd, this->pool);
|
||||||
}
|
}
|
||||||
|
|
|
||||||
48
framegen/src/v31n/shaderchain/mipmaps.cpp
Normal file
48
framegen/src/v31n/shaderchain/mipmaps.cpp
Normal file
|
|
@ -0,0 +1,48 @@
|
||||||
|
#include "v31n/shaderchain/mipmaps.hpp"
|
||||||
|
#include "vk/types/shader.hpp"
|
||||||
|
#include "vk/core/sampler.hpp"
|
||||||
|
#include "vk/core/buffer.hpp"
|
||||||
|
#include "vk/core/image.hpp"
|
||||||
|
#include "lsfg.hpp"
|
||||||
|
|
||||||
|
#include <vulkan/vulkan_core.h>
|
||||||
|
|
||||||
|
#include <vector>
|
||||||
|
|
||||||
|
using namespace LSFG::V31N::Shaderchain;
|
||||||
|
using namespace VK;
|
||||||
|
|
||||||
|
Mipmaps::Mipmaps(LSFG::VKD& vkd, const Core::Image& in1, const Core::Image& in2) {
|
||||||
|
// TODO: logic for buffer and sampler
|
||||||
|
Core::Sampler sampler{vkd.device,
|
||||||
|
VK_SAMPLER_ADDRESS_MODE_CLAMP_TO_BORDER,
|
||||||
|
VK_COMPARE_OP_NEVER,
|
||||||
|
false};
|
||||||
|
Core::Buffer buffer{vkd.device, nullptr, 0, VK_BUFFER_USAGE_UNIFORM_BUFFER_BIT};
|
||||||
|
|
||||||
|
// create output images
|
||||||
|
const VkExtent2D extent{
|
||||||
|
.width = static_cast<uint32_t>(
|
||||||
|
static_cast<float>(in1.getExtent().width) / vkd.flow),
|
||||||
|
.height = static_cast<uint32_t>(
|
||||||
|
static_cast<float>(in1.getExtent().height) / vkd.flow)
|
||||||
|
};
|
||||||
|
|
||||||
|
std::vector<Core::Image> mipmapVector{};
|
||||||
|
mipmapVector.reserve(7);
|
||||||
|
for (size_t i = 0; i < 7; i++)
|
||||||
|
mipmapVector.emplace_back(vkd.device,
|
||||||
|
VkExtent2D { extent.width >> i, extent.height >> i },
|
||||||
|
VK_FORMAT_R8_UNORM);
|
||||||
|
this->mipmaps = VK::Types::Images<7>(mipmapVector);
|
||||||
|
|
||||||
|
// create shaders
|
||||||
|
auto shader = Types::ShaderBuilder(
|
||||||
|
vkd.device, vkd.registry, vkd.spool, "mipmaps", 2)
|
||||||
|
.withSamplers(sampler)
|
||||||
|
.withBuffer(buffer)
|
||||||
|
.addTemporalInput({ in1, in2 })
|
||||||
|
.addOutputs(this->mipmaps.all())
|
||||||
|
.build(vkd.device, vkd.dpool);
|
||||||
|
this->shader = std::make_unique<Types::Shader>(std::move(shader));
|
||||||
|
}
|
||||||
54
framegen/src/vk/pool/buffer_pool.cpp
Normal file
54
framegen/src/vk/pool/buffer_pool.cpp
Normal file
|
|
@ -0,0 +1,54 @@
|
||||||
|
#include "vk/pool/buffer_pool.hpp"
|
||||||
|
#include "vk/core/buffer.hpp"
|
||||||
|
#include "vk/core/device.hpp"
|
||||||
|
|
||||||
|
#include <vulkan/vulkan_core.h>
|
||||||
|
|
||||||
|
#include <cstdint>
|
||||||
|
#include <utility>
|
||||||
|
#include <array>
|
||||||
|
|
||||||
|
using namespace VK::Pool;
|
||||||
|
|
||||||
|
struct ConstantBuffer {
|
||||||
|
std::array<uint32_t, 2> inputOffset;
|
||||||
|
uint32_t firstIter;
|
||||||
|
uint32_t firstIterS;
|
||||||
|
uint32_t advancedColorKind;
|
||||||
|
uint32_t hdrSupport;
|
||||||
|
float resolutionInvScale;
|
||||||
|
float timestamp;
|
||||||
|
float uiThreshold;
|
||||||
|
std::array<uint32_t, 3> pad;
|
||||||
|
};
|
||||||
|
|
||||||
|
const VK::Core::Buffer& BufferPool::getOrCreate(
|
||||||
|
const Core::Device& device, float flow, bool hdr,
|
||||||
|
float timestamp, bool firstIter, bool firstIterS) {
|
||||||
|
uint64_t hash = 0;
|
||||||
|
const union { float f; uint32_t i; } u{
|
||||||
|
.f = timestamp };
|
||||||
|
hash |= u.i; // NOLINT
|
||||||
|
hash |= static_cast<uint64_t>(firstIter) << 32;
|
||||||
|
hash |= static_cast<uint64_t>(firstIterS) << 33;
|
||||||
|
|
||||||
|
const auto it = buffers.find(hash);
|
||||||
|
if (it != buffers.end()) {
|
||||||
|
return it->second;
|
||||||
|
}
|
||||||
|
|
||||||
|
// create buffer
|
||||||
|
const ConstantBuffer data{
|
||||||
|
.inputOffset = { 0, 0 },
|
||||||
|
.advancedColorKind = hdr ? 2U : 0U,
|
||||||
|
.hdrSupport = hdr,
|
||||||
|
.resolutionInvScale = flow,
|
||||||
|
.timestamp = timestamp,
|
||||||
|
.uiThreshold = 0.5F,
|
||||||
|
};
|
||||||
|
|
||||||
|
Core::Buffer buffer(device, data, VK_BUFFER_USAGE_UNIFORM_BUFFER_BIT);
|
||||||
|
|
||||||
|
const auto i = buffers.emplace(hash, std::move(buffer));
|
||||||
|
return i.first->second;
|
||||||
|
}
|
||||||
|
|
@ -1,4 +1,4 @@
|
||||||
#include "vk/types/shader.hpp"
|
#include "vk/types/shader.hpp"
|
||||||
#include "vk/core/descriptorpool.hpp"
|
#include "vk/core/descriptorpool.hpp"
|
||||||
#include "vk/core/descriptorset.hpp"
|
#include "vk/core/descriptorset.hpp"
|
||||||
#include "vk/core/sampler.hpp"
|
#include "vk/core/sampler.hpp"
|
||||||
|
|
@ -86,5 +86,11 @@ Shader ShaderBuilder::build(const Core::Device& vkd,
|
||||||
std::move(this->inputs.at(i)),
|
std::move(this->inputs.at(i)),
|
||||||
std::move(this->outputs.at(i)),
|
std::move(this->outputs.at(i)),
|
||||||
this->samplers, this->buffer);
|
this->samplers, this->buffer);
|
||||||
return { this->shader, std::move(sets) };
|
return {
|
||||||
|
this->shader, std::move(sets),
|
||||||
|
std::move(this->samplers),
|
||||||
|
std::move(this->buffer),
|
||||||
|
std::move(this->inputs),
|
||||||
|
std::move(this->outputs)
|
||||||
|
};
|
||||||
}
|
}
|
||||||
|
|
|
||||||
Loading…
Add table
Reference in a new issue