Cogs.Core
TransparencyRenderTask.cpp
1#include "TransparencyRenderTask.h"
2
3#include "Rendering/ITextures.h"
4
5#include "Renderer/Renderer.h"
6#include "Renderer/RenderTexture.h"
7#include "Renderer/RenderBuffer.h"
8#include "Renderer/RenderTarget.h"
9
10#include "Renderer/RenderStateUpdater.h"
11
12namespace Cogs
13{
14 namespace Core
15 {
17 {
18 uint32_t allocated;
19 uint32_t width;
20 };
21 }
22}
23
24void Cogs::Core::TransparencyRenderTask::initialize(RenderTaskContext * context)
25{
26 parameterHandle = context->renderer->getDevice()->getBuffers()->loadBuffer(nullptr, sizeof(TransparencyParameters), Usage::Dynamic, AccessMode::Write, BindFlags::ConstantBuffer);
27}
28
29void Cogs::Core::TransparencyRenderTask::apply(RenderTaskContext * context)
30{
31 RenderInstrumentationScope(context->device->getImmediateContext(), SCOPE_RENDERING, "TransparencyRenderTask::apply");
32
33 auto renderTarget = output.get(RenderResourceType::RenderTarget)->renderTarget;
34
35 auto listTarget = output.get("ListBuffer")->renderBuffer;
36 auto nodeTarget = output.get("NodeBuffer")->renderBuffer;
37 auto dataTarget = output.get("DataBuffer")->renderBuffer;
38
39 auto renderer = context->renderer;
40 auto device = renderer->getDevice();
41 auto deviceContext = device->getImmediateContext();
42
43 auto renderList = input.get(RenderResourceType::RenderList)->renderList;
44
45 // setupRenderTarget
46 defaultViewportSize.x = renderTarget->width;
47 defaultViewportSize.y = renderTarget->height;
48 deviceContext->setRenderTarget(RenderTargetHandle::InvalidHandle, renderTarget->depthTargetHandle);
49 deviceContext->setDepthStencilState(renderer->getRenderStates().noWriteDepthStencilStateHandle);
50 deviceContext->setBlendState(renderer->getRenderStates().blendStates[size_t(BlendMode::None)].handle);
51
52 transparencyContext = TransparencyDrawContext{
53 listTarget->buffer,
54 nodeTarget->buffer,
55 dataTarget->buffer,
56 parameterHandle,
57 };
58
59 deviceContext->setBufferCounter(transparencyContext.fragmentNodeBuffer, 0);
60 {
61 MappedBuffer<TransparencyParameters> parameters(deviceContext, transparencyContext.parameterBuffer, MapMode::WriteDiscard);
62
63 if (parameters) {
64 parameters->allocated = static_cast<int>(nodeTarget->bufferSize);
65 parameters->width = renderTarget->width;
66 }
67 }
68
69 permutationIndex = renderer->getEnginePermutations().getIndex("Transparent");
70
71 // mask out change rasterizer state?
72 renderItems(context,
73 renderTarget,
74 renderList,
75 bucketMask,
76 StateChangeFlags::ChangeAll & ~(StateChangeFlags::ChangeDepthStencilState | StateChangeFlags::ChangeBlendState));
77}
78
79void Cogs::Core::TransparencyRenderTask::cleanup(RenderTaskContext * context)
80{
81 context->renderer->getDevice()->getBuffers()->releaseBuffer(parameterHandle);
82}
83
84void Cogs::Core::TransparencyRenderTask::applyMaterial(const DrawContext & drawContext, const RenderItem & item)
85{
86 RenderListTask::applyMaterial(drawContext, item);
87
88 auto deviceContext = drawContext.deviceContext;
89
90 deviceContext->setConstantBuffer("TransparencyParameters", transparencyContext.parameterBuffer);
91 deviceContext->setBuffer("List", transparencyContext.listBuffer);
92 deviceContext->setBuffer("Node", transparencyContext.fragmentNodeBuffer);
93 deviceContext->setBuffer("Data", transparencyContext.fragmentDataBuffer);
94}
@ None
No blending enabled for opaque shapes, defaults to Blend for transparent shapes.
Contains all Cogs related functionality.
Definition: FieldSetter.h:23
@ Write
The buffer can be mapped and written to by the CPU after creation.
Definition: Flags.h:50
@ ConstantBuffer
The buffer can be bound as input to effects as a constant buffer.
Definition: Flags.h:72
static const Handle_t InvalidHandle
Represents an invalid handle.
Definition: Common.h:80
@ WriteDiscard
Write access. When unmapping the graphics system will discard the old contents of the resource.
Definition: Flags.h:103
@ Dynamic
Buffer will be loaded and modified with some frequency.
Definition: Flags.h:30