Skip to content

Rendering improvements #90

New issue

Have a question about this project? Sign up for a free GitHub account to open an issue and contact its maintainers and the community.

By clicking “Sign up for GitHub”, you agree to our terms of service and privacy statement. We’ll occasionally send you account related emails.

Already on GitHub? Sign in to your account

Open
wants to merge 42 commits into
base: 0.8
Choose a base branch
from
Open
Show file tree
Hide file tree
Changes from all commits
Commits
Show all changes
42 commits
Select commit Hold shift + click to select a range
f7f767c
enable manual setup of box frame mesh
lshoek Feb 6, 2025
de54cd6
update additive blend mode to multiply alpha
lshoek Feb 10, 2025
1af20eb
update shader constants after material instance init
lshoek May 14, 2024
f2fd31a
fix shader constant in material instance update
lshoek Feb 11, 2025
9599d7d
enable vulkan multi draw indirect feature
lshoek Feb 11, 2025
6264c8d
Merge branch 'flexible_bindings' into deltax
lshoek Feb 12, 2025
baf94d9
Merge branch 'flexible_bindings' into deltax
lshoek Feb 14, 2025
ae5d125
Merge branch 'flexible_bindings' into deltax
lshoek Feb 15, 2025
6ee6b41
implement multisample depth consume render passes
lshoek Feb 18, 2025
8dd2c7e
Merge branch 'flexible_bindings' into msaadepth
lshoek Feb 18, 2025
ec95f5d
favor designated initializers in renderutils and renderpass - refactor
lshoek Feb 18, 2025
f8ffc6c
restore rendertarget color only - mv depthrendertarget to advanced - …
lshoek Feb 18, 2025
dc57115
add clear depth value - refactor initializers in snapshotrendertarget
lshoek Feb 18, 2025
88bf932
remove unused fill property
lshoek Feb 18, 2025
82c7a0a
Merge branch '0.8' into msaadepth
lshoek Feb 19, 2025
c248ba7
restore render target attachments to 3
lshoek Feb 20, 2025
fd3560e
set depth render target clear values
lshoek Feb 24, 2025
58d65a5
favor empty over size check in flock demo
lshoek Feb 24, 2025
c2b34f1
report sdl error if dummy window creation fails
lshoek Feb 24, 2025
aebe566
index boxframemesh more efficiently
lshoek Feb 25, 2025
fe465f8
restore box frame mesh cull mode
lshoek Feb 25, 2025
4790b2d
fix material instance shader constant hashing
lshoek Apr 6, 2025
0fbf6e2
Merge branch '0.8' into msaadepth
lshoek Apr 6, 2025
6e13970
Merge branch 'fix_constanthash' into msaadepth
lshoek Apr 6, 2025
7060f73
use fixed constant hashing in updateconstants function
lshoek Apr 6, 2025
d6d4415
fix typo
lshoek Apr 6, 2025
51229ca
Merge branch 'fix_constanthash' into msaadepth
lshoek Apr 6, 2025
3aecce3
drop designated initializers for cpp17 compatibility
lshoek Mar 21, 2025
23a4d61
merge fix
lshoek Apr 6, 2025
45a8bd7
remove vulkan version check on renderadvancedservice
lshoek Apr 6, 2025
732ce1c
remove project-specific updateconstants function
lshoek Apr 6, 2025
63b26fd
comment multidrawindirect device feature
lshoek Apr 6, 2025
442a6e5
minor refactoring
lshoek Apr 6, 2025
a1255b1
support and select vulkan version 1.2 by default
lshoek Apr 6, 2025
701bc67
add comment to render service
lshoek Apr 6, 2025
10ddc8c
register getorcreatematerial and draw for texture and bloom renderers
lshoek Mar 8, 2025
27d560f
Revert "register getorcreatematerial and draw for texture and bloom r…
lshoek Apr 6, 2025
148e6c1
fix dynamicwrite buffer clear
lshoek Mar 10, 2025
a9c8e47
remove uvec4 buffer bindings in absence of a uvec4 buffer
lshoek Apr 6, 2025
dec1e87
update fft demo dof component to use color depth rendertarget
lshoek Apr 6, 2025
b9c4d93
fix dynamicwrite buffers missing update in mtl instance after upload
lshoek Apr 6, 2025
d44c9aa
favor auto keyword in materialinstance
lshoek Apr 6, 2025
File filter

Filter by extension

Filter by extension

Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
2 changes: 1 addition & 1 deletion demos/audiovisualfft/data/objects.json
Original file line number Diff line number Diff line change
Expand Up @@ -1237,7 +1237,7 @@
"Children": []
},
{
"Type": "nap::RenderTarget",
"Type": "nap::ColorDepthRenderTarget",
"mID": "RenderTarget",
"ColorTexture": "ColorTexture",
"DepthTexture": "DepthTexture",
Expand Down
7 changes: 0 additions & 7 deletions demos/audiovisualfft/module/src/renderdofcomponent.cpp
Original file line number Diff line number Diff line change
Expand Up @@ -9,14 +9,11 @@
#include "gpubuffer.h"
#include "renderglobals.h"
#include "uniforminstance.h"
#include "renderglobals.h"
#include "dofshader.h"
#include "textureutils.h"

// External Includes
#include <entity.h>
#include <glm/gtc/matrix_transform.hpp>
#include <entity.h>
#include <nap/core.h>
#include <orthocameracomponent.h>

Expand Down Expand Up @@ -62,10 +59,6 @@ namespace nap
if (!errorState.check(mResource->mInputTarget != nullptr, "InputTarget not set"))
return false;

// Verify the render target has a depth texture resource
if (!errorState.check(mResource->mInputTarget->hasDepthTexture(), "The specified InputTarget has no depth texture resource"))
return false;

// Get render service
mRenderService = getEntityInstance()->getCore()->getService<RenderService>();

Expand Down
3 changes: 2 additions & 1 deletion demos/audiovisualfft/module/src/renderdofcomponent.h
Original file line number Diff line number Diff line change
Expand Up @@ -6,6 +6,7 @@

// External Includes
#include <rendercomponent.h>
#include <colordepthrendertarget.h>
#include <componentptr.h>
#include <perspcameracomponent.h>
#include <materialinstance.h>
Expand All @@ -31,7 +32,7 @@ namespace nap
DECLARE_COMPONENT(RenderDOFComponent, RenderDOFComponentInstance)
public:
ComponentPtr<PerspCameraComponent> mCamera; ///< Property: 'Camera'
ResourcePtr<RenderTarget> mInputTarget; ///< Property: 'InputTarget' the input color target, must be copyable
ResourcePtr<ColorDepthRenderTarget> mInputTarget; ///< Property: 'InputTarget' the input color depth target, must be copyable
ResourcePtr<RenderTexture2D> mOutputTexture; ///< Property: 'OutputTexture' the output color texture

ResourcePtr<ParameterFloat> mAperture;
Expand Down
2 changes: 1 addition & 1 deletion demos/computeflocking/module/src/selectmeshcomponent.cpp
Original file line number Diff line number Diff line change
Expand Up @@ -53,7 +53,7 @@ namespace nap
}

// Make sure we have some meshes
if (!errorState.check(mMeshes.size() > 0, "No mesh files to select"))
if (!errorState.check(!mMeshes.empty(), "No mesh files to select"))
return false;

// Select the mesh to display based on resource index
Expand Down
4 changes: 0 additions & 4 deletions system_modules/naprender/src/bufferbinding.cpp
Original file line number Diff line number Diff line change
Expand Up @@ -43,10 +43,6 @@ RTTI_BEGIN_CLASS(nap::BufferBindingIVec4, "Vector (ivec4) shader buffer binding"
RTTI_PROPERTY("Buffer", &nap::BufferBindingIVec4::mBuffer, nap::rtti::EPropertyMetaData::Required, "IVec4 data to bind")
RTTI_END_CLASS

RTTI_BEGIN_CLASS(nap::BufferBindingUVec4, "Vector (uvec4) shader buffer binding")
RTTI_PROPERTY("Buffer", &nap::BufferBindingUVec4::mBuffer, nap::rtti::EPropertyMetaData::Required, "UVec4 data to bind")
RTTI_END_CLASS

RTTI_BEGIN_CLASS(nap::BufferBindingMat4, "Matrix (4x4) shader buffer binding")
RTTI_PROPERTY("Buffer", &nap::BufferBindingMat4::mBuffer, nap::rtti::EPropertyMetaData::Required, "Mat4 data to bind")
RTTI_END_CLASS
Expand Down
1 change: 0 additions & 1 deletion system_modules/naprender/src/bufferbinding.h
Original file line number Diff line number Diff line change
Expand Up @@ -183,7 +183,6 @@ namespace nap
using BufferBindingVec3 = TypedBufferBindingNumeric<glm::vec3>;
using BufferBindingVec4 = TypedBufferBindingNumeric<glm::vec4>;
using BufferBindingIVec4 = TypedBufferBindingNumeric<glm::ivec4>;
using BufferBindingUVec4 = TypedBufferBindingNumeric<glm::uvec4>;
using BufferBindingMat4 = TypedBufferBindingNumeric<glm::mat4>;


Expand Down
29 changes: 14 additions & 15 deletions system_modules/naprender/src/bufferbindinginstance.cpp
Original file line number Diff line number Diff line change
Expand Up @@ -39,10 +39,6 @@ RTTI_BEGIN_CLASS_NO_DEFAULT_CONSTRUCTOR(nap::BufferBindingIVec4Instance)
RTTI_CONSTRUCTOR(const std::string&, const nap::ShaderVariableValueArrayDeclaration&, const nap::BufferBindingChangedCallback&)
RTTI_END_CLASS

RTTI_BEGIN_CLASS_NO_DEFAULT_CONSTRUCTOR(nap::BufferBindingUVec4Instance)
RTTI_CONSTRUCTOR(const std::string&, const nap::ShaderVariableValueArrayDeclaration&, const nap::BufferBindingChangedCallback&)
RTTI_END_CLASS

RTTI_BEGIN_CLASS_NO_DEFAULT_CONSTRUCTOR(nap::BufferBindingMat4Instance)
RTTI_CONSTRUCTOR(const std::string&, const nap::ShaderVariableValueArrayDeclaration&, const nap::BufferBindingChangedCallback&)
RTTI_END_CLASS
Expand Down Expand Up @@ -177,11 +173,6 @@ namespace nap
return createBufferBindingInstance<BufferBindingIVec4Instance, BufferBindingIVec4, ShaderVariableValueArrayDeclaration>(
binding_name, *value_array_declaration, binding, bufferChangedCallback, errorState);
}
else if (value_array_declaration->mElementType == EShaderVariableValueType::UVec4)
{
return createBufferBindingInstance<BufferBindingUVec4Instance, BufferBindingUVec4, ShaderVariableValueArrayDeclaration>(
binding_name, *value_array_declaration, binding, bufferChangedCallback, errorState);
}
else if (value_array_declaration->mElementType == EShaderVariableValueType::Mat4)
{
return createBufferBindingInstance<BufferBindingMat4Instance, BufferBindingMat4, ShaderVariableValueArrayDeclaration>(
Expand All @@ -194,31 +185,39 @@ namespace nap
// values or structs are declared inside a storage buffer block. Notify the user and return false.
else if (declaration_type == RTTI_OF(ShaderVariableStructDeclaration) || declaration_type == RTTI_OF(ShaderVariableValueDeclaration))
{
NAP_ASSERT_MSG(false, "Individual values (or structs) not supported for buffer bindings.");
NAP_ASSERT_MSG(false, "Individual values (or structs) not supported for buffer bindings.")
}
else if (declaration_type == RTTI_OF(ShaderVariableStructArrayDeclaration))
{
NAP_ASSERT_MSG(false, "Declaration type 'ShaderVariableStructArrayDeclaration' is not supported for buffer bindings. Use 'ShaderVariableStructBufferDeclaration' instead.");
}

NAP_ASSERT_MSG(false, "Unsupported shader variable declaration");
NAP_ASSERT_MSG(false, "Unsupported shader variable declaration")
return nullptr;
}


void BufferBindingStructInstance::setBuffer(StructBuffer& buffer)
{
NAP_ASSERT_MSG(mDeclaration->mStride == buffer.getElementSize(), "Buffer declaration stride is not equal to buffer element size");
BufferBindingInstance::mBuffer = &buffer;
NAP_ASSERT_MSG(mDeclaration->mStride == buffer.getElementSize(), "Buffer declaration stride is not equal to buffer element size")
if (mBuffer != nullptr)
mBuffer->bufferChanged.disconnect(mBufferChangedSlot);

mBuffer = &buffer;
mBuffer->bufferChanged.connect(mBufferChangedSlot);
raiseChanged();
}


void BufferBindingStructInstance::setBuffer(const BufferBindingStruct& resource)
{
assert(resource.mBuffer != nullptr);
NAP_ASSERT_MSG(mDeclaration->mStride == resource.mBuffer->getElementSize(), "Buffer declaration stride is not equal to buffer element size");
BufferBindingInstance::mBuffer = resource.mBuffer.get();
NAP_ASSERT_MSG(mDeclaration->mStride == resource.mBuffer->getElementSize(), "Buffer declaration stride is not equal to buffer element size")
if (mBuffer != nullptr)
mBuffer->bufferChanged.disconnect(mBufferChangedSlot);

mBuffer = resource.mBuffer.get();
mBuffer->bufferChanged.connect(mBufferChangedSlot);
raiseChanged();
}
}
29 changes: 23 additions & 6 deletions system_modules/naprender/src/bufferbindinginstance.h
Original file line number Diff line number Diff line change
Expand Up @@ -228,6 +228,10 @@ namespace nap
*/
void raiseChanged() { if (mBindingChangedCallback) mBindingChangedCallback(*this); }

// To be called when dynamic buffers are updated by upload
// This requires the descriptor buffer info in the material instance to be updated
nap::Slot<> mBufferChangedSlot = { [&]() -> void { raiseChanged(); } };

const ShaderVariableStructBufferDeclaration* mDeclaration;
};

Expand Down Expand Up @@ -295,7 +299,7 @@ namespace nap
void setBuffer(TypedGPUBufferNumeric<T>& buffer);

/**
* Updates thebuffer from a resource.
* Updates the buffer from a resource.
* @param resource resource to set buffer from.
*/
void setBuffer(const TypedBufferBindingNumeric<T>& resource);
Expand All @@ -315,6 +319,10 @@ namespace nap
* Called when the buffer changes
*/
void raiseChanged() { if (mBindingChangedCallback) mBindingChangedCallback(*this); }

// To be called when dynamic buffers are updated by upload
// This requires the descriptor buffer info in the material instance to be updated
nap::Slot<> mBufferChangedSlot = { [&]() -> void { raiseChanged(); } };
};


Expand All @@ -329,7 +337,6 @@ namespace nap
using BufferBindingVec3Instance = TypedBufferBindingNumericInstance<glm::vec3>;
using BufferBindingVec4Instance = TypedBufferBindingNumericInstance<glm::vec4>;
using BufferBindingIVec4Instance = TypedBufferBindingNumericInstance<glm::ivec4>;
using BufferBindingUVec4Instance = TypedBufferBindingNumericInstance<glm::uvec4>;
using BufferBindingMat4Instance = TypedBufferBindingNumericInstance<glm::mat4>;


Expand All @@ -340,16 +347,26 @@ namespace nap
template<class T>
void TypedBufferBindingNumericInstance<T>::setBuffer(TypedGPUBufferNumeric<T>& buffer)
{
NAP_ASSERT_MSG(mDeclaration->mStride == buffer.getElementSize(), "Buffer declaration stride is not equal to buffer element size");
BufferBindingInstance::mBuffer = &buffer;
NAP_ASSERT_MSG(mDeclaration->mStride == buffer.getElementSize(), "Buffer declaration stride is not equal to buffer element size")

if (mBuffer != nullptr)
mBuffer->bufferChanged.disconnect(mBufferChangedSlot);

mBuffer = &buffer;
mBuffer->bufferChanged.connect(mBufferChangedSlot);
raiseChanged();
}

template<class T>
void TypedBufferBindingNumericInstance<T>::setBuffer(const TypedBufferBindingNumeric<T>& resource)
{
NAP_ASSERT_MSG(mDeclaration->mStride == resource.mBuffer.getElementSize(), "Buffer declaration stride is not equal to buffer element size");
BufferBindingInstance::mBuffer = resource.mBuffer.get();
NAP_ASSERT_MSG(mDeclaration->mStride == resource.mBuffer.getElementSize(), "Buffer declaration stride is not equal to buffer element size")

if (mBuffer != nullptr)
mBuffer->bufferChanged.disconnect(mBufferChangedSlot);

mBuffer = resource.mBuffer.get();
mBuffer->bufferChanged.connect(mBufferChangedSlot);
raiseChanged();
}
}
4 changes: 2 additions & 2 deletions system_modules/naprender/src/gpubuffer.cpp
Original file line number Diff line number Diff line change
Expand Up @@ -486,7 +486,7 @@ namespace nap
// The vkCmdFillBuffer/clear command is treated as a TRANSFER operation
// Clear commands are recorded to the upload command buffer and always happen at the beginning of a frame
// Therefore, no initial memory barrier is required
vkCmdFillBuffer(commandBuffer, mRenderBuffers[0].mBuffer, 0, VK_WHOLE_SIZE, 0);
vkCmdFillBuffer(commandBuffer, mRenderBuffers[mCurrentRenderBufferIndex].mBuffer, 0, VK_WHOLE_SIZE, 0);

// Determine dest access flags for memory barrier
VkBufferUsageFlags usage = getBufferUsageFlags();
Expand All @@ -502,7 +502,7 @@ namespace nap
dst_stage |= (usage & VK_BUFFER_USAGE_UNIFORM_BUFFER_BIT || usage & VK_BUFFER_USAGE_STORAGE_BUFFER_BIT) ? VK_PIPELINE_STAGE_VERTEX_SHADER_BIT : 0;

// Memory barrier
memoryBarrier(commandBuffer, mRenderBuffers[0].mBuffer, VK_ACCESS_TRANSFER_WRITE_BIT, dst_access, VK_PIPELINE_STAGE_TRANSFER_BIT, dst_stage);
memoryBarrier(commandBuffer, mRenderBuffers[mCurrentRenderBufferIndex].mBuffer, VK_ACCESS_TRANSFER_WRITE_BIT, dst_access, VK_PIPELINE_STAGE_TRANSFER_BIT, dst_stage);
}


Expand Down
2 changes: 1 addition & 1 deletion system_modules/naprender/src/materialcommon.h
Original file line number Diff line number Diff line change
Expand Up @@ -68,7 +68,7 @@ namespace nap
/**
* Hash value for shader specialization constants
*/
using ShaderConstantHash = uint;
using ShaderConstantHash = size_t;


/**
Expand Down
Loading