From f3800abb217408020d1875391cc5741a59e23743 Mon Sep 17 00:00:00 2001 From: mrq Date: Fri, 6 Jan 2023 12:19:00 -0600 Subject: [PATCH] Commit for 2023.01.06 12-19-28.7z --- bin/data/config.json | 12 +-- .../sourceengine/base_sourceengine.json | 2 +- .../postProcess.chromab.frag.glsl | 80 +++++++++++++++++ ...ss.frag.glsl => postProcess.crt.frag.glsl} | 0 engine/src/engine/graph/graph.cpp | 32 ++++++- engine/src/engine/scene/scene.cpp | 14 +++ engine/src/ext/reactphysics/reactphysics.cpp | 9 ++ engine/src/ext/vulkan/buffer.cpp | 2 +- engine/src/ext/vulkan/device.cpp | 1 + engine/src/ext/vulkan/graphic.cpp | 2 +- engine/src/ext/vulkan/rendermode.cpp | 2 - .../src/ext/vulkan/rendermodes/deferred.cpp | 35 ++++++-- .../ext/vulkan/rendermodes/rendertarget.cpp | 15 ++-- engine/src/ext/vulkan/texture.cpp | 2 +- engine/src/ext/vulkan/vulkan.cpp | 20 ++++- ext/behaviors/light/behavior.cpp | 3 +- ext/behaviors/raytrace/behavior.cpp | 10 +-- ext/behaviors/scene/behavior.cpp | 9 ++ ext/behaviors/voxelizer/behavior.cpp | 1 + ext/main.cpp | 85 +++++++++++-------- 20 files changed, 262 insertions(+), 74 deletions(-) create mode 100644 bin/data/shaders/display/renderTarget/postProcess.chromab.frag.glsl rename bin/data/shaders/display/renderTarget/{postProcess.frag.glsl => postProcess.crt.frag.glsl} (100%) diff --git a/bin/data/config.json b/bin/data/config.json index 0cf3277f..a6de524c 100644 --- a/bin/data/config.json +++ b/bin/data/config.json @@ -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": [ diff --git a/bin/data/scenes/sourceengine/base_sourceengine.json b/bin/data/scenes/sourceengine/base_sourceengine.json index ea8ab2cc..50e7d229 100644 --- a/bin/data/scenes/sourceengine/base_sourceengine.json +++ b/bin/data/scenes/sourceengine/base_sourceengine.json @@ -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": { diff --git a/bin/data/shaders/display/renderTarget/postProcess.chromab.frag.glsl b/bin/data/shaders/display/renderTarget/postProcess.chromab.frag.glsl new file mode 100644 index 00000000..1f0a2422 --- /dev/null +++ b/bin/data/shaders/display/renderTarget/postProcess.chromab.frag.glsl @@ -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 +} \ No newline at end of file diff --git a/bin/data/shaders/display/renderTarget/postProcess.frag.glsl b/bin/data/shaders/display/renderTarget/postProcess.crt.frag.glsl similarity index 100% rename from bin/data/shaders/display/renderTarget/postProcess.frag.glsl rename to bin/data/shaders/display/renderTarget/postProcess.crt.frag.glsl diff --git a/engine/src/engine/graph/graph.cpp b/engine/src/engine/graph/graph.cpp index 07f2f822..ce714939 100644 --- a/engine/src/engine/graph/graph.cpp +++ b/engine/src/engine/graph/graph.cpp @@ -10,7 +10,7 @@ #include #include #include - +#include #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(512); - size_t maxCubemaps = sceneMetadataJson["system"]["config"]["engine"]["scenes"]["textures"]["max"]["cube"].as(128); - size_t maxTextures3D = sceneMetadataJson["system"]["config"]["engine"]["scenes"]["textures"]["max"]["3D"].as(128); + size_t maxTextures = ext::config["engine"]["scenes"]["textures"]["max"]["2D"].as(512); + size_t maxCubemaps = ext::config["engine"]["scenes"]["textures"]["max"]["cube"].as(128); + size_t maxTextures3D = ext::config["engine"]["scenes"]["textures"]["max"]["3D"].as(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() { diff --git a/engine/src/engine/scene/scene.cpp b/engine/src/engine/scene/scene.cpp index 48fbcab4..c2b02e90 100644 --- a/engine/src/engine/scene/scene.cpp +++ b/engine/src/engine/scene/scene.cpp @@ -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(); + 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(); + 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() ) continue; + auto& renderMode = entity->getComponent(); + + uf::renderer::removeRenderMode( &renderMode, false ); + } + uf::scene::scenes.pop_back(); } uf::Scene& uf::scene::getCurrentScene() { diff --git a/engine/src/ext/reactphysics/reactphysics.cpp b/engine/src/ext/reactphysics/reactphysics.cpp index dd9d82d7..b81e33cf 100644 --- a/engine/src/ext/reactphysics/reactphysics.cpp +++ b/engine/src/ext/reactphysics/reactphysics.cpp @@ -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(); // if ( !state.shared ) continue; + state.body = NULL; + } + ::common.destroyPhysicsWorld(::world); ::world = NULL; } diff --git a/engine/src/ext/vulkan/buffer.cpp b/engine/src/ext/vulkan/buffer.cpp index 5a253858..2ca4d618 100644 --- a/engine/src/ext/vulkan/buffer.cpp +++ b/engine/src/ext/vulkan/buffer.cpp @@ -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" ); diff --git a/engine/src/ext/vulkan/device.cpp b/engine/src/ext/vulkan/device.cpp index 2836ce79..6bb73cb0 100644 --- a/engine/src/ext/vulkan/device.cpp +++ b/engine/src/ext/vulkan/device.cpp @@ -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 ); } diff --git a/engine/src/ext/vulkan/graphic.cpp b/engine/src/ext/vulkan/graphic.cpp index 5e29eb6f..34a9edb3 100644 --- a/engine/src/ext/vulkan/graphic.cpp +++ b/engine/src/ext/vulkan/graphic.cpp @@ -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(); diff --git a/engine/src/ext/vulkan/rendermode.cpp b/engine/src/ext/vulkan/rendermode.cpp index 04a2bdc5..c6a7d927 100644 --- a/engine/src/ext/vulkan/rendermode.cpp +++ b/engine/src/ext/vulkan/rendermode.cpp @@ -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 ) { diff --git a/engine/src/ext/vulkan/rendermodes/deferred.cpp b/engine/src/ext/vulkan/rendermodes/deferred.cpp index 24e8aa3c..fcefa391 100644 --- a/engine/src/ext/vulkan/rendermodes/deferred.cpp +++ b/engine/src/ext/vulkan/rendermodes/deferred.cpp @@ -13,6 +13,7 @@ #include #include +#include #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("postProcess")); { std::pair 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(512); - size_t maxTextures2D = sceneMetadataJson["system"]["config"]["engine"]["scenes"]["textures"]["max"]["2D"].as(512); - size_t maxTexturesCube = sceneMetadataJson["system"]["config"]["engine"]["scenes"]["textures"]["max"]["cube"].as(128); - size_t maxTextures3D = sceneMetadataJson["system"]["config"]["engine"]["scenes"]["textures"]["max"]["3D"].as(128); - size_t maxCascades = sceneMetadataJson["system"]["config"]["engine"]["scenes"]["vxgi"]["cascades"].as(16); + size_t maxLights = ext::config["engine"]["scenes"]["lights"]["max"].as(512); + size_t maxTextures2D = ext::config["engine"]["scenes"]["textures"]["max"]["2D"].as(512); + size_t maxTexturesCube = ext::config["engine"]["scenes"]["textures"]["max"]["cube"].as(128); + size_t maxTextures3D = ext::config["engine"]["scenes"]["textures"]["max"]["3D"].as(128); + size_t maxCascades = ext::config["engine"]["scenes"]["vxgi"]["cascades"].as(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() ) || !settings::pipelines::rt; + bool shouldRecord = true; // ( settings::pipelines::rt && !ext::config["engine"]["scenes"]["rt"]["full"].as() ) || !settings::pipelines::rt; for (size_t i = 0; i < commands.size(); ++i) { auto commandBuffer = commands[i]; VK_CHECK_RESULT( vkBeginCommandBuffer(commandBuffer, &cmdBufInfo) ); diff --git a/engine/src/ext/vulkan/rendermodes/rendertarget.cpp b/engine/src/ext/vulkan/rendermodes/rendertarget.cpp index b31d846f..df2e8288 100644 --- a/engine/src/ext/vulkan/rendermodes/rendertarget.cpp +++ b/engine/src/ext/vulkan/rendermodes/rendertarget.cpp @@ -9,6 +9,7 @@ #include #include #include +#include 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("postProcess")); + std::pair 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(512); - size_t maxTextures2D = sceneMetadataJson["system"]["config"]["engine"]["scenes"]["textures"]["max"]["2D"].as(512); - size_t maxTexturesCube = sceneMetadataJson["system"]["config"]["engine"]["scenes"]["textures"]["max"]["cube"].as(128); - size_t maxTextures3D = sceneMetadataJson["system"]["config"]["engine"]["scenes"]["textures"]["max"]["3D"].as(1); - size_t maxCascades = sceneMetadataJson["system"]["config"]["engine"]["scenes"]["vxgi"]["cascades"].as(16); + size_t maxLights = ext::config["engine"]["scenes"]["lights"]["max"].as(512); + size_t maxTextures2D = ext::config["engine"]["scenes"]["textures"]["max"]["2D"].as(512); + size_t maxTexturesCube = ext::config["engine"]["scenes"]["textures"]["max"]["cube"].as(128); + size_t maxTextures3D = ext::config["engine"]["scenes"]["textures"]["max"]["3D"].as(1); + size_t maxCascades = ext::config["engine"]["scenes"]["vxgi"]["cascades"].as(16); shader.setSpecializationConstants({ { "TEXTURES", maxTextures2D }, diff --git a/engine/src/ext/vulkan/texture.cpp b/engine/src/ext/vulkan/texture.cpp index 06beda7e..b5f1adaf 100644 --- a/engine/src/ext/vulkan/texture.cpp +++ b/engine/src/ext/vulkan/texture.cpp @@ -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); diff --git a/engine/src/ext/vulkan/vulkan.cpp b/engine/src/ext/vulkan/vulkan.cpp index 0890bae1..a144067c 100644 --- a/engine/src/ext/vulkan/vulkan.cpp +++ b/engine/src/ext/vulkan/vulkan.cpp @@ -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]); diff --git a/ext/behaviors/light/behavior.cpp b/ext/behaviors/light/behavior.cpp index e62752d8..2edcafb4 100644 --- a/ext/behaviors/light/behavior.cpp +++ b/ext/behaviors/light/behavior.cpp @@ -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(true) ) { + if ( !sceneMetadataJson["lights"]["shadows"]["enabled"].as(true) ) { metadataJson["light"]["shadows"] = false; } if ( metadataJson["light"]["shadows"].as() ) { @@ -236,6 +236,7 @@ void ext::LightBehavior::render( uf::Object& self ){} void ext::LightBehavior::destroy( uf::Object& self ){ if ( this->hasComponent() ) { auto& renderMode = this->getComponent(); + uf::renderer::removeRenderMode( &renderMode, false ); this->deleteComponent(); } diff --git a/ext/behaviors/raytrace/behavior.cpp b/ext/behaviors/raytrace/behavior.cpp index 557601f5..9844ded0 100644 --- a/ext/behaviors/raytrace/behavior.cpp +++ b/ext/behaviors/raytrace/behavior.cpp @@ -188,11 +188,11 @@ void ext::RayTraceSceneBehavior::tick( uf::Object& self ) { // auto& scene = uf::scene::getCurrentScene(); auto& sceneMetadataJson = scene.getComponent(); - size_t maxLights = sceneMetadataJson["system"]["config"]["engine"]["scenes"]["lights"]["max"].as(512); - size_t maxTextures2D = sceneMetadataJson["system"]["config"]["engine"]["scenes"]["textures"]["max"]["2D"].as(512); - size_t maxTexturesCube = sceneMetadataJson["system"]["config"]["engine"]["scenes"]["textures"]["max"]["cube"].as(128); - size_t maxTextures3D = sceneMetadataJson["system"]["config"]["engine"]["scenes"]["textures"]["max"]["3D"].as(1); - size_t maxCascades = sceneMetadataJson["system"]["config"]["engine"]["scenes"]["vxgi"]["cascades"].as(16); + size_t maxLights = ext::config["engine"]["scenes"]["lights"]["max"].as(512); + size_t maxTextures2D = ext::config["engine"]["scenes"]["textures"]["max"]["2D"].as(512); + size_t maxTexturesCube = ext::config["engine"]["scenes"]["textures"]["max"]["cube"].as(128); + size_t maxTextures3D = ext::config["engine"]["scenes"]["textures"]["max"]["3D"].as(1); + size_t maxCascades = ext::config["engine"]["scenes"]["vxgi"]["cascades"].as(16); shader.buffers.emplace_back( uf::graph::storage.buffers.instance.alias() ); shader.buffers.emplace_back( uf::graph::storage.buffers.instanceAddresses.alias() ); diff --git a/ext/behaviors/scene/behavior.cpp b/ext/behaviors/scene/behavior.cpp index 92d3df35..c5a3d741 100644 --- a/ext/behaviors/scene/behavior.cpp +++ b/ext/behaviors/scene/behavior.cpp @@ -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(); // 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(); diff --git a/ext/behaviors/voxelizer/behavior.cpp b/ext/behaviors/voxelizer/behavior.cpp index 6f64027c..b3dd69ce 100644 --- a/ext/behaviors/voxelizer/behavior.cpp +++ b/ext/behaviors/voxelizer/behavior.cpp @@ -254,6 +254,7 @@ void ext::VoxelizerSceneBehavior::destroy( uf::Object& self ){ #if UF_USE_VULKAN if ( this->hasComponent() ) { auto& renderMode = this->getComponent(); + uf::renderer::removeRenderMode( &renderMode, false ); this->deleteComponent(); } diff --git a/ext/main.cpp b/ext/main.cpp index e8b6268d..63d2ef61 100644 --- a/ext/main.cpp +++ b/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(); //new uf::Scene; uf::scene::scenes.emplace_back(&scene); auto& metadata = scene.getComponent(); - 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::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(true) ) { auto* renderMode = new uf::renderer::DeferredRenderMode; + if ( ::json["engine"]["ext"]["vulkan"]["pipelines"]["postProcess"].is() ) + 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(true) ) { auto* renderMode = new uf::renderer::RenderTargetRenderMode; + if ( ::json["engine"]["ext"]["vulkan"]["pipelines"]["postProcess"].is() ) + 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() ); auto& metadata = scene.getComponent(); - 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(); - 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(); - ::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(); - 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();