diff --git a/assets/shaders/debug/debug_print.glsl b/assets/shaders/debug/debug_print.glsl new file mode 100644 index 000000000..ce4a318c1 --- /dev/null +++ b/assets/shaders/debug/debug_print.glsl @@ -0,0 +1,80 @@ +#ifndef F_SH_DEBUG_PRINT_GLS +#define F_SH_DEBUG_PRINT_GLS + +// These have to match the enums in pragma/rendering/global_render_settings_buffer_data.hpp +#define GLSL_TYPE_INT32 0 +#define GLSL_TYPE_UINT32 1 +#define GLSL_TYPE_FLOAT 2 +#define GLSL_TYPE_BOOLEAN 3 +#define GLSL_TYPE_VECTOR2 4 +#define GLSL_TYPE_VECTOR3 5 +#define GLSL_TYPE_VECTOR4 6 +#define GLSL_TYPE_MAT4 7 +#define GLSL_TYPE_VECTOR2I 8 +#define GLSL_TYPE_VECTOR3I 9 +#define GLSL_TYPE_VECTOR4I 10 +#define GLSL_TYPE_NOT_SET 11 +#define GLSL_TYPE_COUNT 12 +#define GLSL_TYPE_LAST 11 + +layout(std140, LAYOUT_ID(RENDER_SETTINGS, DEBUG_PRINT)) buffer DebugPrintData { + mat4 value; + uint type; +} u_debugPrintData; + +void print(int value) { + u_debugPrintData.value[0][0] = value; + u_debugPrintData.type = GLSL_TYPE_INT32; +} + +void print(uint value) { + u_debugPrintData.value[0][0] = value; + u_debugPrintData.type = GLSL_TYPE_UINT32; +} + +void print(float value) { + u_debugPrintData.value[0][0] = value; + u_debugPrintData.type = GLSL_TYPE_FLOAT; +} + +void print(bool value) { + u_debugPrintData.value[0][0] = value ? 1.0 : 0.0; + u_debugPrintData.type = GLSL_TYPE_BOOLEAN; +} + +void print(vec2 value) { + u_debugPrintData.value[0] = vec4(value, 0.0, 0.0); + u_debugPrintData.type = GLSL_TYPE_VECTOR2; +} + +void print(vec3 value) { + u_debugPrintData.value[0] = vec4(value, 0.0); + u_debugPrintData.type = GLSL_TYPE_VECTOR3; +} + +void print(vec4 value) { + u_debugPrintData.value[0] = value; + u_debugPrintData.type = GLSL_TYPE_VECTOR4; +} + +void print(mat4 value) { + u_debugPrintData.value = value; + u_debugPrintData.type = GLSL_TYPE_MAT4; +} + +void print(ivec2 value) { + u_debugPrintData.value[0] = vec4(value, 0.0, 0.0); + u_debugPrintData.type = GLSL_TYPE_VECTOR2I; +} + +void print(ivec3 value) { + u_debugPrintData.value[0] = vec4(value, 0.0); + u_debugPrintData.type = GLSL_TYPE_VECTOR3I; +} + +void print(ivec4 value) { + u_debugPrintData.value[0] = vec4(value); + u_debugPrintData.type = GLSL_TYPE_VECTOR4I; +} + +#endif diff --git a/assets/shaders/lighting/fs_lighting_spot.glsl b/assets/shaders/lighting/fs_lighting_spot.glsl index ee7dd260f..3a0c26076 100644 --- a/assets/shaders/lighting/fs_lighting_spot.glsl +++ b/assets/shaders/lighting/fs_lighting_spot.glsl @@ -7,7 +7,8 @@ float get_spot_light_shadow_sample(uint lightIdx, bool dynamic, vec3 fragPosWs) { LightSourceData light = get_light_source(lightIdx); - + if(light.shadowIndex == 0) + return 1.0; vec4 depthCoord = get_light_vertex_position(lightIdx); depthCoord.z *= light.position.w; // Undo transformation from get_light_vertex_position() depthCoord = depthCoord / light.position.w; @@ -22,6 +23,8 @@ float get_spot_light_shadow_sample(uint lightIdx, bool dynamic, vec3 fragPosWs) float get_spot_light_shadow_factor(uint lightIdx, bool dynamic) { LightSourceData light = get_light_source(lightIdx); + if(light.shadowIndex == 0) + return 1.0; vec4 depthCoord = get_light_vertex_position(lightIdx); depthCoord.z *= light.position.w; // Undo transformation from get_light_vertex_position() depthCoord = depthCoord / light.position.w; diff --git a/build_scripts/scripts/external_libs.py b/build_scripts/scripts/external_libs.py index 05fee5e6c..364d238f7 100644 --- a/build_scripts/scripts/external_libs.py +++ b/build_scripts/scripts/external_libs.py @@ -16,7 +16,7 @@ get_submodule("mathutil","https://github.com/Silverlan/mathutil.git","e872f599805cf696ff6a84a4253fc44ae8e83a15") get_submodule("networkmanager","https://github.com/Silverlan/networkmanager.git","981bc5809c1a768267ddace778205e1be0262730") get_submodule("panima","https://github.com/Silverlan/panima.git","06916dd30cde319f31b1eee25cfed7dea8f14630") -get_submodule("prosper","https://github.com/Silverlan/prosper.git","d39a127688792194d8075ad85dd7b4312b49ff11") +get_submodule("prosper","https://github.com/Silverlan/prosper.git","a9b568c360fc06d8159215e3f0dd84f595d1fbce") get_submodule("sharedutils","https://github.com/Silverlan/sharedutils.git","65031009e7f85722f243a493ad47e03ca10617fe") get_submodule("util_bsp","https://github.com/Silverlan/util_bsp.git","2d912cceaaa59199a86431aa9d194e922b2ebea4") get_submodule("util_formatted_text","https://github.com/Silverlan/util_formatted_text.git","c473a2bdc1ad84ef52d391226d6983ef3076958e") diff --git a/core/client/include/pragma/game/c_game.h b/core/client/include/pragma/game/c_game.h index 960a31bf7..23819c9fb 100644 --- a/core/client/include/pragma/game/c_game.h +++ b/core/client/include/pragma/game/c_game.h @@ -78,6 +78,7 @@ namespace pragma { class RenderQueueBuilder; class RenderQueueWorkerManager; struct GameWorldShaderSettings; + struct GlobalRenderSettingsBufferData; }; class LuaShaderManager; class LuaParticleModifierManager; @@ -110,14 +111,6 @@ namespace pragma::string { #pragma warning(push) #pragma warning(disable : 4251) class DLLCLIENT CGame : public Game { - public: - struct GlobalRenderSettingsBufferData { - GlobalRenderSettingsBufferData(); - std::shared_ptr debugBuffer = nullptr; - std::shared_ptr timeBuffer = nullptr; - std::shared_ptr csmBuffer = nullptr; - std::shared_ptr descSetGroup = nullptr; - }; public: CGame(NetworkState *state); virtual ~CGame() override; @@ -407,7 +400,7 @@ class DLLCLIENT CGame : public Game { pragma::rendering::RenderQueueBuilder &GetRenderQueueBuilder(); pragma::rendering::RenderQueueWorkerManager &GetRenderQueueWorkerManager(); prosper::IDescriptorSet &GetGlobalRenderSettingsDescriptorSet(); - GlobalRenderSettingsBufferData &GetGlobalRenderSettingsBufferData(); + pragma::rendering::GlobalRenderSettingsBufferData &GetGlobalRenderSettingsBufferData(); void ReloadGameWorldShaderPipelines() const; void ReloadPrepassShaderPipelines() const; void OnGameWorldShaderSettingsChanged(const pragma::rendering::GameWorldShaderSettings &newSettings, const pragma::rendering::GameWorldShaderSettings &oldSettings); @@ -504,7 +497,7 @@ class DLLCLIENT CGame : public Game { StateFlags m_stateFlags = StateFlags::None; void RenderScenePresent(std::shared_ptr &drawCmd, prosper::Texture &texPostHdr, prosper::IImage *optOutImage, uint32_t layerId = 0u); - std::unique_ptr m_globalRenderSettingsBufferData = nullptr; + std::unique_ptr m_globalRenderSettingsBufferData; // Scene util::TWeakSharedHandle m_scene = util::TWeakSharedHandle {}; diff --git a/core/client/include/pragma/rendering/global_render_settings_buffer_data.hpp b/core/client/include/pragma/rendering/global_render_settings_buffer_data.hpp new file mode 100644 index 000000000..dd7c1fd9c --- /dev/null +++ b/core/client/include/pragma/rendering/global_render_settings_buffer_data.hpp @@ -0,0 +1,99 @@ +/* This Source Code Form is subject to the terms of the Mozilla Public + * License, v. 2.0. If a copy of the MPL was not distributed with this + * file, You can obtain one at http://mozilla.org/MPL/2.0/. + * + * Copyright (c) 2024 Silverlan + */ + +#ifndef __PRAGMA_GLOBAL_RENDER_SETTINGS_BUFFER_DATA_HPP__ +#define __PRAGMA_GLOBAL_RENDER_SETTINGS_BUFFER_DATA_HPP__ + +#include +#include +#include +#include + +// #define PRAGMA_ENABLE_SHADER_DEBUG_PRINT + +namespace pragma::rendering { + // These have to match the enums in shaders/debug/debug_print.glsl + enum class GlslType : uint32_t { + Int32 = 0, + UInt32, + + Float, + Boolean, + + Vector2, + Vector3, + Vector4, + Mat4, + + Vector2i, + Vector3i, + Vector4i, + + NotSet, + + Count, + Last = Count - 1, + Invalid = std::numeric_limits::max() + }; + constexpr udm::Type glsl_type_to_udm(GlslType type) + { + switch(type) { + case GlslType::Int32: + return udm::Type::Int32; + case GlslType::UInt32: + return udm::Type::UInt32; + case GlslType::Float: + return udm::Type::Float; + case GlslType::Boolean: + return udm::Type::Boolean; + case GlslType::Vector2: + return udm::Type::Vector2; + case GlslType::Vector3: + return udm::Type::Vector3; + case GlslType::Vector4: + return udm::Type::Vector4; + case GlslType::Mat4: + return udm::Type::Mat4; + case GlslType::Vector2i: + return udm::Type::Vector2i; + case GlslType::Vector3i: + return udm::Type::Vector3i; + case GlslType::Vector4i: + return udm::Type::Vector4i; + default: + return udm::Type::Invalid; + } + } + + template + concept is_glsl_type = std::is_same_v || std::is_same_v || std::is_same_v || std::is_same_v || std::is_same_v || std::is_same_v || std::is_same_v || std::is_same_v || std::is_same_v + || std::is_same_v || std::is_same_v; + struct GlobalRenderSettingsBufferData { +#ifdef PRAGMA_ENABLE_SHADER_DEBUG_PRINT +#pragma pack(push, 1) + struct DebugPrintData { + uint8_t data[sizeof(Mat4)]; + GlslType type = GlslType::NotSet; + }; +#pragma pack(pop) +#endif + + GlobalRenderSettingsBufferData(); + std::shared_ptr debugBuffer = nullptr; + std::shared_ptr timeBuffer = nullptr; + std::shared_ptr csmBuffer = nullptr; +#ifdef PRAGMA_ENABLE_SHADER_DEBUG_PRINT + std::shared_ptr debugPrintBuffer = nullptr; + void EvaluateDebugPrint(); + std::optional GetDebugPrintString() const; + void ResetDebugPrintData(); +#endif + std::shared_ptr descSetGroup = nullptr; + }; +}; + +#endif diff --git a/core/client/include/pragma/rendering/shaders/world/c_shader_scene.hpp b/core/client/include/pragma/rendering/shaders/world/c_shader_scene.hpp index ecdc864b3..80ed8b456 100644 --- a/core/client/include/pragma/rendering/shaders/world/c_shader_scene.hpp +++ b/core/client/include/pragma/rendering/shaders/world/c_shader_scene.hpp @@ -63,6 +63,9 @@ namespace pragma { Time, CSMData, GlobalInstance, +// #ifdef PRAGMA_ENABLE_SHADER_DEBUG_PRINT + DebugPrint, +// #endif }; enum class DebugFlags : uint32_t { @@ -89,6 +92,7 @@ namespace pragma { virtual uint32_t GetRenderSettingsDescriptorSetIndex() const = 0; virtual uint32_t GetCameraDescriptorSetIndex() const = 0; virtual uint32_t GetRendererDescriptorSetIndex() const { return std::numeric_limits::max(); } + virtual std::optional GetGlslPrefixCode(prosper::ShaderStage stage) const override; protected: ShaderScene(prosper::IPrContext &context, const std::string &identifier, const std::string &vsShader, const std::string &fsShader, const std::string &gsShader = ""); prosper::SampleCountFlags GetSampleCount(uint32_t pipelineIdx) const; diff --git a/core/client/src/entities/components/renderers/rasterization/lighting_pass.cpp b/core/client/src/entities/components/renderers/rasterization/lighting_pass.cpp index 6ed732ac1..8d4092b9e 100644 --- a/core/client/src/entities/components/renderers/rasterization/lighting_pass.cpp +++ b/core/client/src/entities/components/renderers/rasterization/lighting_pass.cpp @@ -13,6 +13,7 @@ #include "pragma/rendering/shaders/world/c_shader_prepass.hpp" #include "pragma/rendering/shaders/info/c_shader_velocity_buffer.hpp" #include "pragma/rendering/c_renderflags.h" +#include "pragma/rendering/global_render_settings_buffer_data.hpp" #include "pragma/entities/environment/effects/c_env_particle_system.h" #include "pragma/entities/components/c_render_component.hpp" #include "pragma/entities/components/c_animated_component.hpp" diff --git a/core/client/src/entities/environment/lights/c_env_shadow_csm.cpp b/core/client/src/entities/environment/lights/c_env_shadow_csm.cpp index 346f919bd..f2bdf16fd 100644 --- a/core/client/src/entities/environment/lights/c_env_shadow_csm.cpp +++ b/core/client/src/entities/environment/lights/c_env_shadow_csm.cpp @@ -16,6 +16,7 @@ #include "pragma/model/c_modelmesh.h" #include "pragma/rendering/shaders/c_shader_shadow.hpp" #include "pragma/rendering/shaders/world/c_shader_textured.hpp" +#include "pragma/rendering/global_render_settings_buffer_data.hpp" #include "pragma/lua/c_lentity_handles.hpp" #include #include diff --git a/core/client/src/game/c_game.cpp b/core/client/src/game/c_game.cpp index 4e480e9b7..20ec87c45 100644 --- a/core/client/src/game/c_game.cpp +++ b/core/client/src/game/c_game.cpp @@ -57,6 +57,7 @@ #include "pragma/rendering/renderers/rasterization_renderer.hpp" #include "pragma/rendering/renderers/raytracing_renderer.hpp" #include "pragma/rendering/render_queue_worker.hpp" +#include "pragma/rendering/global_render_settings_buffer_data.hpp" #include "pragma/ai/c_navsystem.h" #include #include @@ -660,7 +661,7 @@ void CGame::InitializeGame() // Called by NET_cl_resourcecomplete c_engine->GetRenderContext().GetPipelineLoader().Flush(); c_engine->GetRenderContext().SavePipelineCache(); - m_globalRenderSettingsBufferData = std::make_unique(); + m_globalRenderSettingsBufferData = std::make_unique(); auto *scene = pragma::CSceneComponent::Create(pragma::CSceneComponent::CreateInfo {}); if(scene) { scene->GetEntity().SetName("scene_game"); diff --git a/core/client/src/game/c_game_global_render_settings_buffer_data.cpp b/core/client/src/game/c_game_global_render_settings_buffer_data.cpp index db801dfc4..76289420a 100644 --- a/core/client/src/game/c_game_global_render_settings_buffer_data.cpp +++ b/core/client/src/game/c_game_global_render_settings_buffer_data.cpp @@ -8,6 +8,7 @@ #include "stdafx_client.h" #include "pragma/game/c_game.h" #include "pragma/rendering/shaders/world/c_shader_textured.hpp" +#include "pragma/rendering/global_render_settings_buffer_data.hpp" #include "pragma/entities/components/c_render_component.hpp" #include #include @@ -17,9 +18,9 @@ extern DLLCLIENT CEngine *c_engine; prosper::IDescriptorSet &CGame::GetGlobalRenderSettingsDescriptorSet() { return *m_globalRenderSettingsBufferData->descSetGroup->GetDescriptorSet(); } -CGame::GlobalRenderSettingsBufferData &CGame::GetGlobalRenderSettingsBufferData() { return *m_globalRenderSettingsBufferData; } +pragma::rendering::GlobalRenderSettingsBufferData &CGame::GetGlobalRenderSettingsBufferData() { return *m_globalRenderSettingsBufferData; } -CGame::GlobalRenderSettingsBufferData::GlobalRenderSettingsBufferData() +pragma::rendering::GlobalRenderSettingsBufferData::GlobalRenderSettingsBufferData() { pragma::ShaderGameWorldLightingPass::DebugData debugData {0}; prosper::util::BufferCreateInfo createInfo {}; @@ -53,4 +54,96 @@ CGame::GlobalRenderSettingsBufferData::GlobalRenderSettingsBufferData() descSet.SetBindingUniformBuffer(*csmBuffer, umath::to_integral(pragma::ShaderScene::RenderSettingsBinding::CSMData)); auto &entInstanceBuffer = *pragma::CRenderComponent::GetInstanceBuffer(); descSet.SetBindingStorageBuffer(entInstanceBuffer, umath::to_integral(pragma::ShaderScene::RenderSettingsBinding::GlobalInstance)); + +#ifdef PRAGMA_ENABLE_SHADER_DEBUG_PRINT + { + struct DebugPrintData { + Mat4 value; + uint32_t type; + }; + DebugPrintData initialDebugPrintData {}; + prosper::util::BufferCreateInfo createInfo {}; + createInfo.usageFlags = prosper::BufferUsageFlags::StorageBufferBit | prosper::BufferUsageFlags::TransferSrcBit | prosper::BufferUsageFlags::TransferDstBit; + createInfo.size = sizeof(DebugPrintData); + createInfo.memoryFeatures = prosper::MemoryFeatureFlags::GPUToCPU; + createInfo.flags = prosper::util::BufferCreateInfo::Flags::Persistent; + debugPrintBuffer = c_engine->GetRenderContext().CreateBuffer(createInfo, &initialDebugPrintData); + debugPrintBuffer->SetDebugName("render_settings_debug_print_buf"); + debugPrintBuffer->SetPermanentlyMapped(true, prosper::IBuffer::MapFlags::ReadBit); + descSet.SetBindingStorageBuffer(*debugPrintBuffer, umath::to_integral(pragma::ShaderScene::RenderSettingsBinding::DebugPrint)); + } +#endif +} + +#ifdef PRAGMA_ENABLE_SHADER_DEBUG_PRINT +void pragma::rendering::GlobalRenderSettingsBufferData::EvaluateDebugPrint() +{ + // Note: The debug string buffer is *not* procted for concurrent read + // or write access and should only be used for debugging purposes! + auto debugPrintStr = GetDebugPrintString(); + if(debugPrintStr.has_value()) { + Con::cout << "Shader Debug Print: " << *debugPrintStr << Con::endl; + ResetDebugPrintData(); + } +} +void pragma::rendering::GlobalRenderSettingsBufferData::ResetDebugPrintData() +{ + DebugPrintData data {}; + debugPrintBuffer->Write(0, data); +} +std::optional pragma::rendering::GlobalRenderSettingsBufferData::GetDebugPrintString() const +{ + DebugPrintData data {}; + if(!debugPrintBuffer->Read(0, data)) + return "No data."; + if(data.type == GlslType::NotSet) + return {}; + if(umath::to_integral(data.type) >= umath::to_integral(GlslType::Count)) + return "Invalid type."; + return udm::visit(glsl_type_to_udm(data.type), [&data](auto tag) -> std::string { + using T = typename decltype(tag)::type; + if constexpr(is_glsl_type) { + T val; + auto *fdata = reinterpret_cast(&data.data[0]); + if constexpr(std::is_same_v) + val = fdata[0]; + else if constexpr(std::is_same_v) + val = (fdata[0] > 0.5f) ? true : false; + else if constexpr(std::is_same_v) + val = static_cast(fdata[0]); + else if constexpr(std::is_same_v) + val = static_cast(fdata[0]); + else if constexpr(std::is_same_v) + val = *reinterpret_cast(&fdata[0]); + else if constexpr(std::is_same_v) + val = *reinterpret_cast(&fdata[0]); + else if constexpr(std::is_same_v) + val = *reinterpret_cast(&fdata[0]); + else if constexpr(std::is_same_v) + val = *reinterpret_cast(&fdata[0]); + else if constexpr(std::is_same_v) { + Vector4i vec; + for(auto i = 0u; i < 4; ++i) + vec[i] = static_cast(fdata[i]); + val = vec; + } + else if constexpr(std::is_same_v) { + Vector3i vec; + for(auto i = 0u; i < 3; ++i) + vec[i] = static_cast(fdata[i]); + val = vec; + } + else if constexpr(std::is_same_v) { + Vector2i vec; + for(auto i = 0u; i < 2; ++i) + vec[i] = static_cast(fdata[i]); + val = vec; + } + auto str = udm::convert(val); + return str; + } + // Unreachable + return "Invalid type."; + }); } +#endif diff --git a/core/client/src/lua/libraries/c_lgame.cpp b/core/client/src/lua/libraries/c_lgame.cpp index 9f147eac3..53ea3a880 100644 --- a/core/client/src/lua/libraries/c_lgame.cpp +++ b/core/client/src/lua/libraries/c_lgame.cpp @@ -17,6 +17,7 @@ #include "pragma/rendering/renderers/rasterization_renderer.hpp" #include "pragma/rendering/render_queue.hpp" #include "pragma/rendering/shaders/world/c_shader_scene.hpp" +#include "pragma/rendering/global_render_settings_buffer_data.hpp" #include "pragma/debug/debug_render_filter.hpp" #include "pragma/entities/environment/c_env_reflection_probe.hpp" #include "pragma/entities/environment/c_env_camera.h" diff --git a/core/client/src/rendering/c_render.cpp b/core/client/src/rendering/c_render.cpp index 49736fb38..8bb2d67cc 100644 --- a/core/client/src/rendering/c_render.cpp +++ b/core/client/src/rendering/c_render.cpp @@ -31,6 +31,7 @@ #include "pragma/rendering/rendersystem.h" #include "pragma/rendering/render_queue.hpp" #include "pragma/rendering/scene/util_draw_scene_info.hpp" +#include "pragma/rendering/global_render_settings_buffer_data.hpp" #include "pragma/entities/baseentity.h" #include "pragma/entities/components/renderers/c_renderer_component.hpp" #include "pragma/entities/components/renderers/c_rasterization_renderer_component.hpp" @@ -345,6 +346,10 @@ static CVar cvClearSceneColor = GetClientConVar("render_clear_scene_color"); static CVar cvParticleQuality = GetClientConVar("cl_render_particle_quality"); void CGame::RenderScenes(util::DrawSceneInfo &drawSceneInfo) { +#ifdef PRAGMA_ENABLE_SHADER_DEBUG_PRINT + GetGlobalRenderSettingsBufferData().EvaluateDebugPrint(); +#endif + StartProfilingStage("RenderScenes"); util::ScopeGuard sg {[this]() { StopProfilingStage(); // RenderScenes diff --git a/core/client/src/rendering/shaders/c_shaders.cpp b/core/client/src/rendering/shaders/c_shaders.cpp index cb8803ead..cb59bf154 100644 --- a/core/client/src/rendering/shaders/c_shaders.cpp +++ b/core/client/src/rendering/shaders/c_shaders.cpp @@ -66,6 +66,7 @@ #include "pragma/rendering/shaders/util/c_shader_compose_rma.hpp" #include "pragma/rendering/shaders/util/c_shader_combine_image_channels.hpp" #include "pragma/rendering/shaders/util/c_shader_specular_glossiness_to_metalness_roughness.hpp" +#include "pragma/rendering/global_render_settings_buffer_data.hpp" #include #include "pragma/console/c_cvar.h" #include "pragma/rendering/world_environment.hpp" diff --git a/core/client/src/rendering/shaders/world/c_shader_scene.cpp b/core/client/src/rendering/shaders/world/c_shader_scene.cpp index cb55c326b..282f77669 100644 --- a/core/client/src/rendering/shaders/world/c_shader_scene.cpp +++ b/core/client/src/rendering/shaders/world/c_shader_scene.cpp @@ -10,6 +10,7 @@ #include "pragma/rendering/renderers/rasterization_renderer.hpp" #include "pragma/rendering/lighting/c_light_data_buffer_manager.hpp" #include "pragma/rendering/render_processor.hpp" +#include "pragma/rendering/global_render_settings_buffer_data.hpp" #include "pragma/entities/entity_instance_index_buffer.hpp" #include "pragma/entities/environment/lights/c_env_shadow.hpp" #include "pragma/entities/components/renderers/c_renderer_component.hpp" @@ -31,13 +32,16 @@ extern DLLCLIENT CEngine *c_engine; using namespace pragma; -decltype(ShaderScene::DESCRIPTOR_SET_RENDER_SETTINGS) ShaderScene::DESCRIPTOR_SET_RENDER_SETTINGS = { - "RENDER_SETTINGS", - {prosper::DescriptorSetInfo::Binding {"DEBUG", prosper::DescriptorType::UniformBuffer, prosper::ShaderStageFlags::FragmentBit}, +decltype(ShaderScene::DESCRIPTOR_SET_RENDER_SETTINGS) ShaderScene::DESCRIPTOR_SET_RENDER_SETTINGS = {"RENDER_SETTINGS", + { + prosper::DescriptorSetInfo::Binding {"DEBUG", prosper::DescriptorType::UniformBuffer, prosper::ShaderStageFlags::FragmentBit}, prosper::DescriptorSetInfo::Binding {"TIME", prosper::DescriptorType::UniformBuffer, prosper::ShaderStageFlags::FragmentBit | prosper::ShaderStageFlags::VertexBit}, prosper::DescriptorSetInfo::Binding {"CSM_DATA", prosper::DescriptorType::UniformBuffer, prosper::ShaderStageFlags::FragmentBit}, - prosper::DescriptorSetInfo::Binding {"GLOBAL_ENTITY_INSTANCE_DATA", prosper::DescriptorType::StorageBuffer, prosper::ShaderStageFlags::FragmentBit | prosper::ShaderStageFlags::VertexBit}}, -}; + prosper::DescriptorSetInfo::Binding {"GLOBAL_ENTITY_INSTANCE_DATA", prosper::DescriptorType::StorageBuffer, prosper::ShaderStageFlags::FragmentBit | prosper::ShaderStageFlags::VertexBit}, +#ifdef PRAGMA_ENABLE_SHADER_DEBUG_PRINT + prosper::DescriptorSetInfo::Binding {"DEBUG_PRINT", prosper::DescriptorType::StorageBuffer, prosper::ShaderStageFlags::FragmentBit | prosper::ShaderStageFlags::VertexBit}, +#endif + }}; decltype(ShaderScene::DESCRIPTOR_SET_SCENE) ShaderScene::DESCRIPTOR_SET_SCENE = { "SCENE", {prosper::DescriptorSetInfo::Binding {"CAMERA", prosper::DescriptorType::UniformBuffer, prosper::ShaderStageFlags::FragmentBit | prosper::ShaderStageFlags::VertexBit | prosper::ShaderStageFlags::GeometryBit}, @@ -61,6 +65,14 @@ ShaderScene::ShaderScene(prosper::IPrContext &context, const std::string &identi { //SetPipelineCount(umath::to_integral(Pipeline::Count)); } +std::optional ShaderScene::GetGlslPrefixCode(prosper::ShaderStage stage) const +{ +#ifdef PRAGMA_ENABLE_SHADER_DEBUG_PRINT + if(stage == prosper::ShaderStage::Fragment || stage == prosper::ShaderStage::Vertex) + return "#include \"/debug/debug_print.glsl\"\n"; +#endif + return Shader3DBase::GetGlslPrefixCode(stage); +} bool ShaderScene::ShouldInitializePipeline(uint32_t pipelineIdx) { //if(static_cast(pipelineIdx) != Pipeline::MultiSample) diff --git a/core/shared/src/console/sh_convars.cpp b/core/shared/src/console/sh_convars.cpp index 293b1735e..9ca5906d8 100644 --- a/core/shared/src/console/sh_convars.cpp +++ b/core/shared/src/console/sh_convars.cpp @@ -48,7 +48,7 @@ REGISTER_ENGINE_CONCOMMAND( }, ConVarFlags::None, "Deletes all cache files."); REGISTER_ENGINE_CONVAR(cache_version, udm::Type::String, "", ConVarFlags::Archive, "The engine version that the cache files are associated with. If this version doesn't match the current engine version, the cache will be cleared."); -REGISTER_ENGINE_CONVAR(cache_version_target, udm::Type::UInt32, "16", ConVarFlags::None, "If cache_version does not match this value, the cache files will be cleared and it will be set to it."); +REGISTER_ENGINE_CONVAR(cache_version_target, udm::Type::UInt32, "17", ConVarFlags::None, "If cache_version does not match this value, the cache files will be cleared and it will be set to it."); REGISTER_ENGINE_CONVAR(debug_profiling_enabled, udm::Type::Boolean, "0", ConVarFlags::None, "Enables profiling timers."); REGISTER_ENGINE_CONVAR(debug_disable_animation_updates, udm::Type::Boolean, "0", ConVarFlags::None, "Disables animation updates."); REGISTER_ENGINE_CONVAR(sh_mount_external_game_resources, udm::Type::Boolean, "1", ConVarFlags::Archive, "If set to 1, the game will attempt to load missing resources from external games.");