Commit for 2023.01.06 12-19-28.7z
This commit is contained in:
parent
28cf6a7d8f
commit
f3800abb21
@ -1,7 +1,7 @@
|
||||
{
|
||||
"engine": {
|
||||
"scenes": {
|
||||
"start": "SourceEngine",
|
||||
"start": "StartMenu",
|
||||
"matrix": { "reverseInfinite": true },
|
||||
"meshes": { "interleaved": false },
|
||||
"lights": { "enabled": true,
|
||||
@ -54,7 +54,7 @@
|
||||
"samples": 1,
|
||||
"paths": 2,
|
||||
"frameAccumulationMinimum": 0,
|
||||
"readyTimer": 2
|
||||
"readyTimer": 3
|
||||
}
|
||||
},
|
||||
"graph": {
|
||||
@ -64,7 +64,7 @@
|
||||
"vulkan": {
|
||||
"version": 1.3,
|
||||
"validation": {
|
||||
"enabled": true,
|
||||
"enabled": false,
|
||||
"messages": false,
|
||||
"checkpoints": false,
|
||||
"filters": [
|
||||
@ -102,7 +102,7 @@
|
||||
"invariant": {
|
||||
"default stage buffers": true,
|
||||
"default defer buffer destroy": true,
|
||||
"default command buffer immediate": false,
|
||||
"default command buffer immediate": true,
|
||||
"multithreaded recording": true
|
||||
},
|
||||
"pipelines": {
|
||||
@ -114,7 +114,7 @@
|
||||
"bloom": true,
|
||||
"rt": true,
|
||||
"fsr": false,
|
||||
"postProcess": false
|
||||
"postProcess": false // "postProcess.chromab" // false
|
||||
},
|
||||
"formats": {
|
||||
"depth": "D32_SFLOAT",
|
||||
@ -153,7 +153,7 @@
|
||||
"VK_EXT_memory_budget"
|
||||
,"VK_EXT_descriptor_indexing"
|
||||
,"VK_KHR_buffer_device_address"
|
||||
// ,"VK_NV_device_diagnostic_checkpoints"
|
||||
,"VK_NV_device_diagnostic_checkpoints"
|
||||
]
|
||||
},
|
||||
"features": [
|
||||
|
@ -19,7 +19,7 @@
|
||||
},
|
||||
"info_player_spawn": { "action": "attach", "filename": "./player.json", "transform": { "orientation": [ 0, 1, 0, 0 ] } },
|
||||
"light_environment": { "transform": { "orientation": [0,0,0,1] }, "light": {
|
||||
"color": [0.1, 0.1, 0.1],
|
||||
// "color": [0.1, 0.1, 0.1],
|
||||
"power": 10000,
|
||||
"global": true,
|
||||
"bias": {
|
||||
|
@ -0,0 +1,80 @@
|
||||
#version 450
|
||||
#pragma shader_stage(fragment)
|
||||
#extension GL_EXT_samplerless_texture_functions : require
|
||||
|
||||
layout (location = 0) in vec2 inUv;
|
||||
layout (location = 1) flat in uint inPass;
|
||||
|
||||
layout (location = 0) out vec4 outColor;
|
||||
|
||||
layout (binding = 0) uniform sampler2D samplerColor;
|
||||
|
||||
layout (binding = 1) uniform UBO {
|
||||
float curTime;
|
||||
float gamma;
|
||||
float exposure;
|
||||
uint padding;
|
||||
} ubo;
|
||||
|
||||
#define TONE_MAP 1
|
||||
#define GAMMA_CORRECT 1
|
||||
#define TEXTURES 1
|
||||
|
||||
#include "../../common/macros.h"
|
||||
#include "../../common/structs.h"
|
||||
#include "../../common/functions.h"
|
||||
|
||||
vec2 barrelDistortion(vec2 coord, float amt) {
|
||||
vec2 cc = coord - 0.5;
|
||||
float dist = dot(cc, cc);
|
||||
return coord + cc * dist * amt;
|
||||
}
|
||||
|
||||
float sat( float t ) {
|
||||
return clamp( t, 0.0, 1.0 );
|
||||
}
|
||||
|
||||
float linterp( float t ) {
|
||||
return sat( 1.0 - abs( 2.0*t - 1.0 ) );
|
||||
}
|
||||
|
||||
float remap( float t, float a, float b ) {
|
||||
return sat( (t - a) / (b - a) );
|
||||
}
|
||||
|
||||
vec4 spectrumOffset( float t ) {
|
||||
vec4 ret;
|
||||
float lo = step(t,0.5);
|
||||
float hi = 1.0-lo;
|
||||
float w = linterp( remap( t, 1.0/6.0, 5.0/6.0 ) );
|
||||
ret = vec4(lo,1.0,hi, 1.) * vec4(1.0-w, w, 1.0-w, 1.);
|
||||
|
||||
return pow( ret, vec4(1.0/2.2) );
|
||||
}
|
||||
|
||||
const float MAX_DISTORT = 0.125;
|
||||
const int ITERATIONS = 32;
|
||||
const float ITERATIONS_RECIP = 1.0 / float(ITERATIONS);
|
||||
|
||||
void main() {
|
||||
const vec2 screenResolution = textureSize( samplerColor, 0 );
|
||||
const vec2 uv = (inUv.xy); // * 2.0 - 1.0);
|
||||
|
||||
vec4 colorSigma = vec4(0.0);
|
||||
vec4 wSigma = vec4(0.0);
|
||||
for ( uint i=0; i < ITERATIONS;++i ) {
|
||||
float t = float(i) * ITERATIONS_RECIP;
|
||||
vec4 w = spectrumOffset( t );
|
||||
wSigma += w;
|
||||
colorSigma += w * texture(samplerColor, barrelDistortion(uv, MAX_DISTORT * t * 0.6 ));
|
||||
}
|
||||
|
||||
outColor = colorSigma / wSigma;
|
||||
|
||||
#if TONE_MAP
|
||||
toneMap(outColor, ubo.exposure);
|
||||
#endif
|
||||
#if GAMMA_CORRECT
|
||||
gammaCorrect(outColor, ubo.gamma);
|
||||
#endif
|
||||
}
|
@ -10,7 +10,7 @@
|
||||
#include <uf/utils/memory/map.h>
|
||||
#include <uf/ext/xatlas/xatlas.h>
|
||||
#include <uf/ext/ffx/fsr.h>
|
||||
|
||||
#include <uf/ext/ext.h>
|
||||
|
||||
#if UF_ENV_DREAMCAST
|
||||
#define UF_DEBUG_TIMER_MULTITRACE_START(...) UF_TIMER_MULTITRACE_START(__VA_ARGS__)
|
||||
@ -374,9 +374,9 @@ void uf::graph::initializeGraphics( pod::Graph& graph, uf::Object& entity, uf::M
|
||||
}
|
||||
|
||||
{
|
||||
size_t maxTextures = sceneMetadataJson["system"]["config"]["engine"]["scenes"]["textures"]["max"]["2D"].as<size_t>(512);
|
||||
size_t maxCubemaps = sceneMetadataJson["system"]["config"]["engine"]["scenes"]["textures"]["max"]["cube"].as<size_t>(128);
|
||||
size_t maxTextures3D = sceneMetadataJson["system"]["config"]["engine"]["scenes"]["textures"]["max"]["3D"].as<size_t>(128);
|
||||
size_t maxTextures = ext::config["engine"]["scenes"]["textures"]["max"]["2D"].as<size_t>(512);
|
||||
size_t maxCubemaps = ext::config["engine"]["scenes"]["textures"]["max"]["cube"].as<size_t>(128);
|
||||
size_t maxTextures3D = ext::config["engine"]["scenes"]["textures"]["max"]["3D"].as<size_t>(128);
|
||||
|
||||
auto& shader = graphic.material.getShader("fragment", "baking");
|
||||
shader.setSpecializationConstants({
|
||||
@ -1553,6 +1553,30 @@ void uf::graph::tick() {
|
||||
if ( rebuild ) {
|
||||
UF_MSG_DEBUG("Graph buffers requesting renderer update");
|
||||
uf::renderer::states::rebuild = true;
|
||||
|
||||
/*
|
||||
if ( uf::renderer::hasRenderMode("", true) ) {
|
||||
auto& renderMode = uf::renderer::getRenderMode("", true);
|
||||
auto& blitter = renderMode.getBlitter();
|
||||
auto& shader = blitter.material.getShader(blitter.material.hasShader("compute", "deferred") ? "compute" : "fragment", "deferred");
|
||||
|
||||
blitter.material.textures.clear();
|
||||
|
||||
auto moved = std::move( shader.buffers );
|
||||
for ( auto& buffer : moved ) {
|
||||
if ( buffer.aliased ) continue;
|
||||
shader.buffers.emplace_back( buffer );
|
||||
buffer.aliased = true;
|
||||
}
|
||||
|
||||
shader.buffers.emplace_back( uf::graph::storage.buffers.drawCommands.alias() );
|
||||
shader.buffers.emplace_back( uf::graph::storage.buffers.instance.alias() );
|
||||
shader.buffers.emplace_back( uf::graph::storage.buffers.instanceAddresses.alias() );
|
||||
shader.buffers.emplace_back( uf::graph::storage.buffers.material.alias() );
|
||||
shader.buffers.emplace_back( uf::graph::storage.buffers.texture.alias() );
|
||||
shader.buffers.emplace_back( uf::graph::storage.buffers.light.alias() );
|
||||
}
|
||||
*/
|
||||
}
|
||||
}
|
||||
void uf::graph::render() {
|
||||
|
@ -214,6 +214,9 @@ uf::Scene& uf::scene::loadScene( const uf::stl::string& name, const uf::stl::str
|
||||
const uf::stl::string filename = _filename != "" ? _filename : (uf::stl::string("/") + uf::string::lowercase(name) + "/scene.json");
|
||||
#endif
|
||||
scene->load(filename);
|
||||
|
||||
auto& metadataJson = scene->getComponent<uf::Serializer>();
|
||||
metadataJson["system"]["scene"] = name;
|
||||
#if UF_USE_VULKAN
|
||||
if ( uf::renderer::settings::pipelines::rt ) uf::instantiator::bind( "RayTraceSceneBehavior", *scene );
|
||||
if ( uf::renderer::settings::pipelines::vxgi ) uf::instantiator::bind( "VoxelizerSceneBehavior", *scene );
|
||||
@ -229,6 +232,9 @@ uf::Scene& uf::scene::loadScene( const uf::stl::string& name, const uf::Serializ
|
||||
uf::Scene* scene = uf::instantiator::objects->has( name ) ? (uf::Scene*) &uf::instantiator::instantiate( name ) : new uf::Scene;
|
||||
uf::scene::scenes.emplace_back( scene );
|
||||
if ( data != "" ) scene->load(data);
|
||||
|
||||
auto& metadataJson = scene->getComponent<uf::Serializer>();
|
||||
metadataJson["system"]["scene"] = name;
|
||||
#if UF_USE_VULKAN
|
||||
if ( uf::renderer::settings::pipelines::rt ) uf::instantiator::bind( "RayTraceSceneBehavior", *scene );
|
||||
if ( uf::renderer::settings::pipelines::vxgi ) uf::instantiator::bind( "VoxelizerSceneBehavior", *scene );
|
||||
@ -250,6 +256,14 @@ void uf::scene::unloadScene() {
|
||||
auto graph = current->getGraph(true);
|
||||
for ( auto entity : graph ) entity->destroy();
|
||||
*/
|
||||
auto graph = current->getGraph(true);
|
||||
for ( auto entity : graph ) {
|
||||
if ( !entity->hasComponent<uf::renderer::RenderTargetRenderMode>() ) continue;
|
||||
auto& renderMode = entity->getComponent<uf::renderer::RenderTargetRenderMode>();
|
||||
|
||||
uf::renderer::removeRenderMode( &renderMode, false );
|
||||
}
|
||||
|
||||
uf::scene::scenes.pop_back();
|
||||
}
|
||||
uf::Scene& uf::scene::getCurrentScene() {
|
||||
|
@ -244,6 +244,15 @@ void ext::reactphysics::tick( float delta ) {
|
||||
}
|
||||
void ext::reactphysics::terminate() {
|
||||
if ( !::world ) return;
|
||||
|
||||
size_t count = ::world->getNbRigidBodies();
|
||||
for ( size_t i = 0; i < count; ++i ) {
|
||||
auto* body = ::world->getRigidBody(i); if ( !body ) continue;
|
||||
uf::Object* object = (uf::Object*) body->getUserData(); if ( !object || !object->isValid() ) continue;
|
||||
auto& state = object->getComponent<pod::PhysicsState>(); // if ( !state.shared ) continue;
|
||||
state.body = NULL;
|
||||
}
|
||||
|
||||
::common.destroyPhysicsWorld(::world);
|
||||
::world = NULL;
|
||||
}
|
||||
|
@ -210,7 +210,7 @@ bool ext::vulkan::Buffer::update( const void* data, VkDeviceSize length, bool st
|
||||
VK_BUFFER_USAGE_TRANSFER_SRC_BIT,
|
||||
VK_MEMORY_PROPERTY_HOST_VISIBLE_BIT | VK_MEMORY_PROPERTY_HOST_COHERENT_BIT
|
||||
);
|
||||
auto commandBuffer = device->fetchCommandBuffer(QueueEnum::TRANSFER, false); // waits on finish
|
||||
auto commandBuffer = device->fetchCommandBuffer(QueueEnum::TRANSFER); // waits on finish
|
||||
VkBufferCopy region = {};
|
||||
region.size = length;
|
||||
device->UF_CHECKPOINT_MARK( commandBuffer, pod::Checkpoint::GENERIC, "copyBuffer" );
|
||||
|
@ -681,6 +681,7 @@ VkFence ext::vulkan::Device::getFence() {
|
||||
return fence;
|
||||
}
|
||||
void ext::vulkan::Device::destroyFence( VkFence fence ) {
|
||||
// vkDestroyFence( this->logicalDevice, fence, nullptr );
|
||||
VK_CHECK_RESULT(vkResetFences( this->logicalDevice, 1, &fence ) );
|
||||
this->reusable.fences.emplace( fence );
|
||||
}
|
||||
|
@ -880,7 +880,7 @@ void ext::vulkan::Pipeline::update( const Graphic& graphic, const GraphicDescrip
|
||||
}
|
||||
// really needs some love
|
||||
if ( this->metadata.built ) {
|
||||
// renderMode.synchronize();
|
||||
renderMode.synchronize();
|
||||
bool locked = renderMode.tryMutex();
|
||||
renderMode.rebuild = true;
|
||||
// uf::renderer::flushCommandBuffers();
|
||||
|
@ -420,11 +420,9 @@ void ext::vulkan::RenderMode::initialize( Device& device ) {
|
||||
}
|
||||
|
||||
void ext::vulkan::RenderMode::tick() {
|
||||
/*
|
||||
if ( ext::vulkan::states::resized || uf::renderer::states::rebuild || rebuild ) {
|
||||
cleanupAllCommands();
|
||||
}
|
||||
*/
|
||||
this->synchronize();
|
||||
|
||||
if ( metadata.limiter.frequency > 0 ) {
|
||||
|
@ -13,6 +13,7 @@
|
||||
|
||||
#include <uf/ext/vulkan/graphic.h>
|
||||
#include <uf/engine/graph/graph.h>
|
||||
#include <uf/ext/ext.h>
|
||||
|
||||
#define BARYCENTRIC 0
|
||||
#if BARYCENTRIC
|
||||
@ -216,9 +217,11 @@ void ext::vulkan::DeferredRenderMode::initialize( Device& device ) {
|
||||
{
|
||||
uf::stl::string vertexShaderFilename = uf::io::root+"/shaders/display/renderTarget/vert.spv";
|
||||
uf::stl::string fragmentShaderFilename = uf::io::root+"/shaders/display/renderTarget/frag.spv";
|
||||
|
||||
uf::stl::string postProcess = ::fmt::format("{}.frag", metadata.json["postProcess"].as<uf::stl::string>("postProcess"));
|
||||
{
|
||||
std::pair<bool, uf::stl::string> settings[] = {
|
||||
{ settings::pipelines::postProcess /*&& !settings::pipelines::rt*/, "postProcess.frag" },
|
||||
{ settings::pipelines::postProcess /*&& !settings::pipelines::rt*/, postProcess },
|
||||
// { msaa > 1, "msaa.frag" },
|
||||
};
|
||||
FOR_ARRAY( settings ) if ( settings[i].first ) fragmentShaderFilename = uf::string::replace( fragmentShaderFilename, "frag", settings[i].second );
|
||||
@ -264,11 +267,11 @@ void ext::vulkan::DeferredRenderMode::initialize( Device& device ) {
|
||||
|
||||
auto& shader = blitter.material.getShader(DEFERRED_MODE, "deferred");
|
||||
|
||||
size_t maxLights = sceneMetadataJson["system"]["config"]["engine"]["scenes"]["lights"]["max"].as<size_t>(512);
|
||||
size_t maxTextures2D = sceneMetadataJson["system"]["config"]["engine"]["scenes"]["textures"]["max"]["2D"].as<size_t>(512);
|
||||
size_t maxTexturesCube = sceneMetadataJson["system"]["config"]["engine"]["scenes"]["textures"]["max"]["cube"].as<size_t>(128);
|
||||
size_t maxTextures3D = sceneMetadataJson["system"]["config"]["engine"]["scenes"]["textures"]["max"]["3D"].as<size_t>(128);
|
||||
size_t maxCascades = sceneMetadataJson["system"]["config"]["engine"]["scenes"]["vxgi"]["cascades"].as<size_t>(16);
|
||||
size_t maxLights = ext::config["engine"]["scenes"]["lights"]["max"].as<size_t>(512);
|
||||
size_t maxTextures2D = ext::config["engine"]["scenes"]["textures"]["max"]["2D"].as<size_t>(512);
|
||||
size_t maxTexturesCube = ext::config["engine"]["scenes"]["textures"]["max"]["cube"].as<size_t>(128);
|
||||
size_t maxTextures3D = ext::config["engine"]["scenes"]["textures"]["max"]["3D"].as<size_t>(128);
|
||||
size_t maxCascades = ext::config["engine"]["scenes"]["vxgi"]["cascades"].as<size_t>(16);
|
||||
|
||||
shader.setSpecializationConstants({
|
||||
{ "TEXTURES", maxTextures2D },
|
||||
@ -498,6 +501,24 @@ void ext::vulkan::DeferredRenderMode::tick() {
|
||||
}
|
||||
// update blitter descriptor set
|
||||
if ( rebuild && blitter.initialized ) {
|
||||
if ( true ) {
|
||||
auto& shader = blitter.material.getShader(DEFERRED_MODE, "deferred");
|
||||
|
||||
auto moved = std::move( shader.buffers );
|
||||
for ( auto& buffer : moved ) {
|
||||
if ( buffer.aliased ) continue;
|
||||
shader.buffers.emplace_back( buffer );
|
||||
buffer.aliased = true;
|
||||
}
|
||||
|
||||
shader.buffers.emplace_back( uf::graph::storage.buffers.drawCommands.alias() );
|
||||
shader.buffers.emplace_back( uf::graph::storage.buffers.instance.alias() );
|
||||
shader.buffers.emplace_back( uf::graph::storage.buffers.instanceAddresses.alias() );
|
||||
shader.buffers.emplace_back( uf::graph::storage.buffers.material.alias() );
|
||||
shader.buffers.emplace_back( uf::graph::storage.buffers.texture.alias() );
|
||||
shader.buffers.emplace_back( uf::graph::storage.buffers.light.alias() );
|
||||
}
|
||||
|
||||
if ( blitter.hasPipeline( blitter.descriptor ) ){
|
||||
blitter.getPipeline( blitter.descriptor ).update( blitter, blitter.descriptor );
|
||||
} else {
|
||||
@ -652,7 +673,7 @@ void ext::vulkan::DeferredRenderMode::createCommandBuffers( const uf::stl::vecto
|
||||
}
|
||||
}
|
||||
}
|
||||
bool shouldRecord = true; // ( settings::pipelines::rt && !sceneMetadataJson["system"]["config"]["engine"]["scenes"]["rt"]["full"].as<bool>() ) || !settings::pipelines::rt;
|
||||
bool shouldRecord = true; // ( settings::pipelines::rt && !ext::config["engine"]["scenes"]["rt"]["full"].as<bool>() ) || !settings::pipelines::rt;
|
||||
for (size_t i = 0; i < commands.size(); ++i) {
|
||||
auto commandBuffer = commands[i];
|
||||
VK_CHECK_RESULT( vkBeginCommandBuffer(commandBuffer, &cmdBufInfo) );
|
||||
|
@ -9,6 +9,7 @@
|
||||
#include <uf/ext/vulkan/graphic.h>
|
||||
#include <uf/engine/graph/graph.h>
|
||||
#include <uf/utils/camera/camera.h>
|
||||
#include <uf/ext/ext.h>
|
||||
|
||||
const uf::stl::string ext::vulkan::RenderTargetRenderMode::getType() const {
|
||||
return "RenderTarget";
|
||||
@ -301,8 +302,10 @@ void ext::vulkan::RenderTargetRenderMode::initialize( Device& device ) {
|
||||
} else {
|
||||
uf::stl::string vertexShaderFilename = uf::io::root+"/shaders/display/renderTarget/vert.spv";
|
||||
uf::stl::string fragmentShaderFilename = uf::io::root+"/shaders/display/renderTarget/frag.spv"; {
|
||||
uf::stl::string postProcess = ::fmt::format("{}.frag", metadata.json["postProcess"].as<uf::stl::string>("postProcess"));
|
||||
|
||||
std::pair<bool, uf::stl::string> settings[] = {
|
||||
{ settings::pipelines::postProcess, "postProcess.frag" },
|
||||
{ settings::pipelines::postProcess, postProcess },
|
||||
// { msaa > 1, "msaa.frag" },
|
||||
};
|
||||
FOR_ARRAY( settings ) if ( settings[i].first ) fragmentShaderFilename = uf::string::replace( fragmentShaderFilename, "frag", settings[i].second );
|
||||
@ -318,11 +321,11 @@ void ext::vulkan::RenderTargetRenderMode::initialize( Device& device ) {
|
||||
|
||||
auto& shader = blitter.material.getShader("compute");
|
||||
|
||||
size_t maxLights = sceneMetadataJson["system"]["config"]["engine"]["scenes"]["lights"]["max"].as<size_t>(512);
|
||||
size_t maxTextures2D = sceneMetadataJson["system"]["config"]["engine"]["scenes"]["textures"]["max"]["2D"].as<size_t>(512);
|
||||
size_t maxTexturesCube = sceneMetadataJson["system"]["config"]["engine"]["scenes"]["textures"]["max"]["cube"].as<size_t>(128);
|
||||
size_t maxTextures3D = sceneMetadataJson["system"]["config"]["engine"]["scenes"]["textures"]["max"]["3D"].as<size_t>(1);
|
||||
size_t maxCascades = sceneMetadataJson["system"]["config"]["engine"]["scenes"]["vxgi"]["cascades"].as<size_t>(16);
|
||||
size_t maxLights = ext::config["engine"]["scenes"]["lights"]["max"].as<size_t>(512);
|
||||
size_t maxTextures2D = ext::config["engine"]["scenes"]["textures"]["max"]["2D"].as<size_t>(512);
|
||||
size_t maxTexturesCube = ext::config["engine"]["scenes"]["textures"]["max"]["cube"].as<size_t>(128);
|
||||
size_t maxTextures3D = ext::config["engine"]["scenes"]["textures"]["max"]["3D"].as<size_t>(1);
|
||||
size_t maxCascades = ext::config["engine"]["scenes"]["vxgi"]["cascades"].as<size_t>(16);
|
||||
|
||||
shader.setSpecializationConstants({
|
||||
{ "TEXTURES", maxTextures2D },
|
||||
|
@ -573,7 +573,7 @@ void ext::vulkan::Texture::fromBuffers(
|
||||
VK_CHECK_RESULT(vkCreateImageView(device.logicalDevice, &viewCreateInfo, nullptr, &view));
|
||||
|
||||
{
|
||||
auto commandBuffer = device.fetchCommandBuffer(uf::renderer::QueueEnum::GRAPHICS, true);
|
||||
auto commandBuffer = device.fetchCommandBuffer(uf::renderer::QueueEnum::GRAPHICS);
|
||||
device.UF_CHECKPOINT_MARK( commandBuffer, pod::Checkpoint::GENERIC, "setImageLayout" );
|
||||
uf::renderer::Texture::setImageLayout( commandBuffer, image, VK_IMAGE_LAYOUT_UNDEFINED, (this->imageLayout = imageLayout), viewCreateInfo.subresourceRange );
|
||||
device.flushCommandBuffer(commandBuffer);
|
||||
|
@ -140,6 +140,7 @@ VKAPI_ATTR VkBool32 VKAPI_CALL ext::vulkan::debugCallback(
|
||||
}
|
||||
|
||||
uf::stl::string ext::vulkan::retrieveCheckpoint( VkQueue queue ) {
|
||||
if ( !ext::vulkan::settings::validation::checkpoints || !vkGetQueueCheckpointDataNV ) return "";
|
||||
uint32_t size = 0;
|
||||
vkGetQueueCheckpointDataNV(queue, &size, 0);
|
||||
|
||||
@ -183,7 +184,7 @@ uf::stl::string ext::vulkan::errorString( VkResult result ) {
|
||||
STR(ERROR_INVALID_SHADER_NV);
|
||||
#undef STR
|
||||
default:
|
||||
return "UNKNOWN_ERROR";
|
||||
return ::fmt::format("UNKNOWN_ERROR: {}", result);
|
||||
}
|
||||
}
|
||||
VkSampleCountFlagBits ext::vulkan::sampleCount( uint8_t count ) {
|
||||
@ -614,8 +615,21 @@ void ext::vulkan::flushCommandBuffers() {
|
||||
|
||||
auto queue = device.getQueue( queueType, threadId );
|
||||
|
||||
VkResult res = vkWaitForFences( device, tuple.fences.size(), tuple.fences.data(), VK_TRUE, VK_DEFAULT_FENCE_TIMEOUT );
|
||||
VK_CHECK_QUEUE_CHECKPOINT( queue, res );
|
||||
// AMD driver has a limitation on how many fences to wait on at once
|
||||
constexpr size_t totalFences = 64;
|
||||
if ( tuple.fences.size() < totalFences ) {
|
||||
VkResult res = vkWaitForFences( device, tuple.fences.size(), tuple.fences.data(), VK_TRUE, VK_DEFAULT_FENCE_TIMEOUT );
|
||||
VK_CHECK_QUEUE_CHECKPOINT( queue, res );
|
||||
} else {
|
||||
auto it = tuple.fences.begin();
|
||||
auto end = tuple.fences.end();
|
||||
while ( it != end ) {
|
||||
size_t advance = MIN(end - it, totalFences);
|
||||
VkResult res = vkWaitForFences( device, advance, &(*it), VK_TRUE, VK_DEFAULT_FENCE_TIMEOUT );
|
||||
VK_CHECK_QUEUE_CHECKPOINT( queue, res );
|
||||
it += advance;
|
||||
}
|
||||
}
|
||||
|
||||
for ( auto& commandBuffer : tuple.commandBuffers ) {
|
||||
uf::checkpoint::deallocate(device.checkpoints[commandBuffer]);
|
||||
|
@ -56,7 +56,7 @@ void ext::LightBehavior::initialize( uf::Object& self ) {
|
||||
#if UF_USE_OPENGL
|
||||
metadataJson["light"]["shadows"] = false;
|
||||
#endif
|
||||
if ( !sceneMetadataJson["system"]["config"]["engine"]["scenes"]["lights"]["shadows"]["enabled"].as<bool>(true) ) {
|
||||
if ( !sceneMetadataJson["lights"]["shadows"]["enabled"].as<bool>(true) ) {
|
||||
metadataJson["light"]["shadows"] = false;
|
||||
}
|
||||
if ( metadataJson["light"]["shadows"].as<bool>() ) {
|
||||
@ -236,6 +236,7 @@ void ext::LightBehavior::render( uf::Object& self ){}
|
||||
void ext::LightBehavior::destroy( uf::Object& self ){
|
||||
if ( this->hasComponent<uf::renderer::RenderTargetRenderMode>() ) {
|
||||
auto& renderMode = this->getComponent<uf::renderer::RenderTargetRenderMode>();
|
||||
|
||||
uf::renderer::removeRenderMode( &renderMode, false );
|
||||
this->deleteComponent<uf::renderer::RenderTargetRenderMode>();
|
||||
}
|
||||
|
@ -188,11 +188,11 @@ void ext::RayTraceSceneBehavior::tick( uf::Object& self ) {
|
||||
//
|
||||
auto& scene = uf::scene::getCurrentScene();
|
||||
auto& sceneMetadataJson = scene.getComponent<uf::Serializer>();
|
||||
size_t maxLights = sceneMetadataJson["system"]["config"]["engine"]["scenes"]["lights"]["max"].as<size_t>(512);
|
||||
size_t maxTextures2D = sceneMetadataJson["system"]["config"]["engine"]["scenes"]["textures"]["max"]["2D"].as<size_t>(512);
|
||||
size_t maxTexturesCube = sceneMetadataJson["system"]["config"]["engine"]["scenes"]["textures"]["max"]["cube"].as<size_t>(128);
|
||||
size_t maxTextures3D = sceneMetadataJson["system"]["config"]["engine"]["scenes"]["textures"]["max"]["3D"].as<size_t>(1);
|
||||
size_t maxCascades = sceneMetadataJson["system"]["config"]["engine"]["scenes"]["vxgi"]["cascades"].as<size_t>(16);
|
||||
size_t maxLights = ext::config["engine"]["scenes"]["lights"]["max"].as<size_t>(512);
|
||||
size_t maxTextures2D = ext::config["engine"]["scenes"]["textures"]["max"]["2D"].as<size_t>(512);
|
||||
size_t maxTexturesCube = ext::config["engine"]["scenes"]["textures"]["max"]["cube"].as<size_t>(128);
|
||||
size_t maxTextures3D = ext::config["engine"]["scenes"]["textures"]["max"]["3D"].as<size_t>(1);
|
||||
size_t maxCascades = ext::config["engine"]["scenes"]["vxgi"]["cascades"].as<size_t>(16);
|
||||
|
||||
shader.buffers.emplace_back( uf::graph::storage.buffers.instance.alias() );
|
||||
shader.buffers.emplace_back( uf::graph::storage.buffers.instanceAddresses.alias() );
|
||||
|
@ -128,6 +128,7 @@ void ext::ExtSceneBehavior::initialize( uf::Object& self ) {
|
||||
uf::hooks.call("window:Mouse.CursorVisibility", payload);
|
||||
uf::hooks.call("window:Mouse.Lock");
|
||||
}
|
||||
|
||||
auto& sceneTextures = this->getComponent<pod::SceneTextures>();
|
||||
// initialize perlin noise
|
||||
#if UF_USE_VULKAN
|
||||
@ -208,6 +209,14 @@ void ext::ExtSceneBehavior::initialize( uf::Object& self ) {
|
||||
}
|
||||
}
|
||||
#endif
|
||||
|
||||
if ( false ) {
|
||||
uf::physics::terminate();
|
||||
uf::graph::destroy();
|
||||
|
||||
uf::physics::initialize();
|
||||
uf::graph::initialize();
|
||||
}
|
||||
}
|
||||
void ext::ExtSceneBehavior::tick( uf::Object& self ) {
|
||||
// auto& assetLoader = this->getComponent<uf::asset>();
|
||||
|
@ -254,6 +254,7 @@ void ext::VoxelizerSceneBehavior::destroy( uf::Object& self ){
|
||||
#if UF_USE_VULKAN
|
||||
if ( this->hasComponent<uf::renderer::RenderTargetRenderMode>() ) {
|
||||
auto& renderMode = this->getComponent<uf::renderer::RenderTargetRenderMode>();
|
||||
|
||||
uf::renderer::removeRenderMode( &renderMode, false );
|
||||
this->deleteComponent<uf::renderer::RenderTargetRenderMode>();
|
||||
}
|
||||
|
85
ext/main.cpp
85
ext/main.cpp
@ -254,7 +254,7 @@ void EXT_API ext::load( ext::json::Value& json ) {
|
||||
uf::renderer::settings::defaultDeferBufferDestroy = configRenderInvariantJson["default defer buffer destroy"].as( uf::renderer::settings::defaultDeferBufferDestroy );
|
||||
#if 1
|
||||
uf::renderer::settings::defaultCommandBufferImmediate = true;
|
||||
::requestDeferredCommandBufferSubmit = configRenderInvariantJson["default command buffer immediate"].as( uf::renderer::settings::defaultCommandBufferImmediate );
|
||||
::requestDeferredCommandBufferSubmit = !configRenderInvariantJson["default command buffer immediate"].as( uf::renderer::settings::defaultCommandBufferImmediate );
|
||||
#else
|
||||
uf::renderer::settings::defaultCommandBufferImmediate = configRenderInvariantJson["default command buffer immediate"].as( uf::renderer::settings::defaultCommandBufferImmediate );
|
||||
#endif
|
||||
@ -412,7 +412,7 @@ void EXT_API ext::initialize() {
|
||||
uf::Scene& scene = uf::instantiator::instantiate<uf::Scene>(); //new uf::Scene;
|
||||
uf::scene::scenes.emplace_back(&scene);
|
||||
auto& metadata = scene.getComponent<uf::Serializer>();
|
||||
metadata["system"]["config"] = ::json;
|
||||
// metadata["system"]["config"] = ::json;
|
||||
}
|
||||
|
||||
ext::load( ::json );
|
||||
@ -499,6 +499,10 @@ void EXT_API ext::initialize() {
|
||||
uf::renderer::settings::pipelines::bloom = configRenderPipelinesJson["bloom"].as( uf::renderer::settings::pipelines::bloom );
|
||||
uf::renderer::settings::pipelines::rt = configRenderPipelinesJson["rt"].as( uf::renderer::settings::pipelines::rt );
|
||||
uf::renderer::settings::pipelines::postProcess = configRenderPipelinesJson["postProcess"].as( uf::renderer::settings::pipelines::postProcess );
|
||||
|
||||
if ( configRenderPipelinesJson["postProcess"].is<uf::stl::string>() ) {
|
||||
uf::renderer::settings::pipelines::postProcess = true;
|
||||
}
|
||||
|
||||
#if UF_USE_FFX_FSR
|
||||
uf::renderer::settings::pipelines::fsr = configRenderPipelinesJson["fsr"].as( uf::renderer::settings::pipelines::fsr );
|
||||
@ -566,6 +570,9 @@ void EXT_API ext::initialize() {
|
||||
if ( ::json["engine"]["render modes"]["deferred"].as<bool>(true) ) {
|
||||
auto* renderMode = new uf::renderer::DeferredRenderMode;
|
||||
|
||||
if ( ::json["engine"]["ext"]["vulkan"]["pipelines"]["postProcess"].is<uf::stl::string>() )
|
||||
renderMode->metadata.json["postProcess"] = ::json["engine"]["ext"]["vulkan"]["pipelines"]["postProcess"];
|
||||
|
||||
renderMode->blitter.descriptor.renderMode = "Swapchain";
|
||||
renderMode->blitter.descriptor.subpass = 0;
|
||||
#if UF_USE_FFX_FSR
|
||||
@ -606,6 +613,9 @@ void EXT_API ext::initialize() {
|
||||
|
||||
if ( ::json["engine"]["render modes"]["gui"].as<bool>(true) ) {
|
||||
auto* renderMode = new uf::renderer::RenderTargetRenderMode;
|
||||
if ( ::json["engine"]["ext"]["vulkan"]["pipelines"]["postProcess"].is<uf::stl::string>() )
|
||||
renderMode->metadata.json["postProcess"] = ::json["engine"]["ext"]["vulkan"]["pipelines"]["postProcess"];
|
||||
|
||||
uf::stl::string name = "Gui";
|
||||
renderMode->blitter.descriptor.renderMode = "Swapchain";
|
||||
renderMode->blitter.descriptor.subpass = 0;
|
||||
@ -705,11 +715,8 @@ void EXT_API ext::initialize() {
|
||||
uf::hooks.addHook( "game:Scene.Load", [&](ext::json::Value& json){
|
||||
auto function = [json](){
|
||||
uf::hooks.call("game:Scene.Cleanup");
|
||||
/*
|
||||
auto& scene = uf::scene::loadScene( json["scene"].as<uf::stl::string>() );
|
||||
auto& metadata = scene.getComponent<uf::Serializer>();
|
||||
metadata["system"]["config"] = ::json;
|
||||
*/
|
||||
};
|
||||
|
||||
|
||||
@ -718,31 +725,30 @@ void EXT_API ext::initialize() {
|
||||
});
|
||||
|
||||
uf::hooks.addHook( "game:Scene.Cleanup", [&](){
|
||||
if ( ::requestDedicatedRenderThread ) {
|
||||
::requestDedicatedRenderThread = true;
|
||||
uf::renderer::settings::experimental::dedicatedThread = false;
|
||||
}
|
||||
if ( ::requestDeferredCommandBufferSubmit ) {
|
||||
::requestDeferredCommandBufferSubmit = true;
|
||||
uf::renderer::settings::defaultCommandBufferImmediate = true;
|
||||
}
|
||||
|
||||
uf::renderer::synchronize();
|
||||
uf::renderer::flushCommandBuffers();
|
||||
|
||||
uf::scene::unloadScene();
|
||||
|
||||
/*
|
||||
// do GC
|
||||
{
|
||||
size_t collected = uf::instantiator::collect( ::config.engine.gc.mode );
|
||||
if ( collected > 0 ) {
|
||||
if ( ::config.engine.gc.announce ) UF_MSG_DEBUG("GC collected {} unused entities", (int) collected);
|
||||
// uf::renderer::states::rebuild = true;
|
||||
uf::renderer::states::rebuild = true;
|
||||
}
|
||||
}
|
||||
// reset physics world
|
||||
{
|
||||
uf::physics::terminate();
|
||||
uf::physics::initialize();
|
||||
}
|
||||
// reset graph state
|
||||
{
|
||||
uf::graph::destroy();
|
||||
uf::graph::initialize();
|
||||
}
|
||||
|
||||
uf::renderer::states::rebuild = true;
|
||||
uf::renderer::tick();
|
||||
uf::renderer::synchronize();
|
||||
*/
|
||||
});
|
||||
#endif
|
||||
uf::hooks.addHook( "game:Scene.Load", [&](ext::json::Value& json){
|
||||
@ -765,7 +771,6 @@ void EXT_API ext::initialize() {
|
||||
*/
|
||||
auto& scene = uf::scene::loadScene( ::json["engine"]["scenes"]["start"] );
|
||||
auto& metadata = scene.getComponent<uf::Serializer>();
|
||||
metadata["system"]["config"] = ::json;
|
||||
}
|
||||
|
||||
/*
|
||||
@ -780,43 +785,51 @@ void EXT_API ext::initialize() {
|
||||
}
|
||||
|
||||
void EXT_API ext::tick() {
|
||||
|
||||
#if 1
|
||||
if ( !ext::json::isNull( ::sceneTransition ) ) {
|
||||
auto target = ::sceneTransition["scene"].as<uf::stl::string>();
|
||||
::sceneTransition = ext::json::null();
|
||||
|
||||
UF_MSG_DEBUG("STARTING SCENE TRANSITION: {}", target);
|
||||
|
||||
/*
|
||||
if ( ::requestDedicatedRenderThread ) {
|
||||
::requestDedicatedRenderThread = true;
|
||||
uf::renderer::settings::experimental::dedicatedThread = false;
|
||||
}
|
||||
if ( ::requestDeferredCommandBufferSubmit ) {
|
||||
::requestDeferredCommandBufferSubmit = true;
|
||||
uf::renderer::settings::defaultCommandBufferImmediate = true;
|
||||
}
|
||||
|
||||
uf::renderer::synchronize();
|
||||
uf::renderer::flushCommandBuffers();
|
||||
|
||||
uf::scene::unloadScene();
|
||||
|
||||
/*
|
||||
// do GC
|
||||
{
|
||||
size_t collected = uf::instantiator::collect( ::config.engine.gc.mode );
|
||||
if ( collected > 0 ) {
|
||||
if ( ::config.engine.gc.announce ) UF_MSG_DEBUG("GC collected {} unused entities", (int) collected);
|
||||
// uf::renderer::states::rebuild = true;
|
||||
uf::renderer::states::rebuild = true;
|
||||
}
|
||||
}
|
||||
// reset physics world
|
||||
{
|
||||
uf::physics::terminate();
|
||||
uf::physics::initialize();
|
||||
}
|
||||
// reset graph state
|
||||
{
|
||||
uf::graph::destroy();
|
||||
uf::graph::initialize();
|
||||
}
|
||||
*/
|
||||
|
||||
auto& scene = uf::scene::loadScene( target );
|
||||
auto& metadata = scene.getComponent<uf::Serializer>();
|
||||
metadata["system"]["config"] = ::json;
|
||||
// metadata["system"]["config"] = ::json;
|
||||
|
||||
::sceneTransition = ext::json::null();
|
||||
UF_MSG_DEBUG("FINISHED SCENE TRANSITION: {}", target);
|
||||
|
||||
uf::physics::terminate();
|
||||
uf::graph::destroy();
|
||||
|
||||
uf::physics::initialize();
|
||||
uf::graph::initialize();
|
||||
}
|
||||
#endif
|
||||
|
||||
/* Tick controllers */ {
|
||||
spec::controller::tick();
|
||||
|
Loading…
Reference in New Issue
Block a user