Skip to content
Merged
Show file tree
Hide file tree
Changes from all commits
Commits
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
6 changes: 2 additions & 4 deletions framework/CMakeLists.txt
Original file line number Diff line number Diff line change
@@ -1,5 +1,5 @@
# Copyright (c) 2019-2025, Arm Limited and Contributors
# Copyright (c) 2025, NVIDIA CORPORATION. All rights reserved.
# Copyright (c) 2019-2026, Arm Limited and Contributors
# Copyright (c) 2025-2026, NVIDIA CORPORATION. All rights reserved.
#
# SPDX-License-Identifier: Apache-2.0
#
Expand Down Expand Up @@ -127,9 +127,7 @@ set(RENDERING_SUBPASSES_FILES
rendering/subpasses/forward_subpass.h
rendering/subpasses/lighting_subpass.h
rendering/subpasses/geometry_subpass.h
rendering/subpasses/hpp_forward_subpass.h
# Source files
rendering/subpasses/forward_subpass.cpp
rendering/subpasses/lighting_subpass.cpp)

set(SCENE_GRAPH_FILES
Expand Down
6 changes: 3 additions & 3 deletions framework/hpp_api_vulkan_sample.cpp
Original file line number Diff line number Diff line change
@@ -1,5 +1,5 @@
/* Copyright (c) 2021-2025, NVIDIA CORPORATION. All rights reserved.
* Copyright (c) 2024-2025, Arm Limited and Contributors
/* Copyright (c) 2021-2026, NVIDIA CORPORATION. All rights reserved.
* Copyright (c) 2024-2026, Arm Limited and Contributors
*
* SPDX-License-Identifier: Apache-2.0
*
Expand Down Expand Up @@ -1085,7 +1085,7 @@ void HPPApiVulkanSample::draw_model(std::unique_ptr<vkb::scene_graph::components

command_buffer.bindVertexBuffers(0, vertex_buffer.get_handle(), offset);
command_buffer.bindIndexBuffer(index_buffer.get_handle(), 0, model->get_index_type());
command_buffer.drawIndexed(model->vertex_indices, instance_count, 0, 0, 0);
command_buffer.drawIndexed(model->get_vertex_indices(), instance_count, 0, 0, 0);
}

void HPPApiVulkanSample::with_command_buffer(const std::function<void(vk::CommandBuffer command_buffer)> &f, vk::Semaphore signalSemaphore)
Expand Down
11 changes: 5 additions & 6 deletions framework/rendering/hpp_render_pipeline.h
Original file line number Diff line number Diff line change
@@ -1,4 +1,4 @@
/* Copyright (c) 2021-2025, NVIDIA CORPORATION. All rights reserved.
/* Copyright (c) 2021-2026, NVIDIA CORPORATION. All rights reserved.
*
* SPDX-License-Identifier: Apache-2.0
*
Expand All @@ -17,9 +17,8 @@

#pragma once

#include <rendering/render_pipeline.h>

#include <rendering/subpasses/hpp_forward_subpass.h>
#include "rendering/render_pipeline.h"
#include "rendering/subpasses/forward_subpass.h"

namespace vkb
{
Expand All @@ -33,9 +32,9 @@ namespace rendering
class HPPRenderPipeline : private vkb::RenderPipeline
{
public:
void add_subpass(std::unique_ptr<vkb::rendering::subpasses::HPPForwardSubpass> &&subpass)
void add_subpass(std::unique_ptr<vkb::rendering::subpasses::ForwardSubpassCpp> &&subpass)
{
vkb::RenderPipeline::add_subpass(std::move(subpass));
vkb::RenderPipeline::add_subpass(std::unique_ptr<vkb::rendering::subpasses::ForwardSubpassC>(reinterpret_cast<vkb::rendering::subpasses::ForwardSubpassC *>(subpass.release())));
}

void draw(vkb::core::CommandBufferCpp &command_buffer,
Expand Down
64 changes: 0 additions & 64 deletions framework/rendering/subpasses/forward_subpass.cpp

This file was deleted.

71 changes: 61 additions & 10 deletions framework/rendering/subpasses/forward_subpass.h
Original file line number Diff line number Diff line change
@@ -1,4 +1,5 @@
/* Copyright (c) 2018-2025, Arm Limited and Contributors
/* Copyright (c) 2018-2026, Arm Limited and Contributors
* Copyright (c) 2026, NVIDIA CORPORATION. All rights reserved.
*
* SPDX-License-Identifier: Apache-2.0
*
Expand Down Expand Up @@ -41,11 +42,21 @@ struct alignas(16) ForwardLights
vkb::rendering::Light spot_lights[MAX_FORWARD_LIGHT_COUNT];
};

namespace rendering
{
namespace subpasses
{

/**
* @brief This subpass is responsible for rendering a Scene
*/
class ForwardSubpass : public vkb::rendering::subpasses::GeometrySubpassC
template <vkb::BindingType bindingType>
class ForwardSubpass : public vkb::rendering::subpasses::GeometrySubpass<bindingType>
{
public:
using SceneType = typename std::conditional<bindingType == vkb::BindingType::Cpp, vkb::scene_graph::HPPScene, vkb::sg::Scene>::type;
using ShaderSourceType = typename std::conditional<bindingType == vkb::BindingType::Cpp, vkb::core::HPPShaderSource, vkb::ShaderSource>::type;

public:
/**
* @brief Constructs a subpass designed for forward rendering
Expand All @@ -55,17 +66,57 @@ class ForwardSubpass : public vkb::rendering::subpasses::GeometrySubpassC
* @param scene Scene to render on this subpass
* @param camera Camera used to look at the scene
*/
ForwardSubpass(
vkb::rendering::RenderContextC &render_context, ShaderSource &&vertex_shader, ShaderSource &&fragment_shader, sg::Scene &scene, sg::Camera &camera);
ForwardSubpass(vkb::rendering::RenderContext<bindingType> &render_context,
ShaderSourceType &&vertex_shader,
ShaderSourceType &&fragment_shader,
SceneType &scene,
sg::Camera &camera);

virtual ~ForwardSubpass() = default;

virtual void prepare() override;

/**
* @brief Record draw commands
*/
virtual void draw(vkb::core::CommandBufferC &command_buffer) override;
// from vkb::rendering::Subpass
void draw(vkb::core::CommandBuffer<bindingType> &command_buffer) override;
void prepare() override;
};

using ForwardSubpassC = ForwardSubpass<vkb::BindingType::C>;
using ForwardSubpassCpp = ForwardSubpass<vkb::BindingType::Cpp>;

// Member function definitions

template <vkb::BindingType bindingType>
inline ForwardSubpass<bindingType>::ForwardSubpass(vkb::rendering::RenderContext<bindingType> &render_context,
ShaderSourceType &&vertex_source,
ShaderSourceType &&fragment_source,
SceneType &scene_,
sg::Camera &camera) :
GeometrySubpass<bindingType>{render_context, std::move(vertex_source), std::move(fragment_source), scene_, camera}
{}

template <vkb::BindingType bindingType>
inline void ForwardSubpass<bindingType>::draw(vkb::core::CommandBuffer<bindingType> &command_buffer)
{
this->template allocate_lights<ForwardLights>(this->get_scene().template get_components<sg::Light>(), MAX_FORWARD_LIGHT_COUNT);
command_buffer.bind_lighting(this->get_lighting_state(), 0, 4);

GeometrySubpass<bindingType>::draw(command_buffer);
}

template <vkb::BindingType bindingType>
inline void ForwardSubpass<bindingType>::prepare()
{
auto &device = this->get_render_context_impl().get_device();
for (auto &mesh : this->get_meshes_impl())
{
for (auto &sub_mesh : mesh->get_submeshes())
{
auto &variant = sub_mesh->get_mut_shader_variant();
auto &vert_module = device.get_resource_cache().request_shader_module(vk::ShaderStageFlagBits::eVertex, this->get_vertex_shader_impl(), variant);
auto &frag_module = device.get_resource_cache().request_shader_module(vk::ShaderStageFlagBits::eFragment, this->get_fragment_shader_impl(), variant);
}
}
}

} // namespace subpasses
} // namespace rendering
} // namespace vkb
25 changes: 17 additions & 8 deletions framework/rendering/subpasses/geometry_subpass.h
Original file line number Diff line number Diff line change
@@ -1,5 +1,5 @@
/* Copyright (c) 2019-2025, Arm Limited and Contributors
* Copyright (c) 2025, NVIDIA CORPORATION. All rights reserved.
/* Copyright (c) 2019-2026, Arm Limited and Contributors
* Copyright (c) 2025-2026, NVIDIA CORPORATION. All rights reserved.
*
* SPDX-License-Identifier: Apache-2.0
*
Expand Down Expand Up @@ -148,6 +148,9 @@ class GeometrySubpass : public vkb::rendering::Subpass<bindingType>
virtual void prepare_push_constants(vkb::core::CommandBuffer<bindingType> &command_buffer, SubMeshType &sub_mesh);
virtual void update_uniform(vkb::core::CommandBuffer<bindingType> &command_buffer, vkb::scene_graph::Node<bindingType> &node, size_t thread_index);

protected:
std::vector<vkb::scene_graph::components::HPPMesh *> const &get_meshes_impl() const;

private:
void draw_impl(vkb::core::CommandBufferCpp &command_buffer);
void draw_submesh_impl(vkb::core::CommandBufferCpp &command_buffer,
Expand Down Expand Up @@ -318,18 +321,18 @@ template <vkb::BindingType bindingType>
inline void GeometrySubpass<bindingType>::draw_submesh_command(vkb::core::CommandBuffer<bindingType> &command_buffer, SubMeshType &sub_mesh)
{
// Draw submesh indexed if indices exists
if (sub_mesh.vertex_indices != 0)
if (sub_mesh.get_vertex_indices() != 0)
{
// Bind index buffer of submesh
command_buffer.bind_index_buffer(*sub_mesh.index_buffer, sub_mesh.index_offset, sub_mesh.index_type);
command_buffer.bind_index_buffer(sub_mesh.get_index_buffer(), sub_mesh.get_index_offset(), sub_mesh.get_index_type());

// Draw submesh using indexed data
command_buffer.draw_indexed(sub_mesh.vertex_indices, 1, 0, 0, 0);
command_buffer.draw_indexed(sub_mesh.get_vertex_indices(), 1, 0, 0, 0);
}
else
{
// Draw submesh using vertices only
command_buffer.draw(sub_mesh.vertices_count, 1, 0, 0);
command_buffer.draw(sub_mesh.get_vertices_count(), 1, 0, 0);
}
}

Expand All @@ -344,11 +347,11 @@ inline std::vector<typename GeometrySubpass<bindingType>::MeshType *> const &Geo
{
if constexpr (bindingType == vkb::BindingType::Cpp)
{
return meshes;
return get_meshes_impl();
}
else
{
return reinterpret_cast<std::vector<vkb::sg::Mesh *> const &>(meshes);
return reinterpret_cast<std::vector<vkb::sg::Mesh *> const &>(get_meshes_impl());
}
}

Expand Down Expand Up @@ -483,6 +486,12 @@ inline vkb::core::HPPPipelineLayout &
return command_buffer.get_device().get_resource_cache().request_pipeline_layout(shader_modules);
}

template <vkb::BindingType bindingType>
inline std::vector<vkb::scene_graph::components::HPPMesh *> const &GeometrySubpass<bindingType>::get_meshes_impl() const
{
return meshes;
}

template <vkb::BindingType bindingType>
inline void GeometrySubpass<bindingType>::draw_submesh_impl(vkb::core::CommandBufferCpp &command_buffer,
vkb::scene_graph::components::HPPSubMesh &sub_mesh,
Expand Down
51 changes: 0 additions & 51 deletions framework/rendering/subpasses/hpp_forward_subpass.h

This file was deleted.

15 changes: 11 additions & 4 deletions framework/scene_graph/components/hpp_sub_mesh.h
Original file line number Diff line number Diff line change
@@ -1,4 +1,4 @@
/* Copyright (c) 2021-2025, NVIDIA CORPORATION. All rights reserved.
/* Copyright (c) 2021-2026, NVIDIA CORPORATION. All rights reserved.
*
* SPDX-License-Identifier: Apache-2.0
*
Expand Down Expand Up @@ -43,7 +43,9 @@ class HPPSubMesh : private vkb::sg::SubMesh
{
public:
using vkb::sg::Component::get_name;
using vkb::sg::SubMesh::vertex_indices;
using vkb::sg::SubMesh::get_index_offset;
using vkb::sg::SubMesh::get_vertex_indices;
using vkb::sg::SubMesh::get_vertices_count;

bool get_attribute(const std::string &name, HPPVertexAttribute &attribute) const
{
Expand All @@ -52,19 +54,24 @@ class HPPSubMesh : private vkb::sg::SubMesh

vkb::core::BufferCpp const &get_index_buffer() const
{
return reinterpret_cast<vkb::core::BufferCpp const &>(*vkb::sg::SubMesh::index_buffer);
return reinterpret_cast<vkb::core::BufferCpp const &>(vkb::sg::SubMesh::get_index_buffer());
}

vk::IndexType get_index_type() const
{
return static_cast<vk::IndexType>(vkb::sg::SubMesh::index_type);
return static_cast<vk::IndexType>(vkb::sg::SubMesh::get_index_type());
}

const HPPMaterial *get_material() const
{
return reinterpret_cast<vkb::scene_graph::components::HPPMaterial const *>(vkb::sg::SubMesh::get_material());
}

vkb::core::HPPShaderVariant &get_mut_shader_variant()
{
return reinterpret_cast<vkb::core::HPPShaderVariant &>(vkb::sg::SubMesh::get_mut_shader_variant());
}

const vkb::core::HPPShaderVariant &get_shader_variant() const
{
return reinterpret_cast<vkb::core::HPPShaderVariant const &>(vkb::sg::SubMesh::get_shader_variant());
Expand Down
Loading
Loading