Nameless Engine
Loading...
Searching...
No Matches
GlslShaderTextureResourceBinding.h
1#pragma once
2
3// Standard.
4#include <string>
5#include <memory>
6#include <variant>
7#include <unordered_set>
8
9// Custom.
10#include "shader/general/resource/binding/ShaderResourceBinding.h"
11#include "render/general/pipeline/PipelineShaderConstantsManager.hpp"
12#include "shader/general/resource/ShaderArrayIndexManager.h"
13
14// External.
15#include "vulkan/vulkan.h"
16
17namespace ne {
18 class TextureHandle;
19 class Pipeline;
20 class VulkanPipeline;
21 class VulkanResource;
22
25 // Only the manager should be able to create such resources.
27
32
40 size_t iPushConstantIndex, std::unique_ptr<ShaderArrayIndex> pShaderArrayIndex) {
41 this->iPushConstantIndex = iPushConstantIndex;
42 this->pShaderArrayIndex = std::move(pShaderArrayIndex);
43 }
44
47
54
57
59 std::unique_ptr<ShaderArrayIndex> pShaderArrayIndex;
60 };
61
62 public:
63 virtual ~GlslShaderTextureResourceBinding() override = default;
64
70 std::string getPathToTextureResource();
71
79 PipelineShaderConstantsManager* pPushConstantsManager, VulkanPipeline* pUsedPipeline) {
80 // Since pipelines won't change here (because we are inside of the `draw` function)
81 // we don't need to lock the mutex here.
82
83 // Find push constant index of this pipeline.
84 const auto it = mtxPushConstantIndices.second.find(pUsedPipeline);
85 if (it == mtxPushConstantIndices.second.end()) [[unlikely]] {
86 Error error(std::format(
87 "shader resource \"{}\" was requested to set its push constant "
88 "index but this shader resource does not reference the specified pipeline",
90 mtxPushConstantIndices.second.size()));
91 error.showError();
92 throw std::runtime_error(error.getFullErrorMessage());
93 }
94
95 // Copy value to push constants.
96 pPushConstantsManager->copyValueToShaderConstant(
97 it->second.iPushConstantIndex, it->second.pShaderArrayIndex->getActualIndex());
98 }
99
111 [[nodiscard]] virtual std::optional<Error>
112 useNewTexture(std::unique_ptr<TextureHandle> pTextureToUse) override;
113
130 [[nodiscard]] virtual std::optional<Error>
131 changeUsedPipelines(const std::unordered_set<Pipeline*>& pipelinesToUse) override;
132
133 protected:
146 const std::string& sResourceName,
147 std::unique_ptr<TextureHandle> pTextureToUse,
148 std::unordered_map<VulkanPipeline*, PushConstantIndices> pushConstantIndices);
149
159 [[nodiscard]] virtual std::optional<Error> onAfterAllPipelinesRefreshedResources() override;
160
161 private:
172 static std::variant<std::unique_ptr<ShaderTextureResourceBinding>, Error> create(
173 const std::string& sShaderResourceName,
174 const std::unordered_set<Pipeline*>& pipelinesToUse,
175 std::unique_ptr<TextureHandle> pTextureToUse);
176
186 static std::variant<std::unique_ptr<ShaderArrayIndex>, Error> getTextureIndexInShaderArray(
187 const std::string& sShaderResourceName, VulkanPipeline* pPipelineToLookIn);
188
200 static std::optional<Error> bindTextureToShaderDescriptorArray(
201 const std::string& sShaderResourceName,
202 VulkanPipeline* pPipelineWithDescriptors,
203 VulkanResource* pTexture,
204 unsigned int iIndexIntoShaderArray);
205
207 std::pair<std::mutex, std::unique_ptr<TextureHandle>> mtxUsedTexture;
208
210 std::pair<std::recursive_mutex, std::unordered_map<VulkanPipeline*, PushConstantIndices>>
212 };
213} // namespace ne
Definition: Error.h:27
std::string getFullErrorMessage() const
Definition: Error.cpp:84
void showError() const
Definition: Error.cpp:102
Definition: GlslShaderTextureResourceBinding.h:24
std::string getPathToTextureResource()
Definition: GlslShaderTextureResourceBinding.cpp:224
void copyResourceIndexToPushConstants(PipelineShaderConstantsManager *pPushConstantsManager, VulkanPipeline *pUsedPipeline)
Definition: GlslShaderTextureResourceBinding.h:78
static std::variant< std::unique_ptr< ShaderTextureResourceBinding >, Error > create(const std::string &sShaderResourceName, const std::unordered_set< Pipeline * > &pipelinesToUse, std::unique_ptr< TextureHandle > pTextureToUse)
Definition: GlslShaderTextureResourceBinding.cpp:16
virtual std::optional< Error > changeUsedPipelines(const std::unordered_set< Pipeline * > &pipelinesToUse) override
Definition: GlslShaderTextureResourceBinding.cpp:259
static std::optional< Error > bindTextureToShaderDescriptorArray(const std::string &sShaderResourceName, VulkanPipeline *pPipelineWithDescriptors, VulkanResource *pTexture, unsigned int iIndexIntoShaderArray)
Definition: GlslShaderTextureResourceBinding.cpp:121
std::pair< std::recursive_mutex, std::unordered_map< VulkanPipeline *, PushConstantIndices > > mtxPushConstantIndices
Definition: GlslShaderTextureResourceBinding.h:211
virtual std::optional< Error > onAfterAllPipelinesRefreshedResources() override
Definition: GlslShaderTextureResourceBinding.cpp:182
std::pair< std::mutex, std::unique_ptr< TextureHandle > > mtxUsedTexture
Definition: GlslShaderTextureResourceBinding.h:207
virtual std::optional< Error > useNewTexture(std::unique_ptr< TextureHandle > pTextureToUse) override
Definition: GlslShaderTextureResourceBinding.cpp:231
static std::variant< std::unique_ptr< ShaderArrayIndex >, Error > getTextureIndexInShaderArray(const std::string &sShaderResourceName, VulkanPipeline *pPipelineToLookIn)
Definition: GlslShaderTextureResourceBinding.cpp:92
Definition: PipelineShaderConstantsManager.hpp:14
void copyValueToShaderConstant(size_t iShaderConstantIndex, unsigned int iValueToCopy)
Definition: PipelineShaderConstantsManager.hpp:75
std::string getShaderResourceName() const
Definition: ShaderResourceBinding.cpp:11
const std::string sShaderResourceName
Definition: ShaderResourceBinding.h:82
Definition: ShaderTextureResourceBindingManager.h:27
Definition: ShaderResourceBinding.h:86
Definition: VulkanPipeline.h:21
Definition: VulkanResource.h:24
Definition: GlslShaderTextureResourceBinding.h:29
size_t iPushConstantIndex
Definition: GlslShaderTextureResourceBinding.h:56
PushConstantIndices & operator=(PushConstantIndices &&)=default
std::unique_ptr< ShaderArrayIndex > pShaderArrayIndex
Definition: GlslShaderTextureResourceBinding.h:59
PushConstantIndices(size_t iPushConstantIndex, std::unique_ptr< ShaderArrayIndex > pShaderArrayIndex)
Definition: GlslShaderTextureResourceBinding.h:39