Skip to content

Commit

Permalink
ShaderWriter: Added MixedStructInstanceHelperT.
Browse files Browse the repository at this point in the history
This class allows declaring a structure to use as IO and buffer block.
  • Loading branch information
DragonJoker committed Oct 30, 2023
1 parent d233928 commit c8af31d
Show file tree
Hide file tree
Showing 12 changed files with 910 additions and 1,807 deletions.
6 changes: 0 additions & 6 deletions .github/workflows/cmake.yml
Original file line number Diff line number Diff line change
Expand Up @@ -60,12 +60,6 @@ jobs:
shell: bash
run: |
cmake --build . --parallel 2 --config ${{ matrix.buildType }}
- name: Test
if: (steps.build.conclusion == 'success')
working-directory: ${{runner.workspace}}/build-${{ matrix.buildType }}
shell: bash
run: |
ctest -C ${{ matrix.buildType }}
- name: Prepare success package
if: (github.event_name == 'push') && (steps.build.conclusion == 'success')
working-directory: ${{runner.workspace}}/build-${{ matrix.buildType }}
Expand Down
271 changes: 16 additions & 255 deletions include/ShaderWriter/CompositeTypes/IOStructHelper.hpp

Large diffs are not rendered by default.

84 changes: 15 additions & 69 deletions include/ShaderWriter/CompositeTypes/IOStructInstanceHelper.hpp
Original file line number Diff line number Diff line change
Expand Up @@ -5,20 +5,25 @@ See LICENSE file in root folder
#define ___SDW_IOStructInstanceHelper_H___
#pragma once

#if SDW_EnableStructHelper
#include "MixedStructInstanceHelper.hpp"

#include "StructInstance.hpp"
#if SDW_EnableStructHelper

namespace sdw
{
template< ast::var::Flag FlagT
, StringLiteralT StructNameT
, typename... FieldsT >
class IOStructInstanceHelperT
: public StructInstance
: public MixedStructInstanceHelperT< FlagT
, StructNameT
, ast::type::MemoryLayout::eC
, FieldsT... >
{
static_assert( sizeof...( FieldsT ) > 0
, "A structure must have at least one field" );
using MyHelper = MixedStructInstanceHelperT< FlagT
, StructNameT
, ast::type::MemoryLayout::eC
, FieldsT... >;

public:
~IOStructInstanceHelperT() override = default;
Expand All @@ -28,83 +33,24 @@ namespace sdw
IOStructInstanceHelperT( ShaderWriter & writer
, ast::expr::ExprPtr expr
, bool enabled = true )
: StructInstance{ writer, std::move( expr ), enabled }
: MyHelper{ writer, std::move( expr ), enabled }
{
}

IOStructInstanceHelperT & operator=( IOStructInstanceHelperT const & rhs )
{
StructInstance::operator=( rhs );
MyHelper::operator=( rhs );
return *this;
}

IOStructInstanceHelperT & operator=( IOStructInstanceHelperT && rhs )
{
StructInstance::operator=( std::move( rhs ) );
MyHelper::operator=( std::move( rhs ) );
return *this;
}

template< sdw::StringLiteralT FieldNameT >
constexpr static auto getFieldByName()
{
return doGetFieldByName< FieldNameT, FieldsT... >();
}

template< sdw::StringLiteralT FieldNameT >
constexpr static bool hasFieldByName()
{
return ( ... || ( std::string_view( FieldNameT.value ) == FieldsT::Name ) );
}

template< sdw::StringLiteralT FieldNameT >
auto getMember()const
{
static_assert( hasFieldByName< FieldNameT >() );
using FieldT = decltype( getFieldByName< FieldNameT >() );
return FieldT::template get( *this );
}

static type::IOStructPtr makeIOType( type::TypesCache & cache
, ast::EntryPoint entryPoint )
{
auto result = cache.getIOStruct( std::string( StructNameT.value )
, entryPoint
, FlagT );

if ( result->empty() )
{
( result->declMember( std::string( FieldsT::Name )
, FieldsT::TypeT::makeType( cache )
, FieldsT::ArraySize
, FieldsT::Location )
, ... );
}

return result;
}

using StructInstance::getMember;
using StructInstance::getMemberArray;

private:
template< sdw::StringLiteralT FieldNameT >
constexpr static auto doGetFieldByName()
{
return sdw::Void{};
}

template< sdw::StringLiteralT FieldNameT, typename FieldU, typename... FieldsU >
constexpr static auto doGetFieldByName()
{
if constexpr ( std::string_view( FieldNameT.value ) == FieldU::Name )
{
return FieldU{};
}
else
{
return doGetFieldByName< FieldNameT, FieldsU... >();
}
}
using MyHelper::getMember;
using MyHelper::getMemberArray;
};
}
#endif
Expand Down
283 changes: 283 additions & 0 deletions include/ShaderWriter/CompositeTypes/MixedStructHelper.hpp

Large diffs are not rendered by default.

129 changes: 129 additions & 0 deletions include/ShaderWriter/CompositeTypes/MixedStructInstanceHelper.hpp
Original file line number Diff line number Diff line change
@@ -0,0 +1,129 @@
/*
See LICENSE file in root folder
*/
#ifndef ___SDW_MixedStructInstanceHelper_H___
#define ___SDW_MixedStructInstanceHelper_H___
#pragma once

#include "StructInstance.hpp"

#if SDW_EnableStructHelper

namespace sdw
{
template< ast::var::Flag FlagT
, StringLiteralT StructNameT
, ast::type::MemoryLayout LayoutT
, typename... FieldsT >
class MixedStructInstanceHelperT
: public StructInstance
{
static_assert( sizeof...( FieldsT ) > 0
, "A structure must have at least one field" );

public:
~MixedStructInstanceHelperT() override = default;
MixedStructInstanceHelperT( MixedStructInstanceHelperT const & ) = default;
MixedStructInstanceHelperT( MixedStructInstanceHelperT && ) = default;

MixedStructInstanceHelperT( ShaderWriter & writer
, ast::expr::ExprPtr expr
, bool enabled = true )
: StructInstance{ writer, std::move( expr ), enabled }
{
}

MixedStructInstanceHelperT & operator=( MixedStructInstanceHelperT const & rhs )
{
StructInstance::operator=( rhs );
return *this;
}

MixedStructInstanceHelperT & operator=( MixedStructInstanceHelperT && rhs )
{
StructInstance::operator=( std::move( rhs ) );
return *this;
}

template< sdw::StringLiteralT FieldNameT >
constexpr static auto getFieldByName()
{
return doGetFieldByName< FieldNameT, FieldsT... >();
}

template< sdw::StringLiteralT FieldNameT >
constexpr static bool hasFieldByName()
{
return ( ... || ( std::string_view( FieldNameT.value ) == FieldsT::Name ) );
}

template< sdw::StringLiteralT FieldNameT >
auto getMember()const
{
static_assert( hasFieldByName< FieldNameT >() );
using FieldT = decltype( getFieldByName< FieldNameT >() );
return FieldT::template get( *this );
}

static type::IOStructPtr makeIOType( type::TypesCache & cache
, ast::EntryPoint entryPoint )
{
auto result = cache.getIOStruct( std::string( StructNameT.value )
, entryPoint
, FlagT );

if ( result->empty() )
{
( result->declMember( std::string( FieldsT::Name )
, FieldsT::TypeT::makeType( cache )
, FieldsT::ArraySize
, FieldsT::Location )
, ... );
}

return result;
}

static type::BaseStructPtr makeType( type::TypesCache & cache )
{
auto result = cache.getStruct( LayoutT
, std::string( StructNameT.value ) );

if ( result->empty() )
{
( result->declMember( std::string( FieldsT::Name )
, FieldsT::TypeT::makeType( cache )
, FieldsT::ArraySize )
, ... );
}

return result;
}

using StructInstance::getMember;
using StructInstance::getMemberArray;

private:
template< sdw::StringLiteralT FieldNameT >
constexpr static auto doGetFieldByName()
{
return sdw::Void{};
}

template< sdw::StringLiteralT FieldNameT, typename FieldU, typename... FieldsU >
constexpr static auto doGetFieldByName()
{
if constexpr ( std::string_view( FieldNameT.value ) == FieldU::Name )
{
return FieldU{};
}
else
{
return doGetFieldByName< FieldNameT, FieldsU... >();
}
}
};
}
#endif

#endif
3 changes: 2 additions & 1 deletion include/ShaderWriter/CompositeTypes/StructHelper.hpp
Original file line number Diff line number Diff line change
Expand Up @@ -4,9 +4,10 @@ See LICENSE file in root folder
#ifndef ___SDW_StructHelper_H___
#define ___SDW_StructHelper_H___

#include "ShaderWriter/ShaderWriterPrerequisites.hpp"

#if SDW_EnableStructHelper

#include "ShaderWriter/ShaderWriterPrerequisites.hpp"
#include "ShaderWriter/BaseTypes/Void.hpp"

namespace sdw
Expand Down
4 changes: 2 additions & 2 deletions include/ShaderWriter/CompositeTypes/StructInstanceHelper.hpp
Original file line number Diff line number Diff line change
Expand Up @@ -5,10 +5,10 @@ See LICENSE file in root folder
#define ___SDW_StructInstanceHelper_H___
#pragma once

#if SDW_EnableStructHelper

#include "StructInstance.hpp"

#if SDW_EnableStructHelper

namespace sdw
{
template< StringLiteralT StructNameT
Expand Down
2 changes: 1 addition & 1 deletion include/ShaderWriter/TessellationControlWriter.hpp
Original file line number Diff line number Diff line change
Expand Up @@ -4,7 +4,7 @@ See LICENSE file in root folder
#ifndef ___SDW_TessellationControlWriter_H___
#define ___SDW_TessellationControlWriter_H___

#include "ShaderWriter/Writer.hpp"
#include "ShaderWriter/EntryPointWriter.hpp"
#include "ShaderWriter/Intrinsics/Intrinsics.hpp"

namespace sdw
Expand Down
2 changes: 2 additions & 0 deletions source/ShaderWriter/CMakeLists.txt
Original file line number Diff line number Diff line change
Expand Up @@ -224,6 +224,8 @@ set( ${PROJECT_NAME}_FOLDER_HEADER_FILES
${INCLUDE_DIR}/CompositeTypes/FunctionParam.inl
${INCLUDE_DIR}/CompositeTypes/IOStructHelper.hpp
${INCLUDE_DIR}/CompositeTypes/IOStructInstanceHelper.hpp
${INCLUDE_DIR}/CompositeTypes/MixedStructHelper.hpp
${INCLUDE_DIR}/CompositeTypes/MixedStructInstanceHelper.hpp
${INCLUDE_DIR}/CompositeTypes/PerPrimitive.hpp
${INCLUDE_DIR}/CompositeTypes/PerVertex.hpp
${INCLUDE_DIR}/CompositeTypes/PushConstantBuffer.hpp
Expand Down
3 changes: 3 additions & 0 deletions source/ShaderWriter/RayTraceWriter.cpp
Original file line number Diff line number Diff line change
Expand Up @@ -3,6 +3,9 @@ See LICENSE file in root folder
*/
#include "ShaderWriter/RayTraceWriter.hpp"

#include <ShaderAST/Stmt/StmtIgnoreIntersection.hpp>
#include <ShaderAST/Stmt/StmtTerminateRay.hpp>

namespace sdw
{
RayTraceWriter::RayTraceWriter( ShaderAllocator * allocator )
Expand Down
4 changes: 2 additions & 2 deletions test/ShaderWriter/TestWriterCompositeCtors.cpp
Original file line number Diff line number Diff line change
@@ -1,8 +1,8 @@
#include "Common.hpp"
#include "WriterCommon.hpp"

#include <ShaderWriter/CompositeTypes/IOStructHelper.hpp>
#include <ShaderWriter/CompositeTypes/IOStructInstanceHelper.hpp>
#include <ShaderWriter/CompositeTypes/StructHelper.hpp>
#include <ShaderWriter/CompositeTypes/StructInstanceHelper.hpp>

#pragma warning( disable:5245 )
#pragma GCC diagnostic ignored "-Wunused-function"
Expand Down
Loading

0 comments on commit c8af31d

Please sign in to comment.