Skip to content

Commit

Permalink
Experimenting with component-based shaders
Browse files Browse the repository at this point in the history
  • Loading branch information
PazerOP committed May 31, 2019
1 parent 84bc33e commit 09ac6ed
Show file tree
Hide file tree
Showing 13 changed files with 513 additions and 327 deletions.
4 changes: 2 additions & 2 deletions shaderapivulkan/include/TF2Vulkan/IShaderDynamicNext.h
Original file line number Diff line number Diff line change
Expand Up @@ -53,9 +53,9 @@ namespace TF2Vulkan
BindUniformBuffer(*buf, index);
}

template<size_t size> size_t GetLights(LightDesc_t(&lights)[size]) const
template<size_t size> [[nodiscard]] size_t GetLights(LightDesc_t(&lights)[size]) const
{
static_assert(size == 4);
static_assert(size == MAX_VS_LIGHTS);
return GetLights(lights, size);
}

Expand Down
15 changes: 4 additions & 11 deletions shaderapivulkan/include/TF2Vulkan/IShaderGroup.h
Original file line number Diff line number Diff line change
Expand Up @@ -37,19 +37,12 @@ namespace TF2Vulkan
virtual UniformBufferIndex FindUniformBuffer(const std::string_view& name) const = 0;
UniformBufferIndex FindUniformBuffer(UniformBufferStandardType type) const;

const IShaderInstance& FindOrCreateInstance()
{
return FindOrCreateInstance(nullptr, 0);
}

template<typename TBuffer>
const IShaderInstance& FindOrCreateInstance(const BaseSpecConstBuffer<TBuffer>& buffer)
virtual IShaderInstance& FindOrCreateInstance(const void* specConstBuf, size_t specConstBufSize) = 0;
const IShaderInstance& FindOrCreateInstance() { return FindOrCreateInstance(nullptr, 0); }
template<typename T> const IShaderInstance& FindOrCreateInstance(const T& specConstBuf)
{
return FindOrCreateInstance(buffer.data(), buffer.size());
return FindOrCreateInstance(&specConstBuf, sizeof(specConstBuf));
}

private:
virtual IShaderInstance& FindOrCreateInstance(const void* specConstBuf, size_t specConstBufSize) = 0;
};

inline UniformBufferIndex IShaderGroup::FindUniformBuffer(UniformBufferStandardType type) const
Expand Down
23 changes: 5 additions & 18 deletions shaderapivulkan/include/TF2Vulkan/IShaderNextFactory.h
Original file line number Diff line number Diff line change
Expand Up @@ -14,16 +14,11 @@ namespace TF2Vulkan

IShaderGroup& FindOrCreateShaderGroup(ShaderType type, const char* name);
IShaderGroup& FindOrCreateShaderGroup(ShaderType type, const char* name, const ISpecConstLayout& layout);
IShaderGroup& FindOrCreateShaderGroup(ShaderType type, const char* name, const SpecConstLayoutCreateInfo& ci);

template<typename TInfo, typename TBuffer> IShaderGroup& FindOrCreateShaderGroup(
ShaderType type, const char* name, const BaseSpecConstLayout<TInfo, TBuffer>& layout);

template<typename TInfo, typename TBuffer> const ISpecConstLayout& FindOrCreateSpecConstLayout(
const BaseSpecConstLayout<TInfo, TBuffer>& info);

protected:
virtual const ISpecConstLayout& FindOrCreateSpecConstLayout(const SpecConstLayoutEntry* entries, size_t count) = 0;
virtual const ISpecConstLayout& FindOrCreateSpecConstLayout(const SpecConstLayoutCreateInfo& ci) = 0;

private:
virtual IShaderGroup& FindOrCreateShaderGroup(ShaderType type, const char* name,
const ISpecConstLayout* layout) = 0;
};
Expand All @@ -43,17 +38,9 @@ namespace TF2Vulkan
return FindOrCreateShaderGroup(type, name, nullptr);
}

template<typename TInfo, typename TBuffer>
inline const ISpecConstLayout& IShaderNextFactory::FindOrCreateSpecConstLayout(
const BaseSpecConstLayout<TInfo, TBuffer>& info)
{
return FindOrCreateSpecConstLayout(info.data(), info.size());
}

template<typename TInfo, typename TBuffer>
inline IShaderGroup& IShaderNextFactory::FindOrCreateShaderGroup(ShaderType type,
const char* name, const BaseSpecConstLayout<TInfo, TBuffer>& layout)
const char* name, const SpecConstLayoutCreateInfo& ci)
{
return FindOrCreateShaderGroup(type, name, FindOrCreateSpecConstLayout(layout));
return FindOrCreateShaderGroup(type, name, FindOrCreateSpecConstLayout(ci));
}
}
55 changes: 7 additions & 48 deletions shaderapivulkan/include/TF2Vulkan/ISpecConstLayout.h
Original file line number Diff line number Diff line change
Expand Up @@ -34,6 +34,7 @@ namespace TF2Vulkan
SpecConstType m_Type;
size_t m_Offset;

bool operator!=(const SpecConstLayoutEntry& other) const noexcept { return !operator==(other); }
bool operator==(const SpecConstLayoutEntry& other) const noexcept
{
return
Expand All @@ -43,63 +44,21 @@ namespace TF2Vulkan
}
};

template<typename TBuffer>
struct BaseSpecConstBuffer
struct SpecConstLayoutCreateInfo final
{
constexpr BaseSpecConstBuffer()
{
static_assert(std::has_unique_object_representations_v<TBuffer>,
"Buffer must have no padding, so it can be memcmp'd");
}

const void* data() const { return reinterpret_cast<const void*>(this); }
static constexpr size_t size()
{
static_assert(sizeof(TBuffer) % 4 == 0);
return sizeof(TBuffer);
}
const SpecConstLayoutEntry* m_Entries = nullptr;
size_t m_EntryCount = 0;
};

template<typename TInfo, typename TBuffer>
struct BaseSpecConstLayout
{
constexpr BaseSpecConstLayout()
{
static_assert(std::is_base_of_v<BaseSpecConstBuffer<TBuffer>, TBuffer>,
"TBuffer must inherit from BaseSpecConstBuffer<TBuffer>");

static_assert((sizeof(TInfo) / sizeof(SpecConstLayoutEntry)) == sizeof(TBuffer) / 4,
"Mismatching element count for info struct and buffer struct");
}

static constexpr size_t size()
{
static_assert(sizeof(TInfo) % sizeof(SpecConstLayoutEntry) == 0);
return sizeof(TInfo) / sizeof(SpecConstLayoutEntry);
}
const SpecConstLayoutEntry* data() const
{
return reinterpret_cast<const SpecConstLayoutEntry*>(this);
}
const SpecConstLayoutEntry& operator[](size_t i) const
{
assert(i < size());
return *(data() + i);
}

auto begin() const { return data(); }
auto end() const { return data() + size(); }
};

#define SPEC_CONST_BUF_ENTRY(type, name) \
::TF2Vulkan::SpecConstLayoutEntry name{ #name, GetSpecConstType<decltype(type::name)>(), offsetof(type, name) }

class ISpecConstLayout
{
public:
virtual const SpecConstLayoutEntry* GetEntries(size_t& count) const = 0;
virtual size_t GetBufferSize() const = 0;
};

#define SPEC_CONST_BUF_ENTRY(type, name) \
::TF2Vulkan::SpecConstLayoutEntry name{ #name, GetSpecConstType<decltype(type::name)>(), offsetof(type, name) }
}

STD_HASH_DEFINITION(TF2Vulkan::SpecConstLayoutEntry,
Expand Down
3 changes: 1 addition & 2 deletions shaderapivulkan/shaderapivulkan.vcxproj
Original file line number Diff line number Diff line change
Expand Up @@ -94,6 +94,7 @@
<ItemGroup>
<ClInclude Include="include\TF2Vulkan\AlignedTypes.h" />
<ClInclude Include="include\TF2Vulkan\DataFormat.h" />
<ClInclude Include="include\TF2Vulkan\FogParams.h" />
<ClInclude Include="include\TF2Vulkan\LogicalFogParams.h" />
<ClInclude Include="include\TF2Vulkan\IShaderGroup.h" />
<ClInclude Include="include\TF2Vulkan\IShaderNextFactory.h" />
Expand Down Expand Up @@ -137,7 +138,6 @@
<ClInclude Include="include\TF2Vulkan\VertexFormat.h" />
<ClInclude Include="src\TF2Vulkan\vk_mem_alloc.h" />
<ClInclude Include="src\TF2Vulkan\vk_mem_alloc.hpp" />
<ClInclude Include="src\TF2Vulkan\VulkanBuffer.h" />
<ClInclude Include="src\interface\internal\IVulkanCommandBuffer.h" />
<ClInclude Include="src\TF2Vulkan\VulkanCommandBufferBase.h" />
<ClInclude Include="src\TF2Vulkan\VulkanFactories.h" />
Expand Down Expand Up @@ -179,7 +179,6 @@
<ClCompile Include="src\TF2Vulkan\shaders\VulkanShaderManager.cpp" />
<ClCompile Include="src\TF2Vulkan\StateManagerVulkan.cpp" />
<ClCompile Include="src\TF2Vulkan\VBAllocTracker.cpp" />
<ClCompile Include="src\TF2Vulkan\VulkanBuffer.cpp" />
<ClCompile Include="src\TF2Vulkan\ResourceBlob.cpp" />
<ClCompile Include="src\TF2Vulkan\VulkanFactories.cpp" />
<ClCompile Include="src\TF2Vulkan\StateManagerStatic.cpp" />
Expand Down
Loading

0 comments on commit 09ac6ed

Please sign in to comment.