4#include "../IEffects.h"
6#include "ResourcePointer.h"
7#include "ResourceMap.h"
9#include "Foundation/StringView.h"
12#include <unordered_map>
22 int Release() {
return 0; }
33#include "../Vulkan/CommonVK.h"
35using VkShaderModule = intptr_t;
40 const static uint8_t NoBinding = 0xFF;
42#ifdef COGSRENDERING_GFX_ANNOTATE
43 StringView tryToName(
const StringView filename);
51 name = std::string(str);
56 operator size_t() {
return id; }
66 std::unordered_map<size_t, uint16_t> variables;
69 std::vector<uint8_t> memoryBuffer;
71 std::vector<size_t> offsets;
72 std::vector<size_t> sizes;
93 std::unordered_map<size_t, uint32_t> slots;
94 std::vector<ShaderConstantBuffer> constantBuffers;
96 std::vector<InputAttribute> inputAttributes;
98 std::unordered_map<size_t, uint32_t> samplers;
99 std::unordered_map<size_t, uint32_t> textures;
101 std::unordered_map<size_t, uint32_t> bufferUAVs;
102 std::unordered_map<size_t, uint32_t> bufferSRVs;
104 uint32_t srvSlots = 0;
111 VkShaderModule shaderModule = 0;
125 std::vector<ConstantBufferVariable> variables;
130 enum EShaderType : uint32_t
138 LastShaderType = PixelShader,
139 NumShaderTypes = PixelShader + 1,
140 NumShaderSlots = ComputeShader + 1,
146 enum ESlotType : uint32_t
152 NumSlotTypes = UAV + 1
158 uint32_t values[ShaderType::NumShaderTypes];
159 uint32_t rangeIndex[ShaderType::NumShaderTypes];
164 Bindings slots[SlotType::NumSlotTypes];
180 vertexShader(shaders[ShaderType::VertexShader]),
181 hullShader(shaders[ShaderType::HullShader]),
182 domainShader(shaders[ShaderType::DomainShader]),
183 geometryShader(shaders[ShaderType::GeometryShader]),
184 pixelShader(shaders[ShaderType::PixelShader]),
185 computeShader(shaders[ShaderType::ComputeShader])
192 for (
size_t i = 0; i < ShaderType::NumShaderSlots; ++i) {
193 shaders[i] = other.shaders[i];
196 effectVariables = other.effectVariables;
197 signature = other.signature;
204 for (
size_t i = 0; i < ShaderType::NumShaderSlots; ++i) {
205 shaders[i] = std::move(other.shaders[i]);
208 effectVariables = std::move(other.effectVariables);
209 signature = std::move(other.signature);
214 void buildSignature();
218 Shader shaders[ShaderType::NumShaderSlots];
220 std::unordered_map<size_t, EffectVariable> effectVariables;
290 void initialize(
struct IBuffers * buffers);
297 std::unique_ptr<IIOHandler> defaultHandler;
298 struct IBuffers * buffers =
nullptr;
301 template<
typename StateVariableType,
size_t Slots>
306 bool hasChanged()
const
318 changed = 0xFFFFFFFF;
321 void setChanged(
size_t slot, StateVariableType variable,
bool force =
false)
323 if (variables[slot] == variable && !force)
return;
326 variables[slot] = variable;
327 changed |= 1 << slot;
330 void setAnyChanged(StateVariableType && variable)
332 for (
size_t i = 0; i < Slots; ++i) {
333 if (variables[i] == variable) {
334 setChanged(i, std::forward<StateVariableType &&>(variable),
true);
339 bool getChanged(
size_t slot)
const
341 return (changed & (1 << slot)) != 0;
344 size_t size()
const {
return Slots; }
346 const StateVariableType & operator[](
size_t index)
const
348 return variables[index];
352 StateVariableType variables[Slots] = { 0 };
353 uint32_t changed = 0xFFFFFFFF;
354 uint32_t numChanged = 0;
357 template<
typename T,
size_t Size>
358 inline void decode(int64_t handle, T(&slots)[Size])
360 uint64_t value =
static_cast<uint64_t
>(handle);
362 if ((value == 0) || (value == ~0ull)) {
366 for (
size_t i = 0; i < Size; ++i) {
367 slots[i] = (value >> (i * 8)) & 0xFF;
371 inline uint8_t decode(int64_t handle)
373 uint64_t value =
static_cast<uint64_t
>(handle);
375 if ((value == 0) || (value == ~0ull)) {
378 return static_cast<uint8_t
>(value & 0xffu);
Provides a weakly referenced view over the contents of a string.
Contains all Cogs related functionality.
constexpr size_t hash() noexcept
Simple getter function that returns the initial value for fnv1a hashing.
std::vector< PreprocessorDefinition > PreprocessorDefinitions
A set of preprocessor definitions.
Contains an effect description used to load a single effect.
EEffectFlags
Effect source flags.
IIOHandler * getIOHandler() override
Gets the external I/O handler.
ConstantBufferBindingHandle getConstantBufferBinding(EffectHandle effectHandle, const StringView &name) override
Get a handle to a constant buffer binding, mapping how to bind a constant buffer to the given effect.
BufferBindingHandle getBufferBinding(EffectHandle effectHandle, const StringView &name) override
Get a handle to a buffer binding.
SamplerStateBindingHandle getSamplerStateBinding(EffectHandle effectHandle, const StringView &name, const unsigned int slot) override
Get a handle to a sampler state object binding, mapping how to bind the sampler state to the given ef...
void releaseBufferBinding(BufferBindingHandle bufferBindingHandle) override
Release a handle to a buffer binding.
EffectVariableHandle getEffectVariable(EffectHandle effectHandle, const StringView &name) override
Get a handle to the variable with the given name in the effect with the given effectHandle.
TextureBindingHandle getTextureBinding(EffectHandle effectHandle, const StringView &name, const unsigned int slot) override
Get a handle to a texture object binding, mapping how to bind textures to the given effect.
EffectHandle loadEffect(const EffectDescription &description) final
Load an effect from the given description.
void setIOHandler(IIOHandler *handler) override
Sets an external I/O handler to use for I/O operations.
Provides buffer management functionality.
Provides effects and shader management functionality.