1#include "ProcessTask.h"
3#include "Rendering/IContext.h"
4#include "Rendering/IBuffers.h"
6#include "Foundation/Logging/Logger.h"
10#include "Renderer/Renderer.h"
11#include "Renderer/RenderBuffer.h"
12#include "Renderer/RenderTexture.h"
13#include "Renderer/RenderTarget.h"
14#include "Renderer/RenderList.h"
15#include "Resources/BasicBlueNoiseManager.h"
16#include "Services/Variables.h"
17#include "Systems/Core/EnvironmentSystem.h"
18#include "Systems/Appearance/BasicOceanSystem.h"
19#include "Utilities/ValueVariant.h"
28 const RenderSettings& renderSettings = context->renderer->getSettings();
30 EffectDescription desc{};
32 if (context->context->variables->get(
"renderer.reverseDepth",
false)) {
33 desc.definitions.push_back({
"COGS_REVERSE_DEPTH",
"1" });
37 switch (renderSettings.sRGBConversion) {
38 case RenderSettings::SRGBConversion::Fast:
39 desc.definitions.push_back({
"COGS_SRGB_CONVERSION_FAST",
"1" });
41 case RenderSettings::SRGBConversion::Approx:
42 desc.definitions.push_back({
"COGS_SRGB_CONVERSION_APPROX",
"1" });
44 case RenderSettings::SRGBConversion::Exact:
45 desc.definitions.push_back({
"COGS_SRGB_CONVERSION_EXACT",
"1" });
48 assert(
false &&
"Invalid enum");
53 switch (renderSettings.tonemapper) {
54 case RenderSettings::Tonemapper::Reinhard:
55 desc.definitions.push_back({
"COGS_TONEMAP_REINHARD",
"1" });
57 case RenderSettings::Tonemapper::Filmic:
58 desc.definitions.push_back({
"COGS_TONEMAP_FILMIC",
"1" });
60 case RenderSettings::Tonemapper::ACESLuminance:
61 desc.definitions.push_back({
"COGS_TONEMAP_ACES_LUMINANCE",
"1" });
63 case RenderSettings::Tonemapper::PBRNeutral:
64 desc.definitions.push_back({
"COGS_TONEMAP_PBR_NEUTRAL",
"1" });
67 assert(
false &&
"Invalid enum");
75void Cogs::Core::ProcessTask::addProperty(ProcessTaskProperty& property) {
77 switch (property.definition->type) {
78 case ParsedDataType::Float:
79 property.size =
sizeof(float);
80 alignment =
sizeof(float);
82 case ParsedDataType::Float2:
83 property.size = 2 *
sizeof(float);
84 alignment = 2 *
sizeof(float);
86 case ParsedDataType::Float3:
87 property.size = 3 *
sizeof(float);
88 alignment = 4 *
sizeof(float);
90 case ParsedDataType::Float4:
91 property.size = 4 *
sizeof(float);
92 alignment = 4 *
sizeof(float);
94 case ParsedDataType::Float4x4:
95 property.size = 16 *
sizeof(float);
96 alignment = 4 *
sizeof(float);
98 case ParsedDataType::Int:
99 property.size = 1 *
sizeof(int);
100 alignment = 1 *
sizeof(int);
102 case ParsedDataType::Int2:
103 property.size = 2 *
sizeof(int);
104 alignment = 2 *
sizeof(int);
106 case ParsedDataType::Int3:
107 property.size = 3 *
sizeof(int);
108 alignment = 4 *
sizeof(int);
110 case ParsedDataType::Int4:
111 property.size = 4 *
sizeof(int);
112 alignment = 4 *
sizeof(int);
114 case ParsedDataType::UInt:
115 property.size = 1 *
sizeof(int);
116 alignment = 1 *
sizeof(int);
118 case ParsedDataType::UInt2:
119 property.size = 2 *
sizeof(int);
120 alignment = 2 *
sizeof(int);
122 case ParsedDataType::UInt3:
123 property.size = 3 *
sizeof(int);
124 alignment = 4 *
sizeof(int);
126 case ParsedDataType::UInt4:
127 property.size = 4 *
sizeof(int);
128 alignment = 4 *
sizeof(int);
131 case ParsedDataType::Bool:
132 property.size = 1 *
sizeof(int);
133 alignment = 1 *
sizeof(int);
136 case ParsedDataType::Double:
138 LOG_DEBUG(logger,
"Double not supported in effect parameter yet");
144 if (property.size > 0) {
145 property.offset = alignment * ((constantBufferData.size() + alignment - 1) / alignment);
146 constantBufferData.resize(property.offset + property.size);
147 std::memcpy(
static_cast<void*
> (constantBufferData.data() + property.offset),
static_cast<const void*
>(&(property.floatValue)), property.size);
151void Cogs::Core::ProcessTask::initialize(RenderTaskContext* context)
153 RenderTask::initialize(context);
156void Cogs::Core::ProcessTask::initialize(RenderTaskContext* context,
const RenderTaskDefinition& )
158 RenderTask::initialize(context);
159 this->paramBufferDesc.name =
"EffectParameters";
160 constantBufferData.reserve(1000);
161 constantBufferData.clear();
162 for (
auto &property : properties) {
163 addProperty(property);
165 if (!constantBufferData.empty()) {
167 context->device->getImmediateContext()->updateBuffer(constantBuffer, constantBufferData.data(), constantBufferData.size());
172void Cogs::Core::ProcessTask::cleanup(RenderTaskContext * context)
174 if (effect) context->renderer->getEffectCache().release(context, effect);
175 for (
auto & prop : properties) {
179 prop.expressions.clear();
183void Cogs::Core::ProcessTask::setProperties(RenderTaskContext * renderTaskContext,
Cogs::Core::RenderTexture* targetSource)
186 auto * context = renderTaskContext->context;
187 auto * deviceContext = renderTaskContext->device->getImmediateContext();
189 deviceContext->setBlendState(renderTaskContext->states->blendStates[
size_t(blendMode)].handle);
195 auto effects = renderTaskContext->device->getEffects();
196 paramBufferHandle = effects->getConstantBufferBinding(effect->handle,
"EffectParameters");
200 deviceContext->setConstantBuffer(paramBufferHandle, constantBuffer);
212 for (
auto & p : properties) {
214 switch (p.definition->type) {
215 case ParsedDataType::Float:
216 case ParsedDataType::Float2:
217 case ParsedDataType::Float3:
218 case ParsedDataType::Float4:
219 case ParsedDataType::Float4x4:
220 for (
auto & q : p.expressions) {
221 auto r = scope->update(q.second, (&p.definition->floatValue)[q.first]);
222 if (r != (&p.floatValue)[q.first]) {
223 (&p.floatValue)[q.first] = r;
224 reinterpret_cast<float*
>(constantBufferData.data() + p.offset)[q.first] = r;
230 case ParsedDataType::Int:
231 case ParsedDataType::Int2:
232 case ParsedDataType::Int3:
233 case ParsedDataType::Int4:
234 case ParsedDataType::UInt:
235 case ParsedDataType::UInt2:
236 case ParsedDataType::UInt3:
237 case ParsedDataType::UInt4:
238 for (
auto& q : p.expressions) {
239 auto r = scope->update(q.second, (&p.definition->intValue)[q.first]);
240 if (r != (&p.floatValue)[q.first]) {
241 (&p.intValue)[q.first] = r;
242 reinterpret_cast<int*
>(constantBufferData.data() + p.offset)[q.first] = r;
252 deviceContext->updateBuffer(constantBuffer, constantBufferData.data(), constantBufferData.size());
254 auto basicOceanSystem = context->basicOceanSystem;
255 if (basicOceanSystem && !basicOceanSystem->pool.size()) {
256 basicOceanSystem =
nullptr;
259 auto renderList = input.get(RenderResourceType::RenderList);
260 const EnvironmentComponent * envComp =
nullptr;
262 envComp = renderList->renderList->viewportData->environment.resolveComponent<EnvironmentComponent>();
265 auto binding = renderTaskContext->device->getEffects()->getTextureBinding(effect->handle,
"blueNoise_LDR_RGBA", 0);
267 auto& blueNoiseManager = renderTaskContext->context->blueNoiseManager;
268 blueNoiseManager->enable();
269 TextureHandle blueNoise = blueNoiseManager->getBlueNoiseHandle(
false)->texture;
270 RenderTexture * blueNoiseTexture = renderTaskContext->renderer->getRenderResources().getRenderTexture(blueNoise);
271 if (blueNoiseTexture) {
272 deviceContext->setTexture(binding, blueNoiseTexture->textureHandle);
277 deviceContext->setConstantBuffer(
"SceneBuffer", renderTaskContext->engineBuffers->sceneBufferHandle);
278 deviceContext->setConstantBuffer(
"LightBuffer", renderTaskContext->engineBuffers->lightBufferHandle);
282 for (
auto & p : properties) {
283 bool setSampler =
true;
284 switch (p.definition->type)
286 case ParsedDataType::Texture2D:
288 switch (p.definition->valueHash)
290 case Cogs::hash(
"Cogs.EnvironmentRadiance.NoSampler"):
293 case
Cogs::
hash(
"Cogs.EnvironmentRadiance.SetSampler"):
295 RenderTexture * tex = renderTaskContext->renderer->getRenderResources().getRenderTexture(envComp->radiance);
297 deviceContext->setTexture(p.definition->key, texUnit, tex->textureHandle);
299 deviceContext->setSamplerState(p.definition->key +
"Sampler", texUnit, renderTaskContext->states->getSamplerState(SamplerState::DefaultState()));
305 case Cogs::hash(
"Cogs.SubseaRadiance.NoSampler"):
308 case
Cogs::hash(
"Cogs.SubseaRadiance.SetSampler"):
310 RenderTexture * tex = renderTaskContext->renderer->getRenderResources().getRenderTexture(envComp->subseaRadiance);
312 deviceContext->setTexture(p.definition->key, texUnit, tex->textureHandle);
314 deviceContext->setSamplerState(p.definition->key +
"Sampler", texUnit, renderTaskContext->states->getSamplerState(SamplerState::DefaultState()));
320 case Cogs::hash(
"Cogs.BasicOceanSystem.Real"):
321 if (basicOceanSystem) {
322 RenderTexture * tex = renderTaskContext->renderer->getRenderResources().getRenderTexture(basicOceanSystem->getRealTex());
324 deviceContext->setTexture(p.definition->key, texUnit, tex->textureHandle);
325 deviceContext->setSamplerState(p.definition->key +
"Sampler", texUnit, renderTaskContext->states->getSamplerState(SamplerState::DefaultState()));
330 case Cogs::hash(
"Cogs.BasicOceanSystem.Imag"):
331 if (basicOceanSystem) {
332 RenderTexture * tex = renderTaskContext->renderer->getRenderResources().getRenderTexture(basicOceanSystem->getImagTex());
334 deviceContext->setTexture(p.definition->key, texUnit, tex->textureHandle);
335 deviceContext->setSamplerState(p.definition->key +
"Sampler", texUnit, renderTaskContext->states->getSamplerState(SamplerState::DefaultState()));
340 case Cogs::hash(
"Cogs.BasicOceanSystem.Tangent"):
341 if (basicOceanSystem) {
342 RenderTexture * tex = renderTaskContext->renderer->getRenderResources().getRenderTexture(basicOceanSystem->getTangentTex());
344 deviceContext->setTexture(p.definition->key, texUnit, tex->textureHandle);
345 deviceContext->setSamplerState(p.definition->key +
"Sampler", texUnit, renderTaskContext->states->getSamplerState(SamplerState::DefaultState()));
351 auto inputSource = input.get(p.definition->value);
353 RenderTexture* tex =
nullptr;
354 if (inputSource->type == RenderResourceType::RenderTexture) {
355 tex = inputSource->renderTexure;
356 }
else if (inputSource->type == RenderResourceType::RenderTarget) {
357 tex = inputSource->renderTarget->textures[0];
360 if (tex ==
nullptr) {
363 else if (tex == targetSource) {
367 deviceContext->setTexture(p.definition->key, texUnit, tex->textureHandle);
368 deviceContext->setSamplerState(p.texture.samplerName, texUnit, p.texture.samplerState);
374 case ParsedDataType::Buffer:
376 auto inputSource = input.get(p.definition->value);
379 auto outputSource = output.get(p.definition->value);
381 deviceContext->setBuffer(p.definition->key, outputSource->renderBuffer->buffer);
383 deviceContext->setBuffer(p.definition->key, inputSource->renderBuffer->buffer);
387 case ParsedDataType::ConstantBuffer:
Log implementation class.
bool HandleIsValid(const ResourceHandle_t< T > &handle)
Check if the given resource is valid, that is not equal to NoHandle or InvalidHandle.
constexpr Log getLogger(const char(&name)[LEN]) noexcept
Contains all Cogs related functionality.
constexpr size_t hash() noexcept
Simple getter function that returns the initial value for fnv1a hashing.
@ Write
The buffer can be mapped and written to by the CPU after creation.
@ ConstantBuffer
The buffer can be bound as input to effects as a constant buffer.
static const Handle_t NoHandle
Represents a handle to nothing.
@ Dynamic
Buffer will be loaded and modified with some frequency.